ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Pythonコミュのhs.py

  • mixiチェック
  • このエントリーをはてなブックマークに追加
hsで書いたexeなり.hsなりをpyスクリプト内から呼び出して使う・・
というのの周辺用に、1枚たてさせて下さい!

最近hs使いの友人に触発されて、浮気開始しちゃいましたが
やっぱり酢漬けにも出来るオブジェクトはカワイイです
ただhsの遅延評価は悩ましい存在で
音を屁理屈で合成する時等に
その威力を借りたいと思うに至りました

主にstdout stdin周辺になるのかと思いますが
取り組みの様子を投げてみたいので
手軽な既存ライブラリ等・・オススメが有りましたら
お知恵拝借ヨロです

コメント(16)

a_value = sys.stdout.read(os.system('hascillator frame samp
les_per_cycle')
みたいなイメージだけ有って
これから深入り開始です
コンパイル済exeはサーバ用途への転用も狙いつつも
ローカルではpygameあたりで、手軽に
pc-kbdをhotにするインタらな音マシンを開発したり
CUIから命令送って音の変化を鑑賞するようなのを狙ってます
先々はサーバを持たなくてもgoogle-apps-engineあたりで
何か応用できないかなぁ・・とか
android+jythonで携帯でも? とか
妄想中
えっと....

「hs」 って何?
検索して真っ先にヒットするのは、国際貿易商品の名称と分類を示すコードなんだけど
http://www1.sphere.ne.jp/logistics/dict/HScode.htm
私も.hsで遅延評価というとHaskellかと思ったのですが、
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/haskell/haskell-jp/559
これの逆みたいな話なんでしょうかね?
はい、Haskellです
py本家グイードさんが
「砂糖やら水やら自分で足さなきゃ飲めないレモンライムのよう」
とtweetしてたアレです
最近sidにはhaskell-platfoemってライブラリ管理システムがdeb化されて取り込まれ
Ubuntuでも1004からは入るような噂で
かなり実用が楽になりそうな気配です
オーム社からの翻訳入門本も出ましたね

しかし、逆向きはとっくに2005年に出てたんですね
イチイチ演算結果を1値ごとにstdoutから取得してたんじゃ
スピード的には、期待できないのかもだけど
フラクタル的なものとかに強いかなぁと・・

NetWalkerのARM版Ubuntu904でも
ghcでのコンパイルは出来たので
細かい部品をhsで作り
将来の拡張性を意識しつつ
取り敢えずの全体まとめはpyでってのが
現実的かなぁ・・と、計画してます

MapReduce的なことができると面白いかもしれませんね。
未知の言葉だったので谷歌ってみました
http://ja.wikipedia.org/wiki/MapReduce
には
「関数型言語にて共通して使われる、Map関数とReduce関数からインスパイアされ」
「MapReduceのライブラリ群は、C++、Java、Python 等のプログラミング言語で実装されている」
と有りますね!

「大きな処理」ってのは、意外にキーワードになるかもですね
個別の音を時間軸に並べるようなのとは別な
メロディ、音色、リズムが常時一体のものとして扱うような方法を模索すると
例えば、ネットでのジャムというのも
リアルな世界のバーチャル代用ではなく
楽しい分散処理で音塊を創る・・ってあたりに行き着くかもしれない
結果は翌日podcast配信させるとか・・で

今回のhs.pyも
py側は2引数だけ渡して
音声ファイルの1フレームに入れる値(だけ)を受け取り
激しい演算だけコンパイル済み小物exeで
って思いつきが発端です
MapReduceに便乗できれば
さらなる展開も見えて来るのかなぁ?
カレントディレクトリにghcしたhascillator01に対し

import popen2

wave = []
for frame in range(890, 1010):
wave.append(int(popen2.Popen3('./hascillator01 ' + str(frame)).fromchild.readline()))
print wave

としたら
確かにリストにはなりました
しかし遅い・・っていうか、イチイチ、ファイルオブジェクトを作ってるんですよね?
もっとスッキリしたのは無いかと
subprocess
http://docs.python.org/library/subprocess.html
なんかを読んでみてますが
何だかよく解りません
ファイルオブジェクトというか、プロセス起動しているので、それは遅いでしょう…。そのやり方は設計上根本的に遅いのは仕方がないのかと…。

何が遅いのかは、きちんとプロファイリングしてから結論を出したほうがいいですよ。十分経験を積んである程度予想がつくようになっても、検証するためにプロファイリングはやりますし。
実際に使ったことはなくてよく知らないのですが、

Haskellにもctypesのような機構や、dllを作る方法はありませんか?
C言語を介せばPythonから呼べる気がします。
これだと、数値や配列みたいな単純なものしか渡しにくくなるでしょうけど。
実はコメント12の例の段階で
haskellのスクリプトでは無く
コンパイル済のexecを利用しています
昨日出たubuntu-lucid-a3には
llvmやpython-llvmも入れるのが簡単なので
その路線に少し興味も有るのですが
コンパイルしてあってコレですから
確かにモトモトの構造に無理が有るというか
早めに、陰で鈍足に作業するようなの
例えば1tweet毎にサンプルのフレームに変換するようなのとか
に向かうのが身のためかもしれませんね

execの中でも無限リストを作って
そこから値を1つ取るようなバカな事をやってるので
その影響も有るのかもしれないのですが
たった1個のフレームの値を決めるのに
一瞬毎に変化する広大な全体性との絡みで行われるようなのに取り憑かれています

値のヤリトリは1個だけってのも死守したいので
むしろ、今回暫定的に実現できた例は
あまりに豪華に多数の情報をヤリトリしてるライブラリ(?)を利用してるのが
何だかなぁ・・な、感じです
popen2は、もう古いとpythonに怒られたので
少し変えました
今は
wave.append(int(subprocess.Popen(["./hscillator01", str(frame)], stdout=subprocess.PIPE).communicate()[0]) % 32767)
みたいになってます
stdout=subprocess.PIPE
あたりが意味不明のまま。取り敢えず動いてる感じdeath

ログインすると、残り4件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Python 更新情報

Pythonのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング