ギターソロを楽して弾きたい。でも間違った音は出したくない。それを可能にするiPadアプリを自作。「フレットが足りないならダブルネックにすればいいじゃない」(CloseBox)

テクノロジー AI
松尾公也

テクノエッジ編集部 シニアエディター / コミュニティストラテジスト @mazzo

特集

先日、24.5インチの超大型Androidタブレット(5.5kg)で動く、電子ギターアプリを、Codexによるヴァイブコーディングで開発しました。今回はその続きです。なぜかAndroidではなく、13インチiPad Proのネイティブアプリを作ることになってしまいました。


実は記事を公開した直後に、このアプリにちょっとした追加機能をつけたのです。ギターソロの続きを勝手に演奏してくれる謎機能。

ステージに呼ばれて、ギターソロやってよ、と振られることってあるじゃないですか。

知ってるフレーズを2、3弾いただけでもうネタ切れになってしまい、棒立ちになってしまうことってありませんか? 筆者はあります。無理やりデタラメな英語で歌ってごまかしましたが。

そんなとき、ギターがなくてもタブレットやスマートフォンがあれば、他のメンバーに一泡吹かせることができる、そんなアプリにしたかったのです。

Androidでの実装を試しているうちに、このテーマはもうちょっとちゃんと取り組まないといけないな、ということで、別のプロジェクトとして、今度はClaudeで開発することにしました。

最初のプロンプトはこんなやつ。あくまでも、そういう取り組みが可能かどうかのフィージビリティリサーチ的なものでした。

ブルースギターのソロのアドリブで、ペンタトニック、フレージング、リズムパターン、ベンディングやビブラートなどをどこで入れるべきか、といった理論、ルールを応用し、それを自動演奏で利用できるようにしたい。すでに研究されているならそれを使い、なければ理論化し、プログラムに実装したい

そしたら、ちゃんとした対応をしてくれました。

ブルースギター即興演奏エンジンをClaudeと開発

結果的に、ブラウザで動くブルース即興演奏エンジンをClaudeと作りました。Claude Codeではなく、Claude Artifactsで。気がつけば 約12万字に及ぶ巨大なプログラムになりました。

設計は 4層構造。最下層はフォーム生成 ── A7 / D7 / E7 の12 小節進行を、1小節 144 ティック(三連 8分 × 12)に時間軸マッピング。その上にフレーズ計画層 ── 各フレーズを REPEAT(同じモチーフ反復)/ VARY(似た形で変奏)/ NEW(新規開始)のいずれかに振り分けます。

コーラス前半は REPEAT 寄り、後半に VARY と NEW が増える、ブルース特有のコール&レスポンス構造を再現します。

3層目は音高選択。マイナー・ペンタトニック (0, 3, 5, 7, 10) と ♭5(ブルーノート)から、現在のコード・トーンへの近さで重み付け抽選します。

同時にオクターブ確率分布を複雑度で動的に変えていて、コーラス1は中央オクターブの重みが 1.5、その上下が 0.5 と 0.1 ── ペンタトニックの「安全圏」に張り付かせます。コーラス4では上のオクターブが 1.2 まで上昇、24 フレット領域への突入を許可します。

最初は20フレット以上が多発してしまい、こんなブルースソロ、誰が弾くってんだと修正しました。

最上層のアーティキュレーションが、ブルースギターらしさを表現してくれます。

チョーキングは 50 / 100 / 200 / 300 セントの 4 段階を用意。実機の ストラトキャスターなら B 弦 7-8 フレット付近の全音(200 セント)が標準、3 度(300 セント)は劇的な場面のみ。

ビブラートは「上方向のみの非対称」で実装しました ── (sin(t) + 1) / 2 × depth の半波形にして、ピッチが基準音より下へ行かないようにしています。実機ではアーミングを使わないとマイナス方向にはいかないですからね。

さらにグレイス・ノートは半音下からの装飾音、スライド・インは 2~4 半音下からの滑り上がり、チョークは音価末尾の急減衰でカット。ベロシティも ±10% でヒューマナイズ。

