本文へスキップ

スピーカーなしで音楽をテストする ​

データとしての曲 ​

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 のエージェントスキルには、記法と楽器のレシピがまとまっています。