objective-cをちょい研究!ブログ -40ページ目

objective-cをちょい研究!ブログ

WILLCOMを卒業してiOS開発者に転身しました。。
コメント&トラックバック大歓迎です。

既にギターソフトが無いか検索してみたところ、画面タッチができるDSとiPod touch用にはやっぱりありました。


<PocketGuitar>
画面の弦を本物のギターのように指で押さえて音を鳴らすみたいです。
マルチタップできるiPod touchならではですね。


http://d.hatena.ne.jp/kstn/20080119
iPod touch でギター(kstn様)


<M-06>
こちらは市販製品です。上の画面でコードを選んで、下の画面に出ている弦を弾くみたいです。


http://www.dsguitar.net/
弾いて歌えるDSギター


<課題1 機種を判別する>
esとアドエスで音量や聞こえ方がかなり違うので、機種ごとにチューニングできるようにしたい。
APIのSystemParameterInfo関数でSPI_GETOEMINFOを指定してあげると、機種情報が取得できるらしい。


http://www.jurabi.jp/blog/?p=15
Windows Mobileの機種依存処理の共通化(1)(Urabi様)


<課題2 画面タップ音のオフ>
画面タップ音を有効にしていると、弦をはじくときにタップ音も鳴ってしまう。


<課題3 ギターコードの選択方法>
今のところメジャーコードのC~Bを数字キーに割り当てているが、マイナー、メジャー7…とかなりあるので全てに対応するのは無理である。
キーボードを6弦に見立てて指で押してもらうことも考えたが、3列しかないアドエスではレイアウト的にも微妙だし、同時に3つのキー押下しか認識できない問題もある。


<課題4 PCM音源かFM音源か>
やっぱり音をもう少し何とかしたい。
音源の方向性だが、ギター音のWAVEファイルを用意して鳴らすか、FM音源のように音を生成できるようにするか。

今日は祝日。時間もあるので、前々から考えていた画面タッチで演奏するギターの製作に取り掛かりました。エアギターならぬウインドウギターです(^^;
ギターなんて学生時代に2週間ほど友達に借りて練習したことがある程度なので、コードから調べなおし。
減衰系の音にしてみましたが、ギターとはほど遠い音です。正弦波だと低い音が出にくいのでキーは高めです。


こちらでコードの勉強させてもらいましたm(_._)m
http://www.takesan.com/guitar/guitarchord2.htm
その三 ギターコード(GUITAR口座初心者向け様)


コードの音階変換はこちらの一覧表を利用させてもらいました。
http://guiterboys.livedoor.biz/archives/8658343.html
ギターコード一覧表(Guitar Boys様)


音色の調査用に作ったテストプログラムの公開です。
正弦波と方形波の選択と、エンベロープ周期の設定ができます。


DLLとEXEファイルを適当なフォルダに置いてください。基本的な使い方はエスメロディキーボードと同じです。
ソースは付いてませんが、DLL用のC++とVBのヘッダーを同梱してます。
プログラマーさんで見てる人はいるのかな?。ソースはごちゃごちゃしたままなので、そのうち整理して公開します。
http://www.ne.jp/asahi/phs/phs/blog/midi080320.lzh


音色テスト

<画面の説明>
音色=6種類の音色から選択できます。方形波だと音がでかいので注意!
音量=8段階で設定できます(16~127)
音量(ベース)=音量と同じ。


エンベロープの設定は、現在選択中の音色に反映されます。
AT=アタックタイム(ms)
AL=アタックレベル(0~32767) 32768以上も設定できますが、振幅のオーバー分がカットされるだけです。
DT=ディケイタイム(ms)
SL=サスティーンレベル(0~32767)


リリースタイムは面倒なので、当分見送りです。


esだとコントロールにフォーカスがあるとキー入力が取得できない(コントロールごとに処理を書けば可能ですが)ので、画面余白タップで画面にフォーカスを移してください。
設定をごちゃごちゃやっているうちに音が止まらなくなったときは、画面の縦横を切り替えれば音が止まります。

<課題1 波形を正弦波に変える>
とりあえず音の波形を正弦波に変えて見たんですが、どうしても雑音が入ってしまう。
正弦波の振幅の計算にsin関数を使ってたんですが、どうやらこの関数で時間がかかってたみたい。
まぁ、サンプリングレート16Kで3和音鳴らしたら、1秒間に48000回も計算してるんだから遅くなるのも当然か。
Sinの値をあらかじめ配列に入れておいて、Sinの計算時は配列を読み出すようにしたら、スピードアップしたみたいで雑音が入らなくなった。

ただ、正弦波にすると低音が小さくなってしまう。


<課題2 エンベロープ周期に対応する>
経過時間による音の音量変化です。以下の4つに対応すればいいみたい。

アタックタイムで立ち上がり時間を設定したら、アコーディオンやフルートっぽい音は出るようになった。


・アタックタイム
ノートオンしてから音量が最大になるまでの時間。
この最大値がボリュームで指定した値になる。


・ディケイタイム
最大音量から少し下がって一定音量に下がるまでの時間。
ページによってはこの下がり具合が曲線になっているんだが、計算方法が見当たらない。


・サスティンレベル
一定音量のレベル。


・リリースタイム
ノートオフしてから音量が0になるまでの時間。


http://www.uyouyo.com/gallery/synthedit/manual/midi_implementation.html
音量エンベロープについて(MIDI インプリメンテーション様)

音の波形を正弦波に変更してみたが、雑音が入って綺麗な音にならないので、トレースを取るべくデバッグ出力する方法を調べてみた。


<出力ウインドウに出力する方法>
デバッグ→ウインドウ→出力で出力ウインドウを表示できる。

wchar_t wBuf[256];


wsprintf(wBuf, _T("Debug Test %d\n"), 100); //出力する文字を作成(Unicode)
OutputDebugString(wBuf);


出力ウインドウに出力する方法だとものすごく遅くて抜けが出てしまうので、ファイル出力する方法に急遽変更。


<ファイルに出力する方法>
マルチバイトコードでdebug.txtファイルに出力される。

#include <fstream>
using namespace std;


char cBuf[256];

ofstream fout("debug.txt");


sprintf(cBuf, "Debug Test %d\n", 100); //出力する文字を作成(マルチバイト)
fout << cBuf;