以前まではXlibを使ったGUIアプリケーションを作っていました。
何故GTKやQTではなくXlibだったのかというと、XWindowシステムのプロトコルについての理解をする為でした。単に線を引いたり、円を描いたり、文字列を映したり、ただそれだけのことをするのにもXlibではちょっと面倒くさいくらいコードを書かなくてはなりません。
しかし低水準であるがゆえに、Xプロトコルを生に体感することが出来ます。
Xサーバーとのコネクト
ウィンドウの生成
ウィンドウのマッピング
グラフィックコンテキストの取得
グラフィックコンテキストを使った描画処理
受信するイベントの指定
イベントを受け取った後の処理
ざっと思いついたのはこれぐらい。他にもあったかな?
最近はXlibとOSS(Open Sound System)APIを使ってピアノを作っていました。
流れとしては以下のもの
1 鍵盤のウィンドウを生成する(1オクターブ分)
2 マウスクリックのイベントを受信するようにする。
3 マウスクリックのイベントが発生する。
4 イベントが発生したウィンドウ(鍵盤)はどれ?
5 押された鍵盤に合わせて、特定の周波数を自分で作ったsound関数に投げる
ラならば440を引数に渡す
6 sound関数の内部処理としては、openシステムコールでデバイスファイルをオープンする
ioctlシステムコールでサウンドデバイスファイルの受け取る値のフォーマットを再定義する。
符号付き、符号なしの16bitとか。
そしてサンプリング周波数(1秒間で何度値を取得するか)の指定
内部では、音を出力する時間×16bit×サンプリング周波数分のバッファーを用意して
周波数が渡されて来たらsin関数を使ってサイン波を表現し、サンプリング周波数の一瞬一瞬の
サイン波の値×16bitの表現できる最大値
をすることで、16bitの振幅の波が生成され、値を随時デバイスファイルにwriteしていきます。
これによってスピーカーを通して、音が出力されます。
とりあえず、こういうのをメインループで回しとけば簡易ピアノの出来上がりというわけです。
とまぁ作ったはいいけど、実はこれ問題点だらけ。
1 まず一つの音を出している間、他の処理が出来ません。
2 和音が出せません。
3 僕の作った波形は純音の波形というもので波形がすごくきれい。ホントの楽器は波形が若干歪ん でいます。要はピアノの音が出せない。
1の問題に関してはforkを使うなりしたらいいのではないかーと思うんですけど、改善には至っていません。その他の問題に関してはあきらめ気味。プログラムで音を作るんじゃなくて、直接音源拾ってきて再生する方が現実的かもね。
とまぁ、こんなプログラムを作っていたのですが。
僕の研究はピアノを作ることが目的ではなく、空間映像に適したインタラクションシステムの開発なのです。空中に浮遊した映像を操作するというシステムのことなのですが
Xlibで二次元図形を作ってちまちま操作するのはどうもかっこわるいし、しかもせっかくの空間映像を
生かしきれてない。
せっかくだから三次元図形を操作するアプリケーションにした方がかっこいいよね?
というわけでOpenGLの登場というわけです。
OpenGLはシリコングラフィックス社の主導で開発された、ハードウェアやOSに依存しないグラフィックライブラリです
これは図形表示機能を持つコンピュータのグラフィックス・ハードウェアを、ソフトウェアで制御するために使います。三次元図形の表示に高い性能と機能を発揮します。
つまりこれさえあれば、3Dの空中映像を触って操作出来るようになるわけです。
とまぁOpenGLに行き着いた経緯はここまで。
今はボチボチプログラム作ってるとこなので、完成したらまた報告するかもね。
何故GTKやQTではなくXlibだったのかというと、XWindowシステムのプロトコルについての理解をする為でした。単に線を引いたり、円を描いたり、文字列を映したり、ただそれだけのことをするのにもXlibではちょっと面倒くさいくらいコードを書かなくてはなりません。
しかし低水準であるがゆえに、Xプロトコルを生に体感することが出来ます。
Xサーバーとのコネクト
ウィンドウの生成
ウィンドウのマッピング
グラフィックコンテキストの取得
グラフィックコンテキストを使った描画処理
受信するイベントの指定
イベントを受け取った後の処理
ざっと思いついたのはこれぐらい。他にもあったかな?
最近はXlibとOSS(Open Sound System)APIを使ってピアノを作っていました。
流れとしては以下のもの
1 鍵盤のウィンドウを生成する(1オクターブ分)
2 マウスクリックのイベントを受信するようにする。
3 マウスクリックのイベントが発生する。
4 イベントが発生したウィンドウ(鍵盤)はどれ?
5 押された鍵盤に合わせて、特定の周波数を自分で作ったsound関数に投げる
ラならば440を引数に渡す
6 sound関数の内部処理としては、openシステムコールでデバイスファイルをオープンする
ioctlシステムコールでサウンドデバイスファイルの受け取る値のフォーマットを再定義する。
符号付き、符号なしの16bitとか。
そしてサンプリング周波数(1秒間で何度値を取得するか)の指定
内部では、音を出力する時間×16bit×サンプリング周波数分のバッファーを用意して
周波数が渡されて来たらsin関数を使ってサイン波を表現し、サンプリング周波数の一瞬一瞬の
サイン波の値×16bitの表現できる最大値
をすることで、16bitの振幅の波が生成され、値を随時デバイスファイルにwriteしていきます。
これによってスピーカーを通して、音が出力されます。
とりあえず、こういうのをメインループで回しとけば簡易ピアノの出来上がりというわけです。
とまぁ作ったはいいけど、実はこれ問題点だらけ。
1 まず一つの音を出している間、他の処理が出来ません。
2 和音が出せません。
3 僕の作った波形は純音の波形というもので波形がすごくきれい。ホントの楽器は波形が若干歪ん でいます。要はピアノの音が出せない。
1の問題に関してはforkを使うなりしたらいいのではないかーと思うんですけど、改善には至っていません。その他の問題に関してはあきらめ気味。プログラムで音を作るんじゃなくて、直接音源拾ってきて再生する方が現実的かもね。
とまぁ、こんなプログラムを作っていたのですが。
僕の研究はピアノを作ることが目的ではなく、空間映像に適したインタラクションシステムの開発なのです。空中に浮遊した映像を操作するというシステムのことなのですが
Xlibで二次元図形を作ってちまちま操作するのはどうもかっこわるいし、しかもせっかくの空間映像を
生かしきれてない。
せっかくだから三次元図形を操作するアプリケーションにした方がかっこいいよね?
というわけでOpenGLの登場というわけです。
OpenGLはシリコングラフィックス社の主導で開発された、ハードウェアやOSに依存しないグラフィックライブラリです
これは図形表示機能を持つコンピュータのグラフィックス・ハードウェアを、ソフトウェアで制御するために使います。三次元図形の表示に高い性能と機能を発揮します。
つまりこれさえあれば、3Dの空中映像を触って操作出来るようになるわけです。
とまぁOpenGLに行き着いた経緯はここまで。
今はボチボチプログラム作ってるとこなので、完成したらまた報告するかもね。