前回のコラムでは、超巨大Androidタブレット向けにMegaStrumという仮の名前で作ってきたタッチギターアプリをiPadに移植し、FretCasterという名前に落ち着いてロゴを作ったところまでを書きました。

今回はその続きで、対応デバイスの拡大、ビジュアライザー導入やMIDI対応など各種微調整の話です。
名前を決めるというのは本気モードということ。iPadでちゃんと弾ける楽器にする。しかも、12.9インチiPad Proだけでなく、10.5(11)インチiPadや8.3インチのiPad miniでも使えるようにする。ここから先は、そのための実機調整の話です。
今回の中心は、名称変更後に進めたiPadネイティブ化の詰め、音色作り直し、複数サイズ対応、MIDI対応、そしてApple Developer Program登録まわりです。
まずはSwiftUI版を、楽器として破綻しない状態へ
FretCasterという名前が決まったあと、作業の中心はSwiftUI版になりました。Safari版で試した要素を移植しながら、ネイティブアプリとしてちゃんと演奏できる形にしていきます。
最初に問題になったのは、動くには動くが、複数音を鳴らすと固まることでした。楽器アプリで2音鳴らしたら止まるのはさすがに困ります。発音管理を見直し、弦ごとの状態を整理して、固まらないところまでは持っていきました。前回のデモではそこまで。
VIB(ビブラート)、ARM(トレモロアーム)、Swap(高音域ネックと低音域ネックの位置入れ替え)、コードストリップ(16個のコード演奏ボタン)の挙動をひとつずつ確認していきます。これらは比較的早く動作確認できましたが、VIBの不具合に途中で気づきました。
チョーキングしたままVIBを押すと、ビブラートがかからないどころか元の音高へ戻ってしまう。これは、現在のピッチを中心に揺らすのではなく、基準音へ戻してから処理していたためです。ギターとしては、チョーキングした音をそのまま揺らしたい。ここを弦ごとのピッチ状態として扱うように修正。実機で演奏していると、こんなマイナーなバグがいくつも見つかります。
音色は、きれいな音からギターっぽい音へ
FretCasterになってから、いちばん時間を使ったのは音色です。
ネイティブ化直後の音は、レイテンシー面では可能性がありましたが、音がクリーンすぎました。フレットを押し続けるといつまでも鳴る。ディケイがなく、ギターというよりオルガンのように聞こえます。これは撥弦楽器としてかなり違和感があります。
そこで、ADSR(Attack、Decay、Sustain、Release)をギター寄りに調整しました。アタックは速く、弾いた瞬間に音が立ち上がる。そこから5秒程度でほぼ音量0まで落ちる。指を離したあとには、少しだけリリースを残す。完全に無音へ切るより、ほんの少し残ったほうが弦楽器らしく聞こえます。5秒という数字は、手元のエレアコ、Ovationを鳴らして体感で計測。
さらに、音源自体も金属的にしました。単純できれいな波形ではなく、倍音を足し、ピッキングノイズを加え、Fuzz、Drive、Tone、Spaceを調整できるようにする。最初はFuzzを選んでDriveを最大にしても軽いオーバードライブ程度だったので、歪み量をかなり増やし、サチュレーションも加えました。
ただし、ここでレイテンシーとの綱引きになります。ギターらしくしようとして処理を増やすと、遅れます。演奏感を優先するなら、重い物理モデリングをいきなり入れるのは危険。結果として、現在は低レイテンシーを優先した軽い音源を土台にして、必要な倍音、歪み、フィルターを足す方向にしています。
単音ソロでは、Fuzz+Drive Max、Tone Max、Space40%あたりが基準になりました。そこからさらにハードな音も出せるようにDriveレンジを調整し、コードストリップ側は歪みすぎないように別のDriveレベルを持たせています。この辺は、実際に音を出して確認しないといけないので、ヴァイブコーディングでは一気に行けない部分です。
ピッチを変える方法にもいろいろありまして
実機で弾いてすぐに見つかるタイプの問題があります。1弦を押さえたまま2弦をチョーキングすると、両方のピッチが上がってしまう、というものです。2弦の音高が1弦の音高に徐々に近づいていく、いわゆるダブルチョーキングが使えない。これはよくない。Pocket GuitarやGarageBandではちゃんとできます。
本物のギターなら、チョーキングしている弦だけ音程が変わります。別の弦は影響を受けません。そこで、チョーキング状態を弦ごとに分けました。ネックでのチョーキングはコードストリップのピッチにも影響しないようにしています。
ハードウェアMIDIキーボードでの演奏では普通、この表現はできません。ピッチベンドを使うと2音が一緒に上がってしまうからです。これを可能にするにはMPEという高度なモードに対応する必要があるのですが、その対応は後ほど。
同じ弦でスライドしたときも調整しました。横へ動かしたときに、フレットの存在が忘れられてポルタメントのようになるのは不自然です。さらに、チョーキングした状態で別フレットへスライドしたとき、前のベンド量を引きずってしまう問題もありました。これは、フレット移動時に通常ピッチへ戻すようにしました。
チョーキング中に指が隣のフレット領域へ入っただけで音高が変わるのも困ります。演奏者の意図は、たいていフレット移動ではなくベンド継続です。そこで、一定のベンド中は横方向のフレット変更を抑制するようにし、意図しない音高変化を減らしました。
この辺りは、どうも同じところでミスが起きるな。なぜだろうという疑問からでした。やはり実機検証は大切ですね。それをすぐにLLMに相談できるのが便利すぎます。
ARMは複数弦へまとめてかかるものとして扱います。ただし、アームダウン時は音の持続が長くなったほうがそれらしい。複数弦を押した状態でアームダウンしたときには、持続時間を10秒以上へ伸ばし、ピッチ下げも最大1オクターブまで拡張しました。
これは、ヴァン・ヘイレン1枚目のEruption、あれの最後のところを再現したいためです。
MotionボタンもARMへ割り当て、加速度センサーで最大1音半まで動かせるようにしています。これは、Pocket Guitarの演奏時に思いついたもので、通常のビブラートを左指をフレット状で動かすのは難しいけど、iPhoneやiPadを揺らすだけでビブラート効果が出せるならそのほうが便利。実際にライブでも使ってきたので、こちらの方がやりやすいです。
つまり、ビブラートをかけるには、一定周期であればVIBボタン、加速度センサーで任意の周期と深さでかけられるMotionボタン、そしてARMによる大幅なビブラート表現が、フレット状での指上下に加えて使えることになります。
コードストリップの表現力アップ
コードストリップの挙動もかなり変わりました。
Swiftで書き直した直後は、押して離したときに音が出るような状態になっていました。しかし、これは以前の挙動と違います。コードネームを押した時点で音が鳴り、押し続けている間はサステインが効くほうが自然です。そこで、押下時発音、ホールド中サステイン、リリースで減衰という形に戻しました。
さらに、コードネームの中央部分を押したときは短いストラムダウン、左から右へスワイプしたときは6弦から1弦までを位置に応じて重ねて鳴らすようにしました。途中の実装では、最初に全弦が鳴ってから個別弦が鳴る状態になっていましたが、それではアルペジオになりません。左スワイプでは、触れた位置に応じてまだ鳴っていない弦だけを順に追加するように直しています。
スロースワイプでアルペジオを弾き、まだ指を置いたままなら、鳴らした弦はサステインしている。離したら減衰する。この挙動にすると、コードストリップは単なるボタンではなく、領域全部を使ってアルペジオ演奏の細かなニュアンスを伝えられるようになります。
16個のコード設定は、テキストファイルから一括インポートできるようにしました。先頭行に設定名を書き、各行にコードネームと各弦の音高を書く。さらに、その場で構成音をエディットできます。固定プリセットではなく、演奏者側がチューニングや押さえ方を作れるようにするためです。6弦だけEじゃなくてDに落とすなんてのも簡単にできます。
ライブで使うコードが16個以下なら、ここに全てまとめられるので、便利なはずです。まだ実装はしてませんが、ギターソロで使うキーとスケールに合わせて自動的にコード選択ができるようにもしたいです。
Soloタブとオートコレクト
自動ソロ機能も、FretCasterになってからUIに組み込み直しました。
AIではなく、ルールベースで組んだ自動演奏機能で、直前に演奏していた自分のプレイ履歴から次のフレーズを予想して演奏していくというものです。
発想としては、ジャミネーター。初代Macintoshのメインプログラマーの一人でFinderの共同開発者として知られているスティーブ・キャップスが作った、ギター型楽器。ボタンと弦を押すと、プリセットのフレーズを演奏。複数の楽曲が含まれたカートリッジを差し込んで選ぶと、そのオリジナルフレーズが弾けます。
うちには2台あります(1台はスティーブ・キャップスのサイン入り)。カートリッジには、Highway Star、Laylaといったロックの名曲がズラリ。ただ、これは当然ながら決まったフレーズしか弾けないし、そのフレーズだけでギターソロを成立させるのは難しい。