これら奏法装飾も複雑度パラメータに同期しているので、コーラス 1 は控えめな半音上げまで、コーラス 4 では全音ベンドにビブラートを連結した技巧的な演奏へと変化します。

1 つのパラメータがフレーズ・スケール・運指・装飾のすべてを「経験を積んだプレーヤーがソロを温めていく」流れに同期させる ──というのが狙いです。

音作りでは何度も詰まりました。Tone.Distortion は出力が頭打ちして「歪んだ気がしない」音になってしまいます。tanh の WaveShaper を自前で書き、Chebyshev サチュレーターと縦続接続して、ようやくドライブを上げると本当にファズになる挙動を取り戻しました。ミキサーも Tone.Gain では音量バランスが取れず、Tone.Volume の dB ベースに全面移行。

この辺はあまり重要な部分ではない、ターゲットデバイスでちゃんと音が出るようになっているから不要なのですが、プログラム上で音が悪いのは気持ちよくないので。

TAB アニメーションは Canvas で 6 弦譜を描き、Tone.Transport.seconds でスクロールさせています。フレット位置はヒューリスティックで決定 ── 隣接音から離れすぎる候補と低音弦の高フレットにペナルティを与え、自然な運指を選ばせます。音だけだとプレゼンしにくいので。MP4による録画機能も追加してあります。

なんか煮え切らない感じのギターソロで、とりあえず覚えたブルースっぽいフレーズをペンタトニックで繋げている感じが出せるようにはなりました。

何もこれで感動するソロを取れることを期待していたわけではなく、実機での演奏のためのアルゴリズム作りが目的だったので、これでヨシということにしました。

さて、この後どうしよう。というふうなことをまた、ベッドの上で考えたところ、思い出したのです。

なにも、デカくて重いAndroidタブレットでやらなくてもよくね?

フレットが足りないなら、ダブルネックにすればいいじゃない

13インチiPadでのGarageBandのギター機能は12フレットしかないし、何せ無駄スペースが多いから、あれを最適化して……。

フレットが足りないなら、ダブルネックにすればいいじゃない(マリー・アントワネット)

そう。ダブルネックにして、簡単にスイッチできるようにすれば、どでかいディスプレイが不要となるではないですか。そうと決まれば話がはやい。ベッドルームにある13インチiPad Pro(第5世代)を持ってきて、開発を進めることにしました。684グラムと、MegaPadと比べると10分の1くらいの軽さ。

まずは、Chromeのブラウザアプリからネイティブアプリへの最適化していたMegaStrum(仮称)を、そのままiPadのSafariで動くようなブラウザアプリに移植します。ベッドに寝っ転がったままで。

実機で試しつつ、レイアウトや機能の改善を図っていきます。

ビブラートボタンはダブルネックに挟む感じにすると、指板を押さえながら、ビブラートボタンに手が届きます。

なんとかうまくいったので、次はギターの音色をもっとリアルにしたい。そう考えて物理モデリングを実装したのですが、これまで順調だったレイテンシがいきなり1秒を超える超遅延に。いろいろと試行錯誤してみてもうまくいかず、Codexの提案は、「Swiftでネイティブアプリ。これでいきましょうよ」。

仕方ないので、続きは明朝、階下のM4 Mac miniにXcodeをインストールし、iPadネイティブアプリを作ることにしました。

でも、ここまではMacをいっさい触らず、iPhoneのChatGPTアプリでCodexに指示を出し、iPadで動作を確かめる、というサイクルをベッドの上で繰り返して進めていたのです。

もうほぼ出来上がっているものをダブルネックにするだけだから簡単だろうとたかを括っていたら、まずはシンプルな音源と機能からビルドアップしていく手順のようです。

プラットフォームの移植って大変なのね、というのを実体験できました。

せっかく出来上がったデザインもシンプルなところから作り直しです。

音色まわりは、ネイティブ化の中でもかなり大きな作り直しになりました。

Safari版では、Web Audioで音を作っていました。最初は軽く動いていたのですが、ギターらしさを出すために倍音、歪み、空間系、減衰処理を足していくと、レイテンシがかなり悪化。最終的には体感で1秒以上の遅れが出る場面もあり、楽器としては厳しい状態になりました。CoreAudioだから大丈夫だと過信していたのですが、万能ではなかった。

