音声出力 - Cinderella Documentation
Description: The user's guide to the Interactive Geometry Software Cinderella

コンテンツにスキップ

# 音声出力

## サウンド関数

Syntherellaのオーディオ関数は、あなたのコンピュータに内蔵されているスピーカーで、特定の波形の音を鳴らすという可能性を提供します。これによって、音について数学的に分析することができます。

Syntherella は異なるすじみちの３つの特別な関数を提供します。

- `playfunction(...)` 数式で定義した音を鳴らす。
- `playlist(...)` 波形を指定したリストを与えて音を鳴らします。
- `playsin(...)` 特定の周波数の音を鳴らします。 和音も指定できます。

これらの関数の説明をする前に、音声信号の作り方について説明をしておきます。

３つの関数のいずれにおいても、振幅は-1.0から1.0 までに制限されます。すべての音声信号の和もこの範囲になければなりません。 `playsin(<実数>)` 関数について説明します。もっとも簡単な形は、周波数を与えるものです。たとえば `playsin(440)` は 440Hz の正弦波を1秒間鳴らします。次の簡単な音を鳴らすコードを試してみてください。:

    playsin(440);
    playsin(440*5/4);
    playsin(440*3/2);

しかし、全体の振幅は許容範囲を超えます。それぞれの信号を`1/3` に縮小すれば解決します。それには `amp-><実数>` 修飾子を使います。この修飾子はそれぞれの振幅を調整します。次のようにします。

    playsin(440,amp->1/3);
    playsin(440*5/4,amp->1/3);
    playsin(440*3/2,amp->1/3);

`playsin` が呼ばれると、既存の音に重ねて新しい音が出ます。もし `playsin` がi２番目に呼ばれるとき最初の音が鳴っていても２番目の音はかまわず鳴り始めます。そのため、ダイナミクスレンジが -1.0 から 1.0 の範囲を超えてしまうかも知れません。 `line-><整数>` はそのような状況を助けます。特に、 `line->1` とすれば、一つの音しか扱えないラインに出力します。次のコードをごらん下さい。

    playsin(440,line->1);
    wait(200);
    playsin(550,line->1);
    wait(200);
    playsin(660,line->1);

初めに、 440Hz の音が鳴り、 0.2 秒後に 550Hz の音が置き換わり、さらに 0.2 秒後に660Hz の音が１秒間〔フルに）鳴ります。 `line` 修飾子によって解決される微妙な点がもう一つあります。ある音が他の音で置き得られるとき、２番目の音が最初の音との関連で理にかなった位置から始まるという保証はないのです。

位相がずれている | 位相がつながっている | なめらかにつながっている

#### 周波数を指定して音を鳴らす: `playsin(<real>)`

説明: 最も単純な形として、この関数では一定の振幅で1秒間音を鳴らします。速さや振幅などは修飾子で指定できます。

修飾子: いくつかの修飾子があります。

修飾子: | 値の型 | 効果:
`amp` | `0.0 ... 1.0` | 全体の振幅
`damp` | `<実数l>` | 指数関数的に減衰する
`harmonics` | `<list~062` | 音のスペクトル
`duration` | `<実数>` | 鳴らす速さ
`stop` | `<real>` | durationと同じ
`line` | 数または文字 | 音を関連付けるライン

例: `playsin` の最も簡単は使い方は次の通りです。

    playsin(440)

440Hzの正弦波を鳴らします。これを次のように変えると

    playsin(440,damp->3,stop->5)

(`stop->5`) で5秒間鳴るようになり、 (`damp->3`) で減衰します。また、寄り複雑な音を鳴らすには、harmonics修飾子を使います。 Harmonics修飾子は異なる音の振幅のリストで与えます。次のコードでは

    playsin(440,damp->3,stop->5,harmoics->[0.5,0.3,0.2,0.1])

次のフーリエ級数によって与えられる音を鳴らします。

0.5*sin(440*2*pi*x)+0.3*sin(2*440*2*pi*x)+0.2*sin(3*440*2*pi*x)+0.1*sin(4*440*2*pi*x).

これは指数関数的に減衰します。

#### 関数によって定義された音を鳴らす: `playfunction(<funct>)`

説明:波形を入力して音を鳴らします。時間単位は関数の1単位が1秒にあたるものです。

修飾子: いくつかの修飾子があります。

修飾子: | 値の型 | 効果:
`amp` | `0.0 ... 1.0` | 全体の振幅
`damp` | `<実数l>` | 指数関数的に減衰する
`start` | `<実数>` | 開始位置
`stop` | `<実数>` | 終了位置
`duration` | `<実数>` | 鳴らす速さ
`mode` | `"append"` or `"replace"` | 新しい音のハンドル
`line` | 数または文字 | 音を関連付けるライン
`silent` | `<ブール値>` | 発音しない
`export` | `<ブール値>` | サンプルデータの書き出し

例: 次のコードでは、440Hzの音を鳴らします。

    playfunction(sin(440*x*pi*2))

次のコードでは、減衰する雑音を鳴らします。

    playfunction(random(),damp->8)

`start` と `stop` を指定することによってサンプル音の開始と終了を決めることができます。この範囲は非常に短いこともあります。`duration`を使って、サンプル音を鳴らす時間を指定します。次のコードは1秒間の正弦波を鳴らします。

    playfunction(sin(1000*x*2*pi),stop->1/1000,duration->1)

サンプリングによって配列に書きだすことができます。サンプリング周波数は44100Hzです。書き出しは音を鳴らさずに行なえます。次のコードは正弦波の４４の標本点のリストを作成します。

    sample=playfunction(sin(1000*x*2*pi),stop->1/1000,silent->true,export->true)

作成されたオーディオデータのリストは、 `playwave` 関数によって再生することができます。

    playwave(sample,duration->1)

#### オーディオデータのリストを再生する: `playwave(<list>)`

説明: この関数は、オーディオデータのリストを再生します。データの値は -1.0 から 1.0 の範囲にあるものとします。サンプリングレートは 44100 Hzです。しばしば、サンプル音は1秒間再生されます。再生時間は `duration` 修飾子で指定できます。

修飾子: いくつかの修飾子があります。

修飾子: | 値の型 | 効果:
`amp` | `0.0 ... 1.0` | 全体の振幅
`damp` | `<実数l>` | 指数関数的に減衰する
`duration` | `<実数>` | 鳴らす速さ
`line` | 数または文字 | 音を関連付けるライン

例:

次のコードでは、`playwave` で再生する３つのデータを作ります。 `wait`関数によって、３つの音が同じラインを使うのに時間差を設けます。 `playwave` 関数を使う前に、オーディオデータの作成は完了しています。

    sample0=apply(1..200,sin(#*2*pi/200));
    sample1=apply(1..100,sin(#*2*pi/100));
    sample2=apply(1..50,sin(#*2*pi/50));
    playwave(sample0,duration->1,line->1);
    wait(400);
    playwave(sample1,duration->1,line->1);
    wait(400);
    playwave(sample2,duration->1,line->1);

#### 再生の停止: `stopsound()`

説明: この関数はすべての音の再生を停止します。