ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

2007年9月15日土曜日

PythonでMIDI

当初PyPortMIDIで MIDIコントロールをしようとするも、インストールはできたがインポートでエラーが発生。続いてPyMIDIを試すもモジュールがエラーを発生。しかたがないのでPyObjCでCoreMIDIを使おうと思ったらCoreMIDIはObjective-Cじゃねーじゃねーか。な のでPyObjCから直接アクセスできない。そこでPyMIDIとなぜかおなじ名前でPYMIDIフレームワークというものがあったので、これをダウン ロードしてPyObjCのpathForFramework()でロードしようとするもロードできない。まったく使えない奴らばかりです。

しかたがないので、基本はPythonで書き、CoreMIDIを使う処理だけはObjective-CとCで書いてバンドルとしてまとめ、loadBundle()で読み込んで使うことにした。もはやObjective-Cだけでええやんって話やけど、やはりソースファイルが少なくてすむし、文字列操作らくだし、リンクとかメモリとかあんまり気にしなくていいので。以下、バンドルの作り方とバンドルの読み込み方法。

HelloWorldバンドルの作成:Xcodeでバンドル作成プロジェクトを作成し、プログラムしてコンパイルする

1.XCodeメニューバー>新規プロジェクト>Cocoa Bundle でバンドル用プロジェクト作成
2.XCodeメニューバー>新規ファイル>Cocoa Class でバンドル用ソースファイル作成、追加
3.プログラムを書く(以下例)

// HelloWorld.h
#import <Cocoa/Cocoa.h>

@interface HelloWorld : NSObject {
}
- (NSString *) helloWorld;
@end


// HelloWorld.m
#import "HelloWorld.h"

@implementation HelloWorld
- (NSString *) helloWorld
{
return(@"HelloWorld");
}
@end

以上でコンパイル(Debugモード)すると、プロジェクトディレクトリ内にバンドルファイル
build>Debug>HelloWorld.bundle
ができている。さらに、このHelloWorld.bundleをPythonで使うには、PyObjCを使って、
モジュールとしてインポートできるようにするための、HelloWorld.pyが必要となる。以下HelloWorld.bundleを利用する例。

HelloWorldバンドルの利用方法:

必要なファイル:
HelloWorld.bundle:XCodeで作成したObjective-Cによるバンドルファイル
HelloWorld.py:HelloWorld.bundleをモジュールとして扱えるようにするpythonコード
HelloWorldTest.py:実際に動作チェックする用のpythonコード


1.HelloWorld.bundle用モジュールファイルHelloWorld.pyを作成
-----------------------------------------------------------------------------------------
#HelloWorld.py
from Foundation import NSBundle
import objc

bundle = NSBundle.bundleWithPath_(u'./HelloWorld.bundle')
bundleID = bundle.bundleIdentifier()
objc.loadBundle('HelloWorld', globals(), bundle_identifier=bundleID)
-----------------------------------------------------------------------------------------
NSBundle.bundleWithPath_ (パス名)でNSBundleのインスタンスとして、パスのバンドルを生成できる。ただしこの時点ではバンドル自体はまだロードされていない。 bundle.bundleIdentifier()でバンドルのIDを取得。これを使って、obj.loadBundle()でバンドルをロードされ、 HelloWorldバンドルがpythonのモジュールとして扱えるようになる。


2.動作確認用HelloWorldTest.pyを作成
-----------------------------------------------------------------------------------------
#HelloWorldTest.py
import HelloWorld

helloworld = HelloWorld.HelloWorld.alloc().init()
print helloworld.helloWorld()
-----------------------------------------------------------------------------------------
HelloWorld モジュールをインポートする。例ではバンドルはObjective-CによるHelloWorldクラスであり、HelloWorldクラスは NSObjectを継承しているので、alloc()でメモリを確保し、init()で初期化しインスタンス生成。インスタンスメソッド helloWorld()を呼び出すと、"HelloWorld"の文字を返す。

2007年9月11日火曜日

XCode x Python2.4

XCodeとPython2.4による開発。
いきなりビルドできないので調べると以下のブログで解説してくれていました。助かりました。
一応こちらにもメモ。

XCodeでPython2.4を使う
プロジェクト>アクティブターゲットを編集>ビルドツール
にpython実行ファイルのパスを設定。


参考:http://d.hatena.ne.jp/smellman/20061125/1164456168

2007年9月8日土曜日

wxPythonイベント関係のまとめ1

wxPythonはがんばっていると思うが、イベント処理がまだ不満ではある。
特にWindow, Frame, Panel, Controlのフォーカスとイベントの関係がわかりにくい。

