スピーカーなしで音楽をテストする
データとしての曲
notes(song, fromStep, toStep) は、指定したステップの範囲で始まる音符をすべて列挙します。純粋な JavaScript なので、音をまったく出さずに、Node やテストランナー、エージェントのサンドボックスで動きます。
ts
import { notes } from "plonkjs";
notes(theme, 0, 16);
// [
// { time: 0, instrument: "lead", freq: 523.25, duration: 0.134, velocity: 0.8 },
// { time: 0, instrument: "kick", freq: 0, duration: 0.134, velocity: 0.7 },
// { time: 0.268, instrument: "lead", freq: 659.26, duration: 0.134, velocity: 0.8 },
// ...
// ]時間は曲の先頭からの秒数です。曲の終わりを越えた範囲を指定しても、order に沿ってループしながら数え続けます。
ts
import { expect, test } from "vitest";
test("the chorus brings the drums in", () => {
const chorus = notes(song, 64, 128);
expect(chorus.some((n) => n.instrument === "kick")).toBe(true);
});ほかにもヘルパー関数があります。parse(pattern) はパターンをひとつ読み、frequency("C#4") は音符の音高を返します。長さは songSteps(song) と sectionSteps(section) で、タイミングは stepSeconds(bpm) で求められます。
実際に鳴ったもの
Player は、スケジュールした直近 256 個の音符を player.played に記録します。これでゲームのテストから、正しい音楽が流れているかを確かめられます。
ts
expect(player.played.some((n) => n.instrument === "kick")).toBe(false); // マップ画面ではドラムなし鳴り方を数字で
mix(song) は、ブラウザ内で曲をオフラインレンダリングし、ラウドネス、バランス、問題点を報告します。これでテストやエージェントが、聞こえないトラックや音割れしたミックスに気づけます。詳しくはサウンドデザインを参照してください。
コーディングエージェントのために
曲はプレーンなオブジェクトに入ったただのテキストです。だからエージェントでも曲を書いたり、パターンや楽器を変えたりできます。人が聴く前に、notes() で結果を確かめることもできます。plonk のエージェントスキルには、記法と楽器のレシピがまとまっています。