そこで、生まれたのが、自分の演奏とシームレスにつながる自動ギターソロ。これを実現するために、ブルースギターソロ自動演奏プログラムをヴァイブコーディングし、そのアルゴリズムをFretCasterに移植した、という経緯です。
SOLOボタンはARMの左側に置きました。押すと自動ソロが始まります。ただし、ユーザーがネック上のどこかの弦をタッチすると自動ソロは止まり、次の出番待ちになります。勝手に弾き続ける伴奏者ではなく、人間が入ってきたらすぐ引っ込むソロ機能です。
Rec、Backing、GTone、Chordの右にSoloタブを追加し、キー、スケール、BPMを選べるようにしました。最初はキーとスケールが決め打ちでしたが、楽器として使うならそこは変更できなければ困ります。
指板上では、指定スケールの音を薄く表示します。さらに、スケール外のフレットを押さえたときに近隣のスケールトーンへ補正するオートコレクトモードも入れました。ただし、スライド中の経過音まで補正すると不自然なので、同じ弦でスライドしている間は経過音を補正せず、最終音だけ補正します。
自動ソロ側のアーティキュレーションも調整しています。スライド時の経過音が大きすぎると、普通の演奏より不自然に聞こえてしまうので、通常演奏時と同じくらいのレベルへ下げました。
VIBの2本指タップは高速ピッキングになった
VIBストリップにはもうひとつ機能を足しました。2本指でタップしたときは、ビブラートではなく高速ピッキングに切り替わります。
右側へ行くほどピッキング速度が上がります。最初はピッキングノイズだけが聞こえて、音程のある音が高速に鳴っている感じが出ませんでした。そこで、発音の減衰を急峻にし、ピッキングごとに音を立ち上げ直すようにしています。
左端は以前より遅くしました。速すぎるだけでは、演奏表現として使いにくいからです。さらに、ダウンピッキングとアップピッキングで音色が交互に変わるようにしました。実際のギターでも、ダウンとアップは同じ音ではありません。画面上の擬似ピッキングでも、この差があるとかなりそれらしくなります。
ピッキングノイズは一度大きめにしたあと、少し下げました。ノイズは重要ですが、出すぎると本体の音より目立ってしまいます。ここも実際に弾きながらの調整です。
これで、リッチー・ブラックモアがよくやってる、いわゆるハミングバードピッキングが可能になりました。
画面全体のビジュアライザー、「あの楽器」エフェクト
演奏中のフィードバックとして、ビジュアライザーも入れました。
最初は波形をオーバーレイ表示するだけでした。負荷が心配でしたが、軽量にすれば動きます。ただし、最初の実装では右端に青い線が出たまま動かなかったり、動いても変化が乏しかったりしました。
そこでVisタブを作り、表示方式を選べるようにしました。現在の波形表示に加え、押さえているノート情報をもとに図形を描き、その音が出ている間、画面全体へ拡大しながら薄くなっていくエフェクトを追加しています。
図形は回転します。VIBやARMを操作すると図形の動きも変わります。チョーキングすると図形が歪むようにもしました。ARM稼働時は音の減衰が遅くなるので、それに合わせて図形が消えるのも遅くしています。
演奏していると図形が次々と表示されるというアイデアは、「あの楽器」からいただきました。
あの楽器とは、2008年12月に発表されたPV「【初音ミク】Innocence【3DPV】」で初音ミクが弾いていた、架空の楽器です。
ショルダーキーボードのようだけど、タッチパネルのようで、ミクの指が触れるとさまざまな図形がそこから広がっていくというもの。これに感銘を受けたニコニコ技術部のみなさんが、次々とこれを現実化しようと動き始めます。タッチパネルを使った実物大あの楽器も出てきました。
そんな中、日本で出たばかりのiPhone 3G、前年に出たiPod touchを使ったアプリも複数が登場。筆者はこのあたりも取材していました。
・初音ミクが弾く「あの楽器」をiPhoneで再現しようという試み
・初音ミクが弾く「あの楽器」:iPhone版作者3人に会ってきた
タッチ楽器には、弦やボディから返ってくる物理的な振動がありません。その代わり、画面全体が鳴っているように見えると、演奏感が少し増します。これは単なる飾りではなく、楽器としてのフィードバックです。
実際に演奏してみるとむちゃくちゃ気持ちいいんですよね。
・Appleが大画面iPod touchを出すべきただ1つの理由
自分も2009年に、このために大画面iPod touchが欲しいと書いていましたが、これってiPadのことですね。
その17年後、実際に自分でもそのアプリを作ることになったという、伏線回収。
10.5インチiPadで動かしたい
FretCasterは12.9インチiPad Proだけを前提にしていましたが、かなり余裕のある作りになっているので、他の大きさでもできるんじゃないかと考えました。
そこで、10.5インチiPad ProとiPad miniにも広げています。
実は、10.5インチiPad Proは2枚持っています。もう最新OSは動かないのですが、ヘッドフォンジャックがある、最後のモデルなのです。
楽器としてiPadを使うには、ヘッドフォンジャックがあるとないとでは大違い。筆者はライブではほぼ必ず10.5インチのiPad Proを使うようにしています。そのままミニジャック対応ケーブルでミキサーに繋げられるから。
だから、2017年発売という9年前のモデルで旧OS(iPadOS 17.7)しか載らない10.5インチiPad Proでも動かしたいのです。