MouseEvent (EVT_LEFT_UP, EVT_LEFT_DOWN, 他)マウスイベントはマウスがヒットした最前面のオブジェクトからイベントが発生する。
よくある作りでは、オブジェクトがApp - Frame - Panel - Controlの階層で配置されることが多いが,
MouseEventは上記でいうと右から順番にマウスが当たっているかどうか判断すし、当たっていたらイベントを発生させる。ちなみに、マウスクリックをしたオブジェクトは必ずしも即座にフォーカスがセットされない。例えば別のウィンドウから別のウィンドウのパネルをクリックしたとしても、パネルがフォーカスされない場合がある。なぜかはわからない。
ちなみにドラッグなどの操作をしたい場合に、window.CaptureMouse()を実行すると、window.ReleaseMouse()が発生されるまで、マウスイベントがwindow宛に送られる。これによってウィンドウ外などへマウスが逃げても処理が実行できるようになる。
window.ReleaseMouse()はキャプチャしていたマウスを見失った状態で呼ぶと例外が発生するので、
window.HasCapture()とセットで使うと良い。

KeyEvent(EVT_KEY_UP, EVT_KEY_DOWN, 他)キーイベントは現在フォーカスが当たっているオブジェクトからイベントが発生する。キーイベントをバインドする際に、このフォーカスが曲者である。
マウスクリックやTABキーなどでころころフォーカスが変わるのだが、
特にwx.Panelなどにバインドする際は注意が必要である。
wx.Panelでデフォルトで設定されているwx.TAB_TRAVERSALというスタイルがあり、これはTABキーでフォーカスを移動させていく。TextCtrlで移動するのはわかるが、デフォルトのままにしておくとパネルのフォーカスも順に移動してしまう。このため、ある一つのパネルにイベントハンドラをバインドしていても、動いたり動かなかったりするように見える。styleからwx.TAB_TRAVERSALを任意ではずすと、TABキーを押しても別のオブジェクトへフォーカスは移動はしない。

Skip()の意味Skip()は、イベントを受け取ったオブジェクト内で、他のプロセスイベントを探しに行く。例えば

self.button = wx.Button(self, -1, "Button")
self.button.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)

def OnLeftDown(self, event):
event.Skip()

とあったとすると、このSkip()は次に何を探しにいくかと言うと、同じself.buttonオブジェクトでEVT_LEFT_DOWN以外のマウスに関連するイベント(=EVT_BUTTON)を探しにいく。
なので基本的に他のオブジェクトのイベント発生には直接関係がない。wxPython in Actionの解説では、
self.buttonの親を遡ってイベントを探しに行くと成っているが、よくわからない。
ただイベントが発生したオブジェクトから順に関係のあるオブジェクトを通り、イベントハンドラがバインドされているところでは必ずSkip()を設定しておくと、最終的にはwx.Appまで通知は行くようだ。
(self.buttoが、app.frame.panel.buttonという関係だとすると、Skip()を続ければbutton>panel>frame>appと順に通知が行きそうなものだが、そうではないようだ。Propagationというのも関係がありそうだが、もう少し調査することにする。)

2007年8月29日水曜日

必ず入れたいPython関連のインストール手順

基本的にバイナリがなく、ソースコードからインストールする場合は、
ほどんどの場合setup.pyが含まれており、

$ python setup.py install

でインストールが可能。最近のものではez_setup.pyでさらに簡単になっているものもある。

チェック環境:MacOS10.3.9, Python 2.4.4, XCode1.5 (gcc 3.3)
--------------------------------------------------------------------------------------------------------------------

wxPython 2.8.4.2
wxWidget(旧wxWindow)のPythonラッパー。OS標準のUIによってウィンドウを配置、
コントロールできる。

インストール
バイナリパッケージがあるので、解凍してインストーラからインストール

公式サイト:http://www.wxpython.org/
ダウンロード:http://sourceforge.net/project/showfiles.php?group_id=10718
ドキュメント:http://www.wxpython.org/docs/api/


PyOpenGL 3.0.0a6
OpenGLのPythonラッパー。2Dおよび3Dイメージの操作が可能になる。

インストール
ターミナルから
$ python setup.py install

あるいはPyOpenGL-3.0.0a6/documentaion/using.htmlに記載されているように、
ez_setup.pyをダウンロード後に下記コマンドを実行(※)
$ sudo easy_install PyOpenGL

公式サイト:http://pyopengl.sourceforge.net/
ダウンロード:http://sourceforge.net/projects/pyopengl/
ドキュメント:http://pyopengl.sourceforge.net/documentation/manual/
NumPyとの連携に関するドキュメント:http://pyopengl.sourceforge.net/context/numeric_arrays.html


NumPy 1.0.3.1
線形代数、多次元配列などの計算を行うモジュール。

インストール
ターミナルから
$ python setup.py install

