MIDI Chord Helper の更新・その後

前回のこのブログの記事で書いたGugen応募の件ですが、2年前と違って今回はノミネートすらされず。
原宿での作品展とか渋谷での授賞式とかうーん行こうかどうしようといいながらも、寒かったしちょっと遠い割には自分が展示するわけじゃないし面倒になってしまい結局全然行かず、元になったJavaアプリのほうの MIDI Chord Helper のバージョンアップばかりやってた気がします。

さて、ここからが本題。
1ヶ月ほど前の記事でeclipse入れたことなど書きましたが、ここにきて MIDI Chord Helper のMIDIエディタ部分を中心にリファクタリングして修正しやすくしたうえで、細かいところをいろいろ改善しました。主なものはこんな感じ:

【MIDI Editor 関連】
ボタンの整理。今までプレイリストの下にあったプレイボタンと Load to Sequencer ボタンをプレイリストの中に入れ、プレイボタンや現在位置「分:秒」の空いてるセルをダブルクリックするだけでシーケンサーに選択させることができるようになり、直感的でわかりやすくなりました。
それと同時に、MIDI同期モードのマスター/スレーブのそれぞれについてモード切り替えを行うコンボボックスを追加しました。これはもともと javax.sound.midi でサポートされている機能だったので比較的容易に実装できました。が、Windows7だとモードが1つしか選べず、実質的に機能していないも同然だったりします(他のシステムだと選べたりするんでしょうかね…?選べたっていう人がいたらぜひお知らせください)。

イベント編集ダイアログを開いている最中に表の選択が変わったときに、それに変に追従していたのを、ダイアログを開いたときに決めた箇所に反映するようにしました。

セル幅も選択が変わるたびに等幅に戻ったりしていた現象も直りました。これはテーブルビューが対象とするテーブルデータモデル(例:曲、トラック)が切り替わるたびにその都度内部でテーブル列モデルを作り直すという javax.swing.JTable のデフォルトの動作が原因だったので、テーブル列モデルをテーブルデータモデルに合わせて一度作ったらもう作り直さないよう、JTable のメソッドを setAutoCreateColumnsFromModel(false) として呼ぶようにしました。

Base64変換ダイアログも、曲を選択していないと開けなかったりしましたが、よく考えたらそれでは新しい曲を空のプレイリストに追加できないことに気づいて修正しました。

【アプレットのときだけ発生する問題】
アプレットとして実行したときに、タイムスライダーをちょっと戻すなどの操作をしないと再生音が出なかったり、曲が終わっても次の曲に行かずに秒数をカウントアップし続けるといった現象が出ていて、まだ原因がわかっていない状況です。これもそのうち直したいのですが…今のところめどが立っていない状況(原因さえわかれば直りそうな気もしますが…)

【あの楽器】
MIDI Chord Helper には、初音ミクのあの楽器みたいな図形の広がりを表示する機能がついていますが、MIDI演奏中に頻繁にノートONがやってきたときなど、たまに java.util.ConcurrentModificationException という例外が投げられることがありました。原因は表示中の図形が何であるかを覚えておくキューが別スレッド(paint() と javax.swing.Timer の実行は別スレッド同士とみられる)で同時にイテレータを操作したことで反復処理の衝突が起きたのが原因でした。イテレータだけを別々にしても直らず、結局キューにアクセスする複数の箇所を全部 synchronized で囲んで排他制御することで対応しました。

MIDI Chord Helper のページはこちらです。ソースやダウンロードのページにもここから行けるようになっています。久々に新しくなった MIDI Chord Helper をぜひお試しください。電子楽器CAmiDionの発想の元になったJavaアプリで、これだけでもマウスでコード演奏して遊べます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です