2010/12/17

Javaでクロマチックアコーディオンのソフト鍵盤 2

Chromatic Accordion Java Applet
上記アプレットはダミーです。最新のアプレットはこっちのページで公開してます。
クロマチックアコーディオンのJava Appletです。とりあえず動くところまで作ってみたのでアップしてみた。アプレット内を一度クリックすると、PCキーボードのキーを押すたびに音が出る。

JIS配列のキーボードを想定。位置は押して確認してみて。
キーボード入力のみ。マウスクリックでは音は出ない。
音色はPCのデフォルトMIDI音源でアコーディオン固定。
オクターブ変更はボタンをクリックすると1オクターブ上がる。

問題点
起動直後はもたつく。

あまりガンガン弾くと、音が鳴りっぱなしになってアプレットがフリーズするときもあるので注意。そういうときはブラウザを再起動してください。

Linuxだとキーイベントがうまく取れずに、音がちゃんと出ない可能性大(未確認)。

音がやや遅れて出る。ゆっくり弾く分にはそれほど問題はない。

キーボードのハード仕様によって、同時に押せるキーの組合わせに制限がある場合がある。USB接続のキーボードの場合は同時発音数は6音まで。

意外と弾けるかも
ちゃんと練習すればパソコンのキーボードでも、そこそこ弾けそうな予感。ピアノ配列よりも相性がよいと思えた。

プログラミングについて
知識もないまま無理やり作ったアプレット。参考になりそうなサンプルもなかったので、API仕様を読みながらひとつずつ組み上げたかんじ。かなり混沌としたソースになってしまった。

苦労した部分。まずキーを押している間だけ音を出すというところ。パソコンのキーボードは押し続けると、「rrrrrrrrrr」のように連続して押していると認識してしまう。MIDIでこの情報をそのまま送ると、同じ音がガンガン重なってしまう。この解決方法としては、音が出ているかどうかフラグを立てることで認識させて、一度音を出したら、その音は出さないようにした。当たり前の方法なのかもしれないがプログラムとして機能させるまで時間がかかった。

GUI関連はやっぱり面倒くさい。ソースが長くなるのはGUIやグラフィックがあるから。グラフィックなしなら1/3ぐらいの時間で完成すると思う。発音した音をグラフィックに反映させる部分も試行錯誤だった。誰かのサンプルの真似で何とかなるのなら楽なのだが、API仕様片手にうまく行く方法を探ったので効率が悪かった。結局、発音している音の配列を作って一時的に溜めることにした。グラフィックをrepaintする際に配列を読んで反映させている。

PCキーボードとクロマチックアコーディオンのキー配列との対応について。両方ともキーの数がそれなりのあるので、if文やswitchで一つ一つ対応させるとソースがやたら長くなるし修正がやりにくい。そこでJavaの配列を使って各キーや音を登録。その配列の組み合わせを変更できる仕組みにした。今回はクロマチックアコーディオンの配列だが、他の配列にも簡単に移行できるメリットがある。

日本語入力を無効にする。コンポーネントに対して以下のようにすると、そのコンポーネントではIMEが無効になる。
button.enableInputMethods(false);

アンチエイリアスをかけることで、ギザギザにならず滑らかなグラフィックにすることができる。
g.setRenderingHint
(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

プログラムサイズは14KB。Javaで作ると小さくていい。まぁ巨大なJava本体がある恩恵ではあるのだが。

つづき
Javaクロマチック アコーディオン ソフト鍵盤 3