公式サイト:http://numpy.scipy.org/
ダウンロード:http://sourceforge.net/project/showfiles.php?group_id=1369&package_id=175103
ドキュメント:http://numpy.scipy.org//numpydoc/numdoc.htm


pySerial 2.2
デバイスとシリアル通信を行うモジュール

インストール
ターミナルから
$ python setup.py install

公式サイト:http://pyserial.sourceforge.net/
ダウンロード:http://sourceforge.net/project/showfiles.php?group_id=46487&package_id=39324
ドキュメント:http://pyserial.sourceforge.net/


py2app 0.3.6
PythonをMacの実行ファイルにする。

インストール

ターミナルから
$ python setup.py install

あるいはドキュメントのInstallの解説よりez_setup.pyをダウンロードして自動インストール(※)
$ curl -O http://peak.telecommunity.com/dist/ez_setup.py
$ sudo python ez_setup.py

公式サイト:http://undefined.org/python/#py2app
ダウンロード:http://cheeseshop.python.org/pypi/py2app/
ドキュメント:http://svn.pythonmac.org/py2app/py2app/trunk/doc/index.html


PyObjC 1.3.7
PythonからObjective-Cへの操作を橋渡しする。

インストール
バイナリパッケージがあるので、解凍してインストーラからインストール

公式サイト:http://pyobjc.sourceforge.net/
ダウンロード:http://pyobjc.sourceforge.net/software/
ドキュメント:http://pyobjc.sourceforge.net/doc/index.php


PyPortMidi 0.0.3
PyPortMidiはBarry Vercoe, John Harrisonという人によるPortMidiのラッパーである。
PortMidiはMortMusicというクロスプラットフォーム音系APIの一部である。
PyPortMidiは やや古いようで、どこかのサイトで最新のコンパイルされたPortMidiは使えないと書いてあった。
PyPortMidiに予めコンパイルされているlibportmidi.aをそのまま使えば良い。
インストールはちょっと修正が必要。

インストール
1.Pyrexのインストール
PyPortMidiはPortMidiのラップにPyrexという拡張モジュールを使用している。
PyrexというのはPythonとC言語を混在させてプログラムできるもの(らしい)
PyPortMidiをビルドするために、これを入れておく必要がある。

2.PyPortMidiディレクトリ内のpypm.pyxファイルの修正
通常であればPyrexインストール後python setup.py installでいけるのだが、
途中でエラーが発生。pypm.pyxファイル内、357行目がブーリアンとして認識できないとと出たので、
while(Pm_Poll(self.midi)): を
while(bool(Pm_Poll(self.midi))):と無理矢理直す。

3.$ python setup.py install で無事インストール

公式サイト:http://alumni.media.mit.edu/~harrison/code.html
ダウンロード:http://alumni.media.mit.edu/~harrison/code.html
ドキュメント:PyPortMidiのドキュメントはない。PortMidiのドキュメントを見ろということだろう。
PortMusic公式:http://www.cs.cmu.edu/~music/portmusic/index.html
PortMidi: http://www.cs.cmu.edu/~music/portmusic/portmidi/
PortAudio: http://www.portaudio.com/
PortMidドキュメント: http://www.cs.cmu.edu/~music/portmusic/portmidi/portmidi.h


※ Pyrex 0.9.5
Pythonの書式でCのライブラリをラッピングし、PythonのC拡張モジュールが作れるというめちゃくちゃなアプリ。

インストール

ターミナルから
$ python setup.py install

Pyrex公式:http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
ダウンロード:http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
ドキュメント:http://ldots.org/pyrex-guide/


※ setuptools インストール
使用するPythonのバージョン系にあわせてsetuptoolsをダウンロード後ターミナルから
$ setuptools-0.6c4-py2.4.egg

公式サイト:http://cheeseshop.python.org/pypi/setuptools
ダウンロード:http://cheeseshop.python.org/pypi/setuptools/#cygwin-mac-os-x-linux-other
ドキュメント:http://peak.telecommunity.com/DevCenter/setuptools

2007年8月27日月曜日

py2appの使用方法

$ py2applet --make-setup test.py
$ rm -rf build dist
$ python setup.py py2app -A
$ open ./dist/test.app

1行目:py2appletでsetup.pyを自動生成、引数でメインとなるファイルを指定(例ではtest.py)
2行目:コンパイルした際に生成されるbuild, distフォルダを予め削除
3行目:生成されたsetup.pyにpy2app -Aを引数に実行。エラーがなければ実行ファイルができる。-Aはエイリアスモードでコンパイル。
4行目:ターミナルから起動。ファイルをダブルクリックしても良い。

※外付けハードディスク(FAT32)からはos.symlink()でエラーが出る。

参照:
http://svn.pythonmac.org/py2app/py2app/trunk/doc/index.html#tutorial