サンプル例
- dsp系
- selfを使用した例
- シンプルなエフェクト
- composition系
- ドレミ音
- リズムパターン
サンプル: ドレミ音
下の例では、システムのオーディオドライバーのサンプルレートが48000Hzの時、ドレミファソラシドを1秒おきに鳴らします。
notes = [260.7,293.3,330,347.7,391.1,440,495]
index = 0
fn updateIndex(){
index = (index+1)%7
updateIndex()@(now+48000)
}
updateIndex()@48000
fn dsp(){
vol = 0.2
octave = 1
sec = now/48000
freq = notes[index]
out = vol * sin(octave*freq*3.14*2*sec)
return (0,out)
}
チェックポイント1「配列」
notes = [260.7,293.3,330,347.7,391.1,440,495] // 1行目
mimiumでは、配列を定義することができます。配列の定義は[]
でおこないます。インデックスの先頭は0です。
この例のドレミ音を作る1行目の配列には、ドレミファソラシ音の周波数を格納し、その後の処理で使用しています。
- ド音: 260.7Hz
- レ音: 293.3Hz
- ミ音: 330Hz
- ファ音: 347.7Hz
- ソ音: 391.1Hz
- ラ音: 440Hz
- シ音: 495Hz
配列の利用の仕方は、1,2行目のように配列名[インデックス]
で表現します。
freq = notes[index] // 1,2行目
チェックポイント2 継時再帰(Temporal Recursion)
// 3~7行目
fn updateIndex(){
index = (index+1)%7
updateIndex()@(now+48000)
}
updateIndex()@48000
v0.3.0現在の仕様では、一般的な言語がもつforループ文は採用していませんが、再帰関数を定義して、再帰ループを3~6行目のように表現することができます。
ドレミ音の例では、7行目で48000サンプル時にupdateIndex()
を実行した後、関数内でnow
キーワードと@
キーワードを併用して、現時点から48000サンプル時点にupdateIndex()
を実行しています(5行目)。
チェックポイント3「nowキーワードと@キーワードの併用」
updateIndex()@(now+48000) // 5行目
mimiumでは、現在のサンプル数をnow
で取得することができます。ユーザーは、v0.3.0現在の仕様では、now
キーワードが、リアルタイム時間を表していないことに注意してください。単位はサンプルです1。
また、mimiumには、@
キーワードという演算子があります。
これは 「@
キーワード以降の式で算出されたサンプル数のときに、@
前の関数を実行する」 という意味になります。
さらに、@
の時間は、オーディオドライバが起動してからの絶対時間を示しており、7行目のようにupdateIndex()@48000
と書いた場合は、必ず起動してから48000サンプル後に1度だけupdateIndex()
を実行する形になります。
例の5行目では、now
と48000
を+
演算子で結ぶことで、現時点から先のサンプル時点を定めることができ、さらに@
を使うことでそのサンプル時点で関数を実行することができます。
チェックポイント4「オクターブ」
// 8~15行目
fn dsp(){
vol = 0.2
octave = 1
sec = now/48000
freq = notes[index]
out = vol * sin(octave*freq*3.14*2*sec)
return (0,out)
}
音階は、振動数(Hz)が倍になれば1オクターブ上がり、反対に半分になれば1オクターブ下がる関係性があります。例の8〜15行目では、octave = 1
と固定なので260.7Hz〜495Hzのドレミファソラシド音を鳴らすのですが、例えばこの値を2と変更すれば1オクターブ上がった音階を表現することができます。
mimiumには現在オーディオドライバのサンプルレートを動的に取得する方法がありません。これは今後のバージョンで環境変数という形で導入される予定です。。 ↩︎
[i18n] feedback_title
[i18n] feedback_question
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.