ここ2ヶ月ばかりのコーディング活動

近況報告ネタ(?)

毎日仕事もせずにのんべんだらりと暮らしています。ではなくて。前回の音楽技術アドベントカレンダーの後、特に表に出せるアウトプットがあったわけではないのですが、ここ1.5ヶ月くらいの間(履歴上は2ヶ月追ってるけど12月は旅行とACに吸い込まれがち)、自作のMIDI関連ツールを割とがしがし更新していました。おかげで(と自分で書くのも何ですが)MMLの打ち込みはかなり快適になりました。

これ全部まとめたら結構な新機能紹介リストになるな…?と思ったので、git上の履歴からリストアップしてみました:

  • managed-midi
    • GeneralMidiクラスに楽器カテゴリと楽器名のリストを追加
    • MidiModuleDatabase
      • ポート名からのマッチング処理を追加
      • ドラムマップのサポートを追加(データをdomino楽器定義リストから追加インポート)
    • Xamarin.MacなしでもCoreMIDIを使えるようなIMidiAccess実装を追加(ongoing)
      • 動作確認に使っているSC-8820がMojaveで使えないので先に進めない
    • MidiPlayerの大改修
      • ロードしたSMFをいったんformat 0に変換してから処理するようにした
      • 任意の位置にジャンプして再生する機能を追加(マーカージャンプ用)
      • チャンネルマスク機能の追加(ミュート再生、ソロ再生)
  • xmmk
    • プログラムチェンジが全く機能していなかったのを修正(そう、このレベルからの改善)
    • ピアノモードとクロマトーンモードを実行時に切り替えられるようにした(以前は#if ... #endifだった)
    • トランスポーズ機能を追加(カーソル左右でキーを変更)
    • keydown/keyupでちゃんと鳴らしている音が分かるようにボタンUIに反映(これまでしていなかった)
    • バイスセレクタをメニューからComboBoxへ
    • MMLパッドの追加。演奏した内容がMMLとして記録されるようになった。
      • 同時押しはc0e0gのように和音表記になり、アルペジオc&e&gのようになる(ざっくりmugene互換)
    • クロマトーンモードでオクターブがカーソル上下でいい感じに上げ下げできるよう修正(ピアノと同じ挙動だとイマイチだった)
    • PCキー配列でJP106を選択したら記号キーまで演奏できる範囲にした(開発当初はそうなっていたけどUSキーボードでgdgdだったので消していた)
      • Xwtでキーボード種別を検出できないので自動化はしていない…
    • プログラム・チェンジとバンク・セレクトのメニューで音色番号を表示するようにした(していなかった)
    • MiidiModuleDatabaseの楽器マップを自分で選択できるようにした(GS互換サウンドフォントでtimidityなどを使っていても自動判別できないため)
    • チャンネルを選択できるようにして、ch.10の場合はドラムの音色セットを表示するようにした(リズムパッド的に使えるようになった)
    • MML「入力」テキストボックスを追加。任意のmugene MMLを実行できるようになった。演奏を試しながらCCやSysexでサウンドを調整できる。
  • xmdsp
    • drag/dropでSMFをロードできるようにした
    • チャンネルパラメーターでピッチベンド値を表示するようにした
    • 演奏中のファイルの更新を検出したら自動的に最初から再生するオプションを追加した(デフォルト有効)
      • 打ち込み中に有効だと便利きわまりない機能
    • 倍速再生のスピードを2x, 4x, 8xから選択可能に(以前はボタン上でmousedown時のみ2倍→メニューで選択)
    • 最後に演奏したSMFの情報と最後に選択したMIDIバイスの情報を保存するようにした
    • MIDIバイスリストを毎回メニュー表示時に生成するようになったので、デバイスリストの変更があったときに再起動する必要がなくなった(もともとXwtの問題でそうできなかった)
    • 演奏時間表示まわりが不正確だったのをいろいろ直した
    • マーカージャンプ機能の追加。META情報を取得してその位置までジャンプできるようになった
      • managed-midiにジャンプ機能が追加されたのはこの目的
    • 複数SMF同時再生のためのコードを追加(まだメニューには登場していない. mugeneの機能追加待ち / 複数デバイスへのマッピング機能が必要)
    • チャンネルマスク(ミュート/ソロ)の実装(これもmanaged-midiの機能追加と一対)
    • Xwt.Gtk3のTextLayoutがメモリを永久に食い続ける問題を回避
    • GUICanvas)のOnDraw()処理の部分的な最適化
  • mugene
    • VSCode拡張にmugene:compileコマンドを追加。VSCodeからいつでもコンパイルできるようになった
      • 再生はxmdspの「ファイル変更検出時に自動的に再生」が有用
    • MMLチートシートのドキュメントを追加(VSCode拡張で表示しても良いのだけど未対応)
    • VSCode拡張でMMLコンパイルエラーをエラーパネルに表示できるようになった
    • 最初のコンパイルエラーでコンパイルを終了しないようにしたので、複数エラーが出るようになった
    • #conditional track ディレクティブで複数トラック範囲が指定可能に(1,3-5,11-13など)
    • METAイベントの引数が1文字だけだった場合にクラッシュしていたのを修正(常にテンポ変更命令として処理されていた)
    • トラック番号に小数値を指定可能になった(和音を1トラックにしていたのを分解したいけどトラック番号は連続的にしたい、みたいな時に有用)
    • LEGATO命令のCC番号がおかしかったのを修正(めったに使わない命令で気付かなかった)
  • notium
    • mugeneと同様の機能を、MMLを習得しなくてもAPIだけで使えるようにするために独立して作ってみたもの
    • まだ全然使っていない(公開する予定も無かったけど、xmmkにMML入力padを追加する時に、当初これを使おうとしていて、submoduleにするなら公開しなきゃ…となって公開になった)

これで全部のコーディング活動というわけではないのですが、いま成果として実現しているのはこれくらいでしょうか。個人的にはxmmkがこんなかたちで発展することになるとは思っていなかったので、割と面白いなーという気持ちで眺めています。どれも未完成感が強いのですが、打ち込み作業者としての自分に必要な機能を肉付けできたのは良かったかなと思っています。

どのモジュールも、構想としてはいろいろ「これやったら面白いんじゃないか」「これが必要になるんじゃないか」というアイディアレベルではToDoがたくさんあったのですが、実際にMML打ち込み作業に必要なものを実装していくと、全然違うことばかりやっていたという、自分で振り返ってみると面白いことになっていました。

今はMIDI音源(ハードウェアとかfluidsynthとか)とSMFがターゲットになっているのですが、21世紀にもなってそればかりというわけにもいかないので、もう少しモダンなターゲットも狙おうかなーと思っています。実のところ、果たしてそんなに遊んでいられるのかな?とも思わなくもなく、特にここ半年くらいは雑多な活動で時間を浪費してしまった気がしているところですが…これからはもう少し自分のやりたいことに集中しないとですね(そっちか)。