組み込み関数・変数#
mimiumにおける組み込み関数や最初から使える変数について説明します。
now: float#
nowはDSPを実行し始めてから現在までの経過時刻をサンプル単位で返却します。例えばサンプルレートが48000Hzなら1秒経過後のnowの値は48000になります。
samplerate: float#
オーディオドライバのサンプルレートの値を、Hz単位で取得できます。
delay(size:const float,input:float,time:float)->float#
入力をtime(単位:sample)だけ遅らせた値を返します。sizeは最大の遅延時間をサンプルサイズで指定します。
sizeはコンパイル時に評価される特別な値なので、数値リテラルのみで代入する必要があります(他のコンパイル時決定可能な値に依存する式を評価できるように今後改良予定です)。
たとえばディレイは以下のようにselfと組み合わせることでフィードバックディレイを作ることが可能です。
fn fbdelay(input:float,time:float,feedback:float){
delay(44100,input*self*feedback,time)
}mem(input:float)->float#
memはディレイの1サンプルのみのバージョンです。
数学関数#
mimiumでは基本的な算術演算として以下の中置演算子が使えます。
+加算-減算(単項演算子としても使用できます)*乗算/除算^累乗%モジュロ
ほかに一般的な算術演算関数として、以下のものが使用できます。
sincostanasinacosatanlog(log関数は自然対数)pow(x,y)sqrtabsceilfloorroundfmod(x,y)%演算子はこの関数へのエイリアスですremainder(x,y)min(x,y)max(x,y)
論理演算#
mimiumでは真偽値を単に0より大きい数値をtrue、そうでなければfalseとして扱います。
論理演算の組み込み関数は、trueの場合1を、falseの場合0を返します。
<>>=<===!=&&||
print / println / probe / probeln#
デバッグ用途などに利用される関数です。
標準出力に値を出力します。print、printlnは数値型のみを受け付ける、(float)->voidな関数です。printlnは改行を入れて出力します。
また、probe、probelnは、与えられた入力を、標準出力に値を出しつつそのまま返す(float)->floatな関数です。こちらもデバッグ用です。
システムプラグインにより提供される関数#
これらの関数はシステムプラグインとして実装されています。一部の環境では動作しない可能性があります。
mimium-guitools#
RustのGUIライブラリeguiを利用した簡易的なオシロスコープ機能を提供します。
Probe(name:string)->`(float)->float#
使用するプローブ名を引数としてProbe!("name")を実行すると、数値型を引数とする新しい関数のコードが返り値として受け取れます。この関数はマクロとして実装されているので、dspコンテキスト内で Probe!("test")のように呼び出すのが普通です。
この関数は入力された値をGUIへ送り、同じ値を返却します。
例えば次のようなコードがあったとして、
include("osc.mmm")
fn dsp()->float{
let sig= sinwave(440,0)
sig
}パイプ演算子と組み合わせて以下のように使用すると、|> myprobeのある行をコメントアウトで切り替えることでGUIへの送りを制御できてデバッグに便利です。
include("osc.mmm")
fn dsp()->float{
let sig = sinwave(440,0)
|> Probe!("test") //コメントアウトすれば消せる
sig
}Slider(name:string,init:float,min:float,max:float)->`float#
GUIに簡易的な動的に編集できるパラメーターを追加します。この関数もマクロとして実行されるので、Slider!で呼び出すことが一般的です。
include("osc.mmm")
fn dsp()->float{
let sig = Slider!("freq",440,20,20000)
|> sinwave
|> Probe!("test") //コメントアウトすれば消せる
sig
}mimium-midi#
set_midi_port(name:string)->voidMIDIインプットに使用するデバイス名を指定します。この関数を使わなかったり、存在しないデバイス名を指定した場合、ランタイムはシステムのデフォルト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)->`(float)->float
RustのライブラリSymphoniaを利用してオーディオファイルを読み込みます。
オーディオファイル(.wav、.aiff、.flacなど)のファイルパスをパラメータにとります。パスは絶対パスでなければソースファイルの位置を基準とした相対パスとして解釈されます。
Sampler_mono!(path)を実行すると、配列のインデックスを入力に取り、その値を返す関数が埋め込まれます。
例えば以下のようなコードで、読み込んだwavファイルを1秒ごとでループすることができます。
fn phasor(){
(self+1.0) % 48000.0
}
fn dsp(){
phasor() |> Sampler_mono!("./assets/bell.wav")
}ファイル読み込みは仮の実装となっているため、1chのオーディオファイルのみが利用できます。
サンプルの長さの取得のAPIを今後追加予定です。また現在配列の範囲外へのアクセスは0を返します。
今後構造体の導入により、1つの関数でサンプル数、チャンネル数、サンプルレート、各チャンネルへの配列などをまとめて取得できるような仕様に変更される予定です。