12.9インチでは、2本のネックが全体の縦の長さの3分の2くらいを占めるようにし、ビブラートストリップを2本のネックの間に挟みました。ARMはVIBの右側、SOLOはARMの左側です。Power行が演奏の邪魔になる問題もあったので、位置を何度か調整しました。

10.5インチでは、古いiPadならではの問題も出ました。Audio session failedが出て音が出ない。確認すると、再生サンプルレートが48000Hzになっていました。AVAudioSessionの扱いを調整し、テスト音が鳴ることを確認してから本体音源も復活しました。
うちにあるもう一台のiPad、iPad miniでも動かしたい。ただ、7.9インチディスプレイのiPad miniでは、ダブルネックは無理があります。
そこでシングルネックにし、VIBバーとFRETバーをネックの下に置く構成にしました。FRETバー右端の0と24ボタンは一体化し、0/24のトグルにしています。コードストリップは下の余白を使って大きくし、タッチミスを減らす方向です。

1弦のタッチ判定も広げました。特に最上部を触っているのに音が出ないことがあったので、1弦についてはフレット最上部も判定に含めるようにしています。画面が小さくなるほど、こういう細かいタッチ判定が効いてきます。

MIDI入出力対応。Bluetooth MIDIも使えるように
FretCasterはMIDI入出力にも対応し始めました。ケーブル接続とBluetooth MIDIの両方です。

