組み込み関数・変数#

mimiumにおける組み込み関数や最初から使える変数について説明します。

now: float#

nowはDSPを実行し始めてから現在までの経過時刻をサンプル単位で返却します。例えばサンプルレートが48000Hzなら1秒経過後のnowの値は48000になります。

samplerate: float#

オーディオドライバのサンプルレートの値を、Hz単位で取得できます。

delay(size:const float,input:float,time:float)->float#

入力をtime(単位:sample)だけ遅らせた値を返します。sizeは最大の遅延時間をサンプルサイズで指定します。

Warning

sizeはコンパイル時に評価される特別な値なので、数値リテラルのみで代入する必要があります(他のコンパイル時決定可能な値に依存する式を評価できるように今後改良予定です)。

たとえばディレイは以下のようにselfと組み合わせることでフィードバックディレイを作ることが可能です。

fn fbdelay(input:float,time:float,feedback:float){
    delay(44100,input*self*feedback,time)
}

mem(input:float)->float#

memはディレイの1サンプルのみのバージョンです。

数学関数#

mimiumでは基本的な算術演算として以下の中置演算子が使えます。

  • + 加算
  • - 減算(単項演算子としても使用できます)
  • * 乗算
  • / 除算
  • ^ 累乗
  • % モジュロ

ほかに一般的な算術演算関数として、以下のものが使用できます。

  • sin
  • cos
  • tan
  • asin
  • acos
  • atan
  • sinh
  • cosh
  • tanh
  • log (log関数は自然対数)
  • pow (x,y)
  • sqrt
  • abs
  • ceil
  • floor
  • round
  • fmod (x,y) %演算子はこの関数へのエイリアスです
  • remainder (x,y)
  • min (x,y)
  • max (x,y)

論理演算#

mimiumでは真偽値を単に0より大きい数値をtrue、そうでなければfalseとして扱います。

論理演算の組み込み関数は、trueの場合1を、falseの場合0を返します。

  • <
  • >
  • >=
  • <=
  • ==
  • !=
  • &&
  • ||

デバッグ用途などに利用される関数です。 標準出力に値を出力します。printprintlnは数値型のみを受け付ける、(float)->voidな関数です。printlnは改行を入れて出力します。

また、probeprobelnは、与えられた入力を、標準出力に値を出しつつそのまま返す(float)->floatな関数です。こちらもデバッグ用です。信号処理で毎サンプル実行されるような箇所に使うと動作の低下を引き起こすので気をつけてください。

システムプラグインにより提供される関数#

これらの関数はシステムプラグインとして実装されています。Web環境などでは動作しません。

mimium-guitools#

RustのGUIライブラリeguiを利用した簡易的なオシロスコープ機能を提供します。

Probe(name:string)->`(float)->float#

使用するプローブ名を引数としてProbe!("name")を実行すると、数値型を引数とする新しい関数のコードが返り値として受け取れます。この関数はマクロとして実装されているので、dspコンテキスト内で Probe!("test")のように呼び出すのが普通です。

この関数は入力された値をGUIへ送り、同じ値を返却します。

例えば次のようなコードがあったとして、

use osc::*
fn dsp()->float{
  let sig = sinwave(440,0)
  sig
}

パイプ演算子と組み合わせて以下のように使用すると、|> Probe!("test")のある行をコメントアウトで切り替えることでGUIへの送りを制御できてデバッグに便利です。

use osc::*
fn dsp()->float{
  let sig = sinwave(440,0)
           |> Probe!("test") //コメントアウトすれば消せる
  sig
}

Control(name:string,init:a)->`a#

GUIに簡易的な動的に編集できるパラメーターを追加します。この関数もマクロとして実行されるので、Control!で呼び出すことが一般的です。

use osc::*
fn dsp()->float{
  let sig =  Control!("freq",440)
           ||> sinwave(_,0)
           |> Probe!("test") 
  sig
}

Controlはジェネリックな関数で、2つ目の初期値の値をレコードやタプルにすると、複数のグループ化されたスライダーが同時に現れるようになります。

use osc::*
fn dsp()->float{
  let param = Control!("param",{
    freq = 440,
    amp = 0.7
  })
  let sig =  sinwave(param.freq,0) * param.amp
           |> Probe!("test") 
  sig
}

パラメーターの最小値と最大値は数値ボックスをクリックすると編集することが可能です。同じコードでの初期値はeguiのpersistent valueの機能を用いて可能な限り保存、復元されるようになっています。

mimium-midi#

  • set_midi_port(name:string)->void MIDIインプットに使用するデバイス名を指定します。この関数を使わなかったり、存在しないデバイス名を指定した場合、ランタイムはシステムのデフォルトMIDIデバイスを使用を試みます。

  • midi_note_mono(ch:float, note_init:float, vel_init:float) ->`{pitch:float,velocity:float} 指定したチャンネルのノートデータを埋め込むマクロ関数です。この関数をグローバル環境で実行すると、引数を取らない新たな関数が返却されます。この関数は実行すると、指定したチャンネルのノート入力の最新の値を{pitch:float,velocity:float}のレコードの値として受け取れます。(ノートオフ信号はベロシティ0のノートオンとして扱われます。)

mimium-symphonia#

Sampler_mono!(path:string)->`{player:(float)->float,length:float}

RustのライブラリSymphoniaを利用してオーディオファイルを読み込みます。 オーディオファイル(.wav.aiff.flacなど)のファイルパスをパラメータにとります。パスは絶対パスでなければソースファイルの位置を基準とした相対パスとして解釈されます。

Sampler_mono!(path)を実行すると、2つの値を持つレコードが返ってきます。 一つは配列のインデックスを入力に取り、その値を返す関数で、もう一つは配列の長さです。

例えば以下のようなコードで、読み込んだwavファイルをループすることができます。

let sampler = Sampler_mono!("assets/bell.wav")
fn counter(){
    self+1.0 
}
//add -1.0 offset so that the counter start from 0 at t=0
fn dsp(){
    let player = sampler.player
    let len = sampler.length
    player((counter()-1.0)%len) |> Probe!("out")
}
Note

ファイル読み込みは仮の実装となっているため、1chのオーディオファイルのみが利用できます。

配列の範囲外へのアクセスは0を返します。

(c) mimium development community(2026)