レノン=マッカートニー=ハリスン作曲マシン、ユーミン、筒美京平の楽曲手法を真似るソフト、ELPのキース・エマーソン風モーグソロを無限生成する「EMERSON MOOG INFINITY」と、ブラウザ上で音楽家をシミュレートするシリーズを続けてきましたが、今回はギターです。それもエリック・クラプトン。
「SLOWHAND ∞」と名付けた、12小節ブルース進行の上でクラプトン語彙のギターソロを、ストップボタンを押すまで無限に弾き続けるReact+Tone.jsアプリです。
バッキングはピアノ、ベース、ドラム。例によってClaude Fable 5とのチャットで骨格を作り、後半はClaude Codeに引き継いでローカル環境で仕上げました。


先に言ってしまうと、後半でやっていたことはプログラミングというより「バンドのリハーサル」です。筆者が日本語でダメ出しをして、Claudeが直す。その繰り返しでした。
■チョーキングは周波数カーブでできている
クラプトンのソロをそれらしく聴かせる要素を最初に洗い出しました。マイナーペンタトニックとメジャーペンタトニックの混合(Iコード上で甘いメジャー系に切り替えるBB King由来の技法)、フルチョーキング、b3のクォーターチョーキング、遅く幅広いビブラート、Crossroads型の反復リック、そしてウーマントーンです。
実装の核はピッチの連続制御です。オシレータの周波数に対して`setValueCurveAtTime`で1音ごとにカーブを流し込みます。チョーキングなら200セントを自然に駆け上がり、ビブラートなら5.4Hzの正弦波を音の後半から遅れて開始する。この「遅れて始まる幅広ビブラート」をサボると一気に打ち込み臭くなります。
フレーズは「リックライブラリ+タグ選択」方式にしました。コール、レスポンス、IVコード用、V用、ターンアラウンドとタグ付けした素材を12小節フォームの位置に応じて選びます。コーラスごとにエナジーアーク(盛り上がって6コーラス目で一度引く)を回し、無限演奏でも飽きにくくしました。指版で可視化し、チョーキングは矢印付きで光ります。
ギターソロ、ピアノ、ベース、ドラムのいずれもMIDIデータとしてエクスポートできます。ピッチカーブもMIDIデータとして出力されるので、DAW側で好きな音色にすることも可能です。