最初は、GarageBandではつながるBluetooth MIDI対応ピアノが、FretCasterではオフラインと表示されました。見えてはいるが使えない。CoreMIDIの接続状態やBluetooth MIDIセッションまわりを見直し、MIDI Inは確認できました。

ここが動くと、FretCasterは単体のギター音源アプリだけではなくなります。FretCasterの画面をMIDIギターコントローラーとして使い、GarageBandやLogic Proなどの入力に使えたり、その他の外部音源を鳴らせるようになります。
10.5インチiPad ProでのプレイをLogic Proのサンプラーに送って再生できることも確認。ピッチベンド情報も送られてます。やった!

筆者が所有するローランド製MIDIギター「ギタ次郎」でFretCasterを鳴らすこともできるでしょう。たぶん。
6本の弦を独立して扱うためにはMIDIのMPEモデルに対応する必要があります。GarageBandやLogic Proではこの辺に対応しているので、その仕様を探りつつ、実装を進めていきたいと思います。
Apple Developer Program登録待ち
実機を増やすと、開発者登録の現実にも当たります。
12.9インチiPad Pro、10.5インチiPad Pro、iPad miniと試していくうちに、無料のPersonal Teamでは登録できるiPad台数の上限に達しました。現状では3台がMAX。
Xcode側ではCommunication with Apple failed、development team has reached the maximum number of registered iPad devicesというエラーが出ます。
App Storeで配布するなら、どのみちApple Developer Programは必要です。そこで個人で登録し、年会費1万2800円の支払いまで済ませました。現時点では、Apple Developerでの確認待ちです。マイナンバーカード、パスポート、運転免許証などの写真を提出後、2営業日かかるそうです。
登録が有効になったら、Xcode側のTeamをPersonal Teamから有料アカウントへ切り替え、改めて各iPadへ入れていくことになります。
ここまで来ると、FretCasterは単なる自分用プロトタイプから、配布を意識したアプリに近づいてきます。まだ直すところはたくさんありますが、自分の演奏に関しては基準点に達したと思っています。
TestFlightで配布して欲しいという声も上がっているので、早く実現に漕ぎ着けたいです。
名前が決まったら、より楽器らしくなっていく
前回は、名前を決めるところまででした。今回やったのは、その名前に中身を追いつかせる作業だったように思います。
FretCasterという名前にした以上、ただフレットが並んで音が鳴るだけでは足りません。チョーキングした弦だけピッチが変わる。コードストリップはボタンではなく弾く面になる。音は押しっぱなしでも減衰する。iPad miniでも弾ける。MIDIで外へも出せる。そういう細部を、実機で弾きながら詰めていきました。
AIコーディングは、こういう作業と相性がいいです。最初から完璧な仕様書を書くのではなく、触って、違和感を言葉にし、直して、また触る。そのループを気軽に繰り返せます。他の開発者に依頼すると、そうはいきません。
FretCasterは、まだ完成ではありません。むしろ、ここから弾き込むほど直したいところが増えるはずです。ただ、名前がつき、音が鳴り、複数のiPadで動き、MIDIにもつながり始めたことで、これはもう単なる実験ではなくなってきました。
次は、TestFlightか、App Storeか。あるいは、その前にもう少しギターらしい音を詰めるか。コードストリップと切り替えするスタイルにすればiPhoneアプリでもいけるか、みたいなことを考えています。
今回のWWDCはこれまでとは違った視点で見ることになりそうです。

▲2010年の筆者。発案したiPhoneをギターのように使うスピーカー「Fingerist」を手にしています