音色改善をこれ以上Safari上で続けるのは難しいと判断し、iPadネイティブ化に踏み切ったというわけです。

ネイティブ版では、AVAudioEngineを使い、AVAudioSourceNodeでリアルタイムに波形を生成する構成にしました。

サンプル単位で音を作るため、Web Audio版よりも低レイテンシを保ちやすくなります。各弦・各タッチはVoiceとして管理し、弦番号、周波数、位相、音量、エンベロープ、ピック成分、減衰、倍音、ノイズなどを持たせています。

これにより、ネック上の単音、ハンマリングオン、プリングオフ、チョーキング、ビブラート、アーム操作を、同じ音源内で連続的に扱えるようになりました。

最初のネイティブ音源は、音は出るものの、ギターというよりオルガンに近く聞こえました。原因は、フレットを押さえている間ずっと音量が維持され、自然な減衰が足りなかったことです。

そこでADSRをギター向けに調整。撥弦直後にアタックが立ち、短い時間で一度大きく減衰し、その後ゆっくり尾を引きながら、最終的には5秒前後でほぼ無音になるようにしました。指を離した瞬間に完全に音が切れると不自然なので、リリースも少し残しています。

音がきれいすぎる問題も。単純なサイン波中心だと、どうしても電子音っぽく、弦を弾いた感じが出ません。

そこで基音に加えて、2倍音、3倍音、5倍音、7倍音、少しずれた非整数倍音、金属的な高次倍音を混ぜました。さらに、撥弦直後だけ強く出るピックノイズを加え、時間とともに消えるようにしました。これで、弦をピックで弾いた瞬間のザラッとした成分が少し出るようになりました。

オーバードライブも作り直しました。最初のDriveやFuzzは効きが弱く、Driveを最大にしても軽いオーバードライブ程度でした。そこでプリゲインを大きく上げ、tanhによるソフトクリップ、ハードクリップ、非対称サチュレーション、さらに2段目のサチュレーションを組み合わせました。

プロンプトにサチュレーションを、というキーワードを入れてから一気に改善した感があります。

単純に音量を上げて潰すだけではなく、歪み量に応じて出力をトリムし、暴れすぎないようにしています。これにより、Fuzz+Drive Maxで単音ソロ向けの太い音が出るようになりました。音色は、Pocket Guitarに近い感じ。しかし、Pocket Guitarはこの音を初代iPhoneで2008年にやってたんだからむちゃくちゃすごいよね、笠谷さん。

Toneはローパス/高域強調のような形で、暗い音から明るい音まで変化します。Spaceは軽いディレイ/残響として実装し、音に奥行きを加えます。さらに、コードストリップ用にはChord Driveを別に用意しました。単音ソロとコードでは歪みのかかり方の適正値が違うため、コード側だけ歪み量を調整できるようにしています。

音色プリセットも用意しました。Steelは標準的なスチール弦寄り、Modelはやや落ち着いたモデリング寄り、Fuzzは歪みを強めたソロ向け、Glassは明るく硬い音です。プリセットごとに倍音量、ピックノイズ、アタック、減衰、ボディ成分、ダイレクト成分を変えています。完全な物理モデリングではありませんが、低レイテンシを優先しつつ、ギターらしさを段階的に足していく方針です。

一方で、チョーキングやアーム操作との整合性も重要でした。

以前は、ある弦をチョーキングすると他の弦の音程まで変わる問題がありました。

現在は、通常のベンド、アーム、ビブラートを分けて管理し、弦ごとに必要なピッチ変化だけを加えるようにしています。これにより、1弦を押さえたまま2弦だけチョーキングしても、2弦だけ音程が上がるようになりました。ビブラートも、元の音程に戻すのではなく、現在のチョーキング位置を中心に揺らすようにしています。

レイテンシを悪化させずに、ギターらしい発音、減衰、金属感、歪み、チョーキング、アーム、ビブラートを同じ音源構造の中で扱えるようにした作業でした。まだ本格的な物理モデリングではありませんが、iPad上で演奏できる反応速度を保ちながら、ギター楽器としての説得力を少しずつ積み上げている段階です。

