サンプル例

mimium初心者のための例を交えた簡単な機能紹介。
  1. dsp系
  2. selfを使用した例
  3. シンプルなエフェクト
  4. composition系
  5. ドレミ音
  6. リズムパターン

サンプル: ドレミ音

下の例では、システムのオーディオドライバーのサンプルレートが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行目では、now48000+演算子で結ぶことで、現時点から先のサンプル時点を定めることができ、さらに@を使うことでそのサンプル時点で関数を実行することができます。

チェックポイント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オクターブ上がった音階を表現することができます。


  1. mimiumには現在オーディオドライバのサンプルレートを動的に取得する方法がありません。これは今後のバージョンで環境変数という形で導入される予定です。。 ↩︎