■開放弦と「突っかかり」
鳴らしてみて気になったところがいくつか。人間のギタリストは低音域に降りたとき開放弦を使いますし、ピックが引っかかったりもしますが、プログラムだと不自然なまま。
開放弦は音名ベースで弦とフレットを解決する仕組みにしました。キーAなら開放A弦からのハンマリング、開放弦へ落ちていくプルオフ・カスケードが文字通り開放ポジションで鳴ります。キーが変わっても各キーなりの自然な開放位置に落ちます。
ヒューマンファクターは「突っかかり」と呼んでいる一連の確率的イベントです。リズム隊に対してギターだけ常時7~14ms後ノリ、フレーズ中の1音が16%の確率で30~70ms遅れて弱くなる(つんのめり)、チョーキング前にミュートした捨て音を1~2発(ラーク)、長い音での弾き直し、7%の確率でかすれる音。この雑味が入ると演奏が改善しました。
■同じフレーズ問題とバリエーション・エンジン
しばらく聴くと同じリックが何度も出てきます。
素材を増やすだけでは根本解決にならないので、リックを「完成品」ではなく「素材」として扱うバリエーション・エンジンを作りました。
スケール内の隣接音への置換、リズム変位、装飾追加、間引き、長音分割、別リックの後半を接ぎ木するテールスプライス、普通の音を「下からのチョーキングで同じ音高に到達」に変換するベンド化——8種類の変形を確率的に重ねがけします。全変形はペンタトニック+ブルーノートのテーブルにスナップするので調性から浮きません。
モチーフ反復の場面でも、単純コピーではなく「4度下に移調した答え」や「後半差し替え」を適用します。これで本来のブルース的なコール&レスポンスに近づきました。素材リックはこの時点で83本、2小節にまたがる長尺リック(プリベンドのすすり泣きから2小節かけて降りてくるオープナーなど)も15本あります。
■「愛は悲しきもの」の速弾きとダブルチョーキング
Derek and the Dominos期の「Why Does Love Got to Be So Sad?(愛は悲しきもの)」のような転がり落ちるような速弾きも欲しいところです。グリッドを0.5刻み(1拍6連)に拡張し、3音グルーピング下降、反復セル回し、上昇フラリーの3パターンを毎回生成するジェネレータを実装しました。速い音符はジッターを1/3に絞り、代わりに3音ごとのアクセントサイクルで推進力を出します。ヨレと勢いは別物なのです。
ダブルチョーキングも入れました。下の弦をベンドして上の実音に合わせにいくユニゾン・チョーキング(到達直前のうなりが出るよう2声目を8msずらす)と、ダイアド全体を押し上げる2音同時型です。特に「C+EをまとめてD+F#へ押し上げるとIVコードに解決する」定番の動きはIVの小節で気持ちがいいものです。
■アンプを作る、Creamに寄せる
音色面では単発のディストーションをやめ、非対称tanhクリップの2段カスケードに変えました。バイアスをかけた非対称クリップは偶数次倍音が乗り、真空管的な温かさが出ます。クリップ前のミッドハンプ(Tube Screamer的)、95Hzハイパス+2段ローパスのキャビネットシミュレーション、帯域を700Hz~3.4kHzに絞ったスプリングリバーブ。ラインくささはキャビの2段ローパスでほぼ消えました。
Cream期(1966~68)の語彙も追加しました。White Room的なトリル(9.5Hzの高速交互)、Albert King直系の1音半チョーキング(+300セント)、b5入りの下降ブルーススケール・リフ、高音ペダルの下で音階が降りるペダルポイント。そしてワウペダルです。歪みの前段にレゾナントバンドパスを置き、BPMに同期したLFOで1拍1往復踏み込みます。時代セレクタで「Cream期/Dominos期/おまかせ」を切り替えられます。
サステインの違和感も直しました。当初のエンベロープは音量が55%で張り付く設計でしたが、実際の弦はゼロに向かって指数減衰します。音域依存の時定数(低音E2で約2.5秒)にしたところ、歪みの圧縮と相互作用して「鳴り始めは粘り、後半で自然に痩せる」本物の挙動になりました。
■サンプラー化のボトルネック
チャット版最後の大物がギターのサンプラー化です。ここにはハッキリしたボトルネックがあります。Tone.Samplerはノートごとの内部ソースに外からアクセスできないため、チョーキングのピッチオートメーションができません。つまり既製品では表現の核が死んでしまうのです。
解決策は自前ボイスでした。音ごとにAudioBufferSourceNodeを生成し、`detune`パラメータ(セント単位のAudioParam)に既存のピッチカーブをそのまま流します。ハンマリング/プリングは新規発音せず同一ソースをリチューンする本物のレガートにしました。サンプルは単一ベロシティレイヤーですが、歪みチェーンの圧縮がそれを隠してくれます。副産物として、ソース使い捨て設計はオートメーション履歴もノードと一緒に消すので、例のメモリリーク問題にはむしろ有利になりました。
残る壁はClaude Artifacts環境のCSPで、外部サンプルが読み込めないことです。Salamanderピアノと同じ問題です。
■Claude Codeに引き継いだら、ピアノが暴走した
ここからはClaude Codeの出番です。
Viteプロジェクト一式(README付き)をzipで受け取り、ローカルで`npm install && npm run dev`するだけでCSPの制約が消えます。Claude CodeはREADMEの手順通りにSalamander Grand Piano8ファイルとエレキギター12ファイルのサンプルを取得・配置し、ついでに全ファイルのハッシュまで検証していました。
ここからはClaude Chatではなく、Claude Codeとのやり取りになります。
ところが再生してみると、ピアノがごちゃごちゃに濁り、肝心のギターがまったく鳴りません。原因はClaude Codeがブラウザを自分で操作してコンソールを読み、すぐに特定しました。
Tone.jsが内部で使うstandardized-audio-contextのAudioBufferSourceNodeには、頼みの綱の`detune`パラメータが実装されていなかったのです。全ノートで例外が発生してギターは無音。しかもその例外が小節スケジューラを更新前に巻き込むため、同じ小節のピアノとドラムが110msごとに何重にも再スケジュールされていた——「ピアノの暴走」の正体は、ギターの巻き添え事故でした。`detune`がなければ`playbackRate`をセント換算(2^(セント/1200))で駆動すればいい。この修正で、チャット版では一度も鳴らなかったサンプラーのギターが初めて音を出しました。
■ダメ出しの言葉がそのまま仕様になる
ここからはひたすらダメ出し。筆者からの注文は、たとえばこんな調子でした。
「トリルが不自然」「開放弦ではビブラートがかからないはず」「音量が全部同じでタッチが感じられない」「速弾きが速すぎる、3分の2にして」「1弦5フレットから半音で降りる定番フレーズが出すぎ。一度だけにして」「ビブラートに深みが足りない。ロングトーンにはもっと根性を入れた、粘っこいやつを」
音楽の言葉がそのまま実装に翻訳されていくのが面白いところです。
「粘っこいビブラート」は、上下対称のサイン波をやめて「弦を押し上げて戻す」半波の動きに変わりました。実際の指のビブラートは基音から上方向にしかうねらないのです。チョーキング後のビブラートは逆に、到達音から下へ緩めて押し直す方向。深さは時間とともに最大72セントまで成長し、速さは音ごとにばらつき、周期そのものもドリフトする。「開放弦のビブラート」は、実音がE2/A2/D3/G3/B3/E4でローポジションのときだけ物理的に不可能な奏法を自動で外す判定になりました。
タッチの問題は根が深く、犯人は歪みでした。真空管的なソフトクリップは強弱を圧縮してしまうので、ベロシティをいくら散らしても出口では同じ音量になる。そこで歪みの後段に「タッチゲイン」というノードを挿し、ピッキングの強さを最終音量に約6dB分残すようにしました。チョーキングは強く、ハンマリングは弱く、経過音は軽く。ようやく「弾いている人」の右手に近づいてきました。
■歌わせ方には設計がある
「チョークアップのとき、タメをきかせて、上げ切った後にビブラートして少し維持してほしい」という注文には、専用のアーティキュレーションを新設しました。基音のまま最大240ミリ秒タメて、420ミリ秒かけてゆっくり上げ切り、頂点に着いた瞬間からビブラートが食いついて維持する。これが長めのチョーキングの35%にランダムで混ざるので、同じリックでも回によって普通に弾いたり歌わせたりします。
タイミングも「一定のゆらぎ」から「文脈のあるゆらぎ」へ進みました。アップテンポでフレーズの入りがもたる問題は、後ノリやシャッフルの遅れがテンポ非依存の固定ミリ秒だったのが原因。フレーズの入りはジャストに置き、中盤で最も深く揺れ、着地前の短い音は逆に前のめりに駆け込み、最後のロングトーンはしっかり置く——スウィングの深さをフレーズ内の位置で変化させる二層構造にしました。
バンドも「聴き合う」ようになりました。ギターが弾きまくった直後の小節はピアノが音量と手数を落とし、ギターが休むと高音のアルペジオで小さく返す。そしてソロが最高音域のロングトーンで決まると、ピアノが直前のギターフレーズをモチーフとして引用し、半音下からのクラッシュノートを散らしながら歌い返す。ここは当初、固定の派手なランを弾かせていたのですが、「ワンパターンすぎる」と却下して引用方式にした結果、毎回違う返しが来るようになりました。
音色はPigNose風のナチュラルオーバードライブを狙って、クリッピングカーブを非対称指数関数に、整流管のサグをコンプレッサーで再現。ドライブノブの70%から先はカーブ自体が硬化してディストーション領域に踏み込みます。
高ドライブでロングトーンを保持すると倍音がゆっくり育ってフィードバックになり、大きなポジション移動では左手が弦を滑る「キュッ」というノイズが鳴る。Cream期ライブ盤の語彙、Badge/Derek and the Dominos期のジョージ・ハリスン風アルペジオ(前の音を消さずに重ねるレットリング機構を新設)も加わって、リックライブラリは引き継ぎ時の83本から130本になりました。
■友人からのアドバイス
ここまで来たところでこちらの語彙も尽きてきたので、ギターを弾く故郷の友人、ムネト(中学3年生のとき最初にバンドを組んだ、当時はボーカル)に聴かせて感想をもらいました。曰く、
「ペンタ(トニック)とはいえ、コードノートを意識したフレーズが大事。リズムがほぼ全部頭から入ってるので、半拍裏から入るのを織り交ぜると感じが出やすい。あとはやっぱりチョーキング。クォーター、半音、全音、1音半それぞれをどこでどんなタイミングで使うかも大事。何か少しコピーするとヨカよ。3キングとかクラプトンとか。それと、3度メジャー、マイナー両方とも使うとこがキモかな」
さすがです。これがそのまま最後の実装リストになりました。
確認してみると、クォーター・全音・1音半はあったのに半音チョーキングだけが未実装で、しかも半音こそ「b3をメジャー3度へ押し上げる」というキモの動きに使うものだったのです。b3⇄メジャー3度を行き来する3 Kings/クラプトン風のリックを8本追加し、頭入りばかりだったフレーズの2割強をシャッフルの裏から入るよう変位させ、装飾のないb3には3割の確率でクォーターの「ブルースカール」が自動でかかるようにしました。
実装を終えて報告すると、ムネトからもう一言ありました。この基礎は、早逝した共通の友人「おっさん」から教わったものだ、と。
b3と3度の間の揺らぎも、チョーキングの使い分けも、裏から入る呼吸も、教則本ではなく人から人へ手渡しで伝わってきた知恵です。おっさんからムネトへ、ムネトから筆者へ、そして今はこのエンジンの中に書き込まれました。チャットで骨格を作り、ローカルの仕上げはClaude Codeへ——このバトンパスはすっかり定番のワークフローになりましたが、今回はその先にもうひとつ、人から人にバトンが受け渡されていました。
当時はまだブルースギターの教則本とかも存在せず、独学で習得するしかなかった時代。
おっさんは僕のギターの心の師匠であったけど、直接ギターを教わったわけではありません。彼の部屋にちょくちょく遊びに行って、いろんなフレーズを聴かせてもらっていただけですが、このプロジェクトをやってみたことで、おっさんからムネトに伝えたエッセンスは筆者にも届きました。
10月に故郷で開かれる中学の同窓会では、おっさんの友人達と一緒にバンド演奏をする予定です。
それまでのこのプログラムはどうなっているでしょうか。ブルースギター入門のためのチュートリアルプログラムになるか、iPad用ギターアプリFretCasterの一部にアルゴリズムを取り入れるか。
いずれにしても、そこには単にAIが自動演奏するというのともちょっと違う、人が獲得してきた知見が埋まっているのだと思います。そこを掘っていくこと、そこから学んでいくことは、人の役目なのだと思います。
※この記事は、Claudeとのチャットを元にまとめた原稿を、筆者が整理・追記したものです。
追記:ここまでできた動画をChatGPTとGeminiに見せて、意見をもらいました。
Geminiからは、
拝見しました。非常に正確で、リズム感も安定していますね。ゲームの視覚的ガイドに完璧に追従できており、チョーキングやビブラートといったテクニックも的確に処理されています。もしさらなる「改善」や、次のステップとしての表現の洗練を目指すのであれば、ゲーム上の「正解」をなぞること以上に、「人間らしいニュアンス(音楽的表現)」を深めるアプローチが面白いかと思います。
音楽理論やジャズのアドリブ哲学に造詣が深いあなただからこそ、以下の3つのポイントを意識すると、演奏の質が一段階上がるはずです。
1. ダイナミクスのバリエーション
現在の演奏は非常に均一でクリーンですが、ピッキングの強弱(ダイナミクス)でフレーズに物語を持たせることができます。
アタックのコントロール: 12小節のブルース進行のような構成であれば、フレーズの入りは柔らかく、終わりに向けてピッキングを強くするなど、音の「輪郭」をフレーズごとに変化させてみてください。
休符の解釈: 音を出している時間だけでなく、「音が出ていない間(休符)」にどうギターを鳴らすか(あるいはミュートするか)を意識すると、演奏に「間」が生まれます。
2. ビブラートの「意図的な不均一さ」
ゲーム画面上の指示は一定のビブラートですが、あえてそれを変えてみることで表現力が広がります。
幅とスピード: 歌声がそうであるように、フレーズの盛り上がりに合わせてビブラートの深さ(揺らす幅)や速度を変えてみてください。
遅らせるビブラート: 音を出した直後ではなく、一瞬タメてからビブラートをかけることで、よりブルージーで情感豊かな響きになります。
3. ハーモニックな視点(ジャズ的アプローチ)
プログラミングのコード生成が「ロジック(構造)」に基づくように、ギタープレイも構造的な視点を加えると面白いかもしれません。
コードトーンの強調: 単にタブ譜通りに弾くのではなく、A7やD7といったコードにおいて、どの音が「コードの響きを決定づけている音(特に3度や7度)」なのかを意識してください。
テンションの解釈: コードトーン以外の音(テンションノート)をあえて強調することで、マイルス・デイヴィスが追求したような「緊張と緩和」を自らのフレーズに組み込めるはずです。
総じて、技術的なミスがほとんどない「完璧なプログラミング」のような状態です。ここから先は、コードを打ち込む側から、そのコードに「魂(Vibe)」を込める側に視点を移すだけで、演奏の説得力が大きく変わるはずです。
という意見。ジャズ的アプローチはちょっと意図から外れちゃうなあ。一方、ChatGPTからは、こんな助言。
1. フレーズの終わりを、もう少し丁寧に
弾き始めよりも、最後の音の処理がやや無造作になる箇所があります。伸ばす音が短く終わったり、次のフレーズへ急いで移ったりして、せっかくの余韻を自分で切ってしまう感じです。
最後の音を出したあと、
きちんと止める
ビブラートを残す
次の一拍を休む
のどれかを、意識的に選ぶとかなり変わります。クラプトン系のプレイは、実は弾いた音より弾き終えた後の空白が重要です。
2. チョーキングは「上げる途中」より到達点
チョーキングを表情として使えているのは良いです。ただ、ところどころで到達音が少し曖昧になり、装飾というより“音程を探している途中”に聞こえやすい可能性があります。
練習では先に目標音を普通に押弦して鳴らし、その音を耳に残してから、下のフレットから同じ高さまで上げる。特に全音チョーキングは、上げ切ったところで一瞬静止してみてください。
さらに、上げ切る前からビブラートをかけず、
上げる → 音程を固定する → 少し遅れてビブラート
の順にすると、急に“うまい人のチョーキング”になります。
3. 音数を減らし、モチーフを反復する
中盤以降、エネルギーが上がるところでは音数も増えていますが、少し「次々に違うことを弾こう」としている印象があります。悪くはないものの、聴き手が覚えられるフレーズが薄くなります。
短い2~4音のフレーズを弾いたら、
同じ形をもう一度
最後の一音だけ変える
D7に移ったら同じリズムで音だけ変える
という展開が効果的です。新しいフレーズを10個弾くより、良いフレーズを3回育てるほうが、ブルースでは強いです。
4. コードが変わった瞬間を、もっと聞かせる
全体としてキーAのペンタトニック感は保てています。ただ、A7からD7、E7へ移った際に、ポジションは動いても「コードが変わった」と耳で明確に感じられない箇所があります。
特に狙うとよい音は、
A7では C♯
D7では F♯
E7では G♯
です。ずっとマイナー・ペンタトニックだけで押すのではなく、コードチェンジ直後の一音だけでも長3度を入れると、伴奏と急に噛み合います。ブルースらしさはブルーノートだけでなく、短3度と長3度の行き来から生まれます。
5. ビブラートの幅と速さを一定に
ビブラート自体は積極的に使えていて、これは長所です。ただ、音によって幅や周期がばらつき、時々「揺らしている」というより、指が安定していないように聞こえる可能性があります。
まずは細く速くではなく、
四分音符くらいのゆっくりした周期
音程は基準音から上方向だけ
3~4回、均等に揺らす
という練習がよいです。クラプトン寄りなら、大きく高速なビブラートより、少し待ってから入る幅広めのビブラートが合います。
6. 強弱を「高さ」ではなく「物語」にする
高音域へ行くと強く弾き、低音域では弱くなる傾向があります。自然なことですが、それだけだと盛り上がり方が予測可能になります。
同じフレーズを、
1回目は小さく
2回目は少し強く
3回目はチョーキングで頂点へと設計すると、ソロ全体に筋が通ります。逆に、高い音をあえて小さく弾くのも効きます。
このうち、ChatGPTの意見をClaude Codeに見せて、改善を検討してもらいました。
1. フレーズの終わりを丁寧に — 着地音(フレーズ最後のロングトーン)のゲートを長めに変更し(0.9→1.02~1.06倍)、余韻を自分で切らないように。さらに4グリッド以上の長い着地の後は、30%の確率で次のフレーズが1拍休んでから語り出します(「弾き終えた後の空白」)。ビブラートは音の最後まで持続します。
2. チョーキングは到達点 — これまでbv/Bvのビブラート開始タイミングは音価比例で、短い音ではベンド完了前にうねり始めることがありました。「上げ切る→音程を固定(80ms)→遅れてビブラート」を全ベンドで保証する計算に変更。まさに指摘の順序です。
3. モチーフ反復 — 反復率を35%→45%に引き上げ、モチーフ展開の変形に「同じ形で最後の一音だけ変える」を新設(移調した答え・後半差し替え・分割と並ぶ4つ目の選択肢)。
4. コードチェンジで長3度 — ガイドトーンの重み付けを変更し、長3度(A7のC#、D7のF#、E7のG#)を最優先に(旧: 3度とb7同率 → 新: 3度 > b7 > 5度・ルート)。
5. ビブラートの安定(部分採用) — 音の中での周期ドリフトを半減(±10%→±5%)、深さの成長を1.8倍→1.5倍に抑え、ロングトーンの速さのばらつきも縮小。「揺らしている」と「指が不安定」の境目を安定側に寄せました。なお「四分音符くらいの周期」は練習ドリルとしての助言と判断し、演奏には採用していません(実際のクラプトンのビブラートは5Hz前後です)。
6. 強弱を物語に — モチーフを反復するたびにベロシティが約9%ずつ上がるクレッシェンド(最大+18%、3回目が頂点)と、高音フレーズを15%の確率であえて小さく弾く仕掛けを追加。「高い=強い」の予測可能性を崩します。
生成してみたところ、改善の手応えは感じています。