指定したコードをジャーンと鳴らすコードストリップも作り直しました。

単にボタンを押してコードを鳴らすだけでなく、コード名をタップすると短いストラム、左から右へスワイプすると6弦から1弦へ向かうアルペジオとして鳴るようにしました。16個のコードを個別に指定するのは大変なので、フォーマットを決めて、一括で取り込めるようにしました。

ホールド中はサステインが効き、スワイプで鳴らした弦の音も残るようにしています。

UIは、演奏に必要な部分を優先して整理しました。

Rec、Backing、GTone、Chord、Soloをタブ化し、録音、伴奏再生、音色調整、コード編集、自動ソロ設定を切り替えられるようにしました。Soloタブにはキー、スケール、BPMを置きました。キー選択は最初メニューでしたが、反応が悪かったため横並びの直接ボタンに変更しています。

スケールの音はネック上に薄く色分け表示されるため、ソロ時にどこを弾けばよいかが視覚的に分かるようになりました。フレットの位置がわかるように、銀色の丸も入れています。

自動ソロ機能も移植しました。

MegaPad版のソロ機能をベースに、現在のキー、スケール、BPM、直前に弾いた音を参照しながらフレーズを生成します。

SOLOボタンを押すと自動ソロが始まり、ユーザーがネック上のどこかの弦に触れると自動ソロは終了し、次の出番待ちになります。自動ソロ自身の発音では停止せず、ユーザー入力だけで止まるように経路を分けました。

自分が次のフレーズをどうしようか考えている間に、アプリ側でフィラー的なフレーズで繋いでくれるという寸法です。

RecとBacking機能も入りました。RecではiPad内蔵マイクを使ってオケを録音し、名前を付けてアプリ内に保存します。保存した録音はBacking側に登録され、再生、停止、シークができます。Backingでは、iPadストレージやiCloud DriveからWAV、MP3などの音声ファイルを読み込んで登録できるようにしました。Sunoなどで作った曲を取り込んで伴奏として使う想定です。

現時点では、MegaStrumはSafari版の試作段階を越えて、iPad Pro上で低レイテンシに演奏できるネイティブ楽器アプリとして形になってきました。

ほぼ満足できるレベルの音色になりましたし、演奏時のレイテンシも気にならないレベルに。強いディストーションをかけた状態でのアームダウンはもっと派手にしたいので、この時は減衰時間を5秒より伸ばそうかと考えているところです。

あとはワウ、コーラス、フランジャーといったエフェクター類の追加でしょうか。

ほぼ完成ということで、Sunoに自動ブルースソフトの演奏を取り込んでカバーした曲に合わせて弾いてみました。楽しすぎる。

しかし、録画したのを確認して気づいたのが、やはりミストーンが多いなと。

どうせならミスをなくしてしまえいいのでは? スケール以外の音は出ないようにして、

違う音をタッチしたら、近隣のスケールトーンにしちゃう。GarageBandにもスケールだけの特殊指板にするモードがありますが、それだと経過音も出せなくなっちゃうという欠点があります。

そこで、このオートコレクト機能では、スライドさせた時におかしくならないよう、経過音はそのままスルーする仕様に。これでデタラメに弾きまくっても、リズムさえ合っていれば大丈夫です。アームダウンで1オクターブまで下げられるようにしたので、ディレイをたっぷりかけたらヴァン・ヘイレンっぽい爆音も出せます。

さて、名前は何にするかな。MegaStrumはCodexが勝手につけた名前なので、なんかスペシャルな名前。Mazzo Specialとか。我が家の古い暖炉の木材から切り出して作ったとかいう設定で。

いろいろ考えてみたのですが、Codexと相談して、「FretCaster」に決めました。フレットしかないからね。

《system》

松尾公也

テクノエッジ編集部 シニアエディター / コミュニティストラテジスト @mazzo

特集

BECOME A MEMBER

『テクノエッジ アルファ』会員募集中

最新テック・ガジェット情報コミュニティ『テクノエッジ アルファ』を開設しました。会員専用Discrodサーバ参加権やイベント招待、会員限定コンテンツなど特典多数です。