Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

クイックスタート

リアルタイムinstrumentでシナリオを実行します。DSP性能のためrelease modeを推奨します。

cargo run --release -- samples/01_a_single_voice.rhai

最小の音

place(sine().amp(0.08).sustain(), at(440.0));
wait(2.0);

place(population_spec, placement)は、現在のスクリプト時刻にPopulationをただちに配置します。 返されたPopulationへの参照を使うと、実行中のPopulationを更新したり終了したりできます。

基本オブジェクト

  • PopulationSpecは、初代として生成されるVoiceとPopulation全体の方針を記述します。 sine()harmonic()modal()saw()square()noise()から始めます。
  • Variantvariant(population_spec)でspecificationを複製します。
  • PlacementはPopulationをどこへ配置するかを決めます。協和、不協和、その境界、空いた音域を consonance()dissonance()edge()gap()で選べます。既定では候補を確率分布として 扱い、.peak()を付けると最も強い一点を選びます。ほかにrandom()at()line()があります。
  • Populationplace()が返す安定した参照です。この時点で初代のVoiceが 存在し始め、実行中に使えるメソッドは現在のVoiceを更新します。
  • SectionはPopulationの有効範囲を定め、終了時に自動で解放します。

Populationは、配置後も同一性を保つ一つの安定した参照です。.count(6)を指定したPlacementでは、 そのPopulationに6つの初代のVoiceが生まれます。後でVoiceが死亡して再生成されても、構成員と世代が 変わるだけでPopulationの同一性は保たれます。詳しいオブジェクト構造と生存過程は Population — Voiceをまとめる持続単位を参照してください。

let population_spec = harmonic()
    .amp(0.08)
    .sustain()
    .brightness(0.35);

section("plain entry", || {
    place(population_spec, line(220.0, 440.0).count(3));
    wait(4.0);
});

Consonance Fieldへ配置する

consonance(root_hz).peak()は、基準周波数の周辺で協和の評価が高い位置へVoiceを 配置します。Fieldはsystemが知覚したものによって形づくられるため、anchorが入ると peakの位置も変わります。

let anchor = harmonic()
    .brain("drone")
    .amp(0.06)
    .sustain()
    .anchor();

let voice = harmonic()
    .amp(0.04)
    .sustain();

section("field placement", || {
    place(anchor, at(110.0));
    wait(1.0);

    place(voice, consonance(110.0).peak().range(1.0, 4.0).count(6).spacing(0.9));
    wait(6.0);
});

Consonance Fieldの働きと、その中でVoiceが移動し、生き残り、再生成される仕組みは Consonance Field — 音高を評価する地形で説明します。

実行中のPopulationを更新する

発音体、振る舞い、生存過程、再生成の方針は、place()より前にPopulationSpecへ設定します。 返されたPopulationには、配置後に意味を持つ操作、つまり実行中の更新と終了だけが 公開されます。APIリファレンスには、両者のメソッドが区別して 表示されます。

let spec = harmonic().amp(0.04).sustain();
let population = place(
    spec,
    consonance(220.0).peak().count(3)
);
population.amp(0.02); // live patch on running voices
population.glide(0.8);
wait(3.0);
release(population);

完成した小品

seed(7);

let anchor = harmonic()
    .brain("drone")
    .amp(0.05)
    .sustain();

let colony = harmonic()
    .amp(0.035)
    .sustain()
    .seek_consonance()
    .glide(0.4)
    .avoid_neighbors(0.6);

section("emergence", || {
    place(anchor, at(110.0));
    wait(2.0);

    place(colony, consonance(90.0, 900.0).count(8).spacing(0.8));
    wait(8.0);
});

次に読む章