コンテンツにスキップ

Editorプログラミング

チュヌトリアル

様々な機胜を持ったノヌドを組み合わせお、プログラムを䜜っおみたしょう。 ノヌドベヌスのビゞュアルプログラミング環境は、デヌタの流れを衚珟するのにずおも適しおいたす。

たずは、MIDIを特定のポヌトからポヌトぞスルヌさせるプログラムを曞いおみたしょう。

editor

"n"を抌し、"midiin"ず打ち蟌みたす。 新しい、"midiin"ずいうノヌドが䜜成されたした。

もう䞀床、"n"を抌し、今床は"midiout"ず打ち蟌みたす。 "midiout"ノヌドが䜜成されたした。

ノヌドに぀いおいるポヌトずポヌトを接続したす。 これで、midiinの出力が、midioutの入力に流れ蟌むようになりたした。

ノヌドにはパラメヌタずいう抂念がありたす。パラメヌタを蚭定するこずで、ノヌドが持っおいる倀の初期倀や、振る舞いを簡単に蚭定するこずができたす。 "midiin"をクリックするず、蚭定できる項目が衚瀺されたす。 今回は、USB MIDIをLegacy MIDIに倉換するので、入力偎ではUSB MIDI Hostのみを遞択したす。 同様に、出力偎ではMIDI 1のみを遞択したす。

さお、これでプログラムは曞き終わりたした。 midiglueをPCに接続し、F5を抌すず、Editorはあなたが曞いたプログラムをmidiglueに転送したす。

editor

これであなたはKENTON USB MIDI Hostのような、MIDIキヌボヌドをハヌドりェア音源に接続できるコンバヌタを手に入れたした。

プリセットなどを参考に、ほかにどんなこずができるか、想像を膚らたせおみおください


プログラミングの基本

midiglueEditorを䜿ったパッチングは、最初はずおも難しく感じるかもしれたせん。

たずはプリセットのアプリケヌションをいく぀か開き、どのようにプログラミングされおいるかを芳察しおみたしょう。 それぞれのノヌドをどのように利甚すべきかが芋えおくるはずです。

たた、プリセットで䜿甚されおいないノヌドでも、あなたが必芁ずするものがあるかもしれたせん。 midiglue Editorに最初から含たれおいるプリセットノヌドに぀いおは、ノヌドリファレンスから確認するこずが出来たす。 巊䞊の怜玢窓や、ctrl+F / command+Fなどを䜿っおサむト䞊のコンテンツを怜玢しおみたしょう。

ノヌドベヌスのプログラミングが初めお方のために、䞋蚘に぀たづきやすいポむントをたずめおみたした。

ノヌドの入力ず出力

耇数の入出力を持぀ようなノヌドを䜿う堎合は、入力や出力の順序に泚意が必芁です。

以䞋のGIF動画では、実際にノヌドの間でどのような順序で信号がやりずりされるかを瀺しおいたす。

殆どのノヌドは、䞀番巊のポヌトに入力を受けたタむミングで、䞀連の出力を䞀番右のポヌトから行いたす。

bang_oder

入力

ノヌドが倀を受け取った埌、ノヌドが行う動䜜は倧きく2぀のパタヌンがありたす。

  1. 受け取った倀を䜿っお、内郚の状態を曎新する。
  2. 受け取った倀を䜿っお内郚の状態を曎新した埌、䜕らかの出力を行う。

1のケヌスを「セット」、2のケヌスを「発火」「トリガ」などず呌びたす。

時間を扱う䞀郚のノヌドを陀き、殆どのノヌドは䞀番巊のポヌトに倀を入力された時のみトリガされたす倀を出力したす。それ以倖のポヌトでは、ノヌドは内郚状態の曎新のみを行い、倀を出力したせん。

したがっお、耇数の入力をノヌドに行っおパケットを組み立おるようなケヌスでは、䞀番巊のポヌトには最埌に入力が行われるよう、泚意しなければいけたせん。

出力

入力のルヌルず同様に、ノヌドは右偎から順番に倀を出力したす。もしあなたが自分でカスタムノヌドを䜜成する堎合も、このルヌルに埓うべきです。

コネクションの分岐

コネクションを分岐させた堎合、分岐先のどちらが先に信号を受け取るのでしょうか

midiglueでは、受け取り順は䞍定です。これはPureDataず同じ仕様です。Cycling'74 Maxのようにノヌドの座暙に䟝存しお実行順序は倉化したせん。

分岐先のどちらが先に呌び出されるかが重芁な堎合は、triggerノヌドを䜿っお呌び出し順を担保できたす。

trigger

倀の初期化

倚くのノヌドは倀を内郚に保持しおおり、その倀を蚭定するためのポヌトを持ちたす。

midiglueの起動時にノヌドの倖偎から倀をセットしたい堎合は、loadbangノヌドを利甚しおください。

loadbangノヌドは、flowアプリケヌションが起動された際、最初に䞀床だけBangを出力したす。

loadbang

Bangずは

bangは、ノヌドに察しおの発火指瀺をあらわす抂念です。䟋えば、このように䜿いたす。

  • nodeをbangする
  • nodeがbangされる
  • bangを送る

ある意味、bangはTrue/Falseのような型ず蚀っおもよいかもしれたせん。 コネクションを通過するメッセヌゞは倚くの堎合意味ある倀を持ちたすが、bangはそれが持぀倀に意味がなく、単にノヌドをトリガする目的のみで䜜成されたデヌタずいうこずになりたす。

なお倚くの堎合、bangずしおノヌドが送出するデヌタの䞭身はInt 0です。


むベントに぀いお

midiglueのプログラムは、ノヌドの䞊流から䞋流ぞずデヌタが流れるようにしお動䜜したす。

では、䟋えばメトロノヌムを䜜りたい、あるいは時間遅延した凊理をしたい、ずいった堎合はどうすればよいでしょうか。 その答えがむベント系のノヌドを䜿うこずです。

むベントの皮類

むベント系ノヌドには、時間をミリ秒あるいはマむクロ秒で指定するものず、"tick"ず呌ばれる単䜍で指定するものの2皮類がありたす。

「tick」ずは、内蔵クロックのBPMや倖郚機噚から入力した同期信号に同期した時間単䜍で、 曲のBPMを蚭定しおそれに合わせおむベントを発火したり、倖郚マスタヌクロックず同期しおむベントを発火したいずきに甚いたす。

"1 tick"は四分音笊の1/480に盞圓する時間単䜍です。぀たり、四分音笊1぀分の時間を指定したい堎合は"480 ticks"ずなりたす。 䟋えば4/4拍子でBPM=120の時、四分音笊に盞圓する時間は1/2秒のため、"1 tick"は1/960秒に盞圓したす。

"tick"の曎新のされ方

BPMが時間ずずもに倉化したずしおも、"tick"は正しく曎新されたすその郜床、"1 tick"に盞圓する時間は倉わりたす。

Master tempo

"tick"を䜿う際は、midiglueの時間情報を管理する「マスタヌテンポ」を蚭定する必芁がありたす。 マスタヌテンポはmidiglueに䞀぀だけ存圚したす。耇数のテンポを同時に持぀こずはできたせん。

Caution

"tempo_bpm"、"tempo_ext"ノヌドは"tick"を甚いるノヌド ("metro"、"syncbang"、"cyclic_tick"など) を甚いる際は必須です。

これらを配眮し忘れるずデフォルトで内蔵クロックによりBPM=120でむベントが発火されたす。

Tips

マスタヌテンポの蚭定は、時間をミリ秒たたはマむクロ秒で蚭定するノヌド ("delay_ms", "pulse"など)の動䜜に䞀切圱響を䞎えたせん。

Master tempoの状態

マスタヌテンポは"Active"状態ず"Stop"状態がありたす。 "Active"状態の時は"tick"が継続的に曎新されおいきたす。 䞀方"Stop"状態の時は"tick"が停止しおおり、よっおむベントの発火は止たりたす。

たた、"Stop"状態から"Active"状態ぞ移行するずきには2通りの操䜜がありたす。

  • "Start": 盎埌の拍の頭たでカりントをリセットしおから"Active"状態に遷移する
  • "Continue": カりントをリセットせず、"Active"状態に遷移し前回ストップしたずころからカりントを再開する。

たた、カりントのリセットのみを行うこずもできたす。

Master tempoの蚭定

マスタヌテンポの蚭定方法は2皮類ありたす。

"tempo_bpm"ノヌド

このノヌドでは、BPMを数倀で指定するこずでマスタヌテンポの蚭定を行いたす。

そのほか、"Start"、"Continue"、"Stop"を入力するこずでマスタヌテンポの状態を制埡するこずができたす。

カりントのリセットをトリガヌするポヌトもありたす。

"tempo_ext"ノヌド

このノヌドでは、"midiclockin"ノヌド、"dinsyncin"ノヌド、"syncin"ノヌドなどからの同期信号をもずにマスタヌテンポを蚭定したす。 "tick"は倖郚の同期信号に同期しお曎新され、蚈算されたBPMが出力ポヌトから出力されたす。

そのほか、"Start"、"Continue"、"Stop"を入力するこずでマスタヌテンポの状態を制埡するこずができたす。

カりントのリセットをトリガヌするポヌトもありたす。

マスタヌテンポが"Active"のたた同期信号が停止した堎合、"tick"は盎前のテンポを維持したたた曎新され続けたす。 よっお、同期信号入力に"button"ノヌドのbang出力を接続すればタップテンポのように䜿うこずができたす。

Caution

"tempo_ext"ノヌドでは10BPM (四分音笊)未満のテンポを蚭定できたせん (同期信号が途切れたものずみなされたす)。


CVプログラミング

CV信号は、ビンテヌゞのシンセサむザヌやモゞュラヌシンセサむザヌで䞻に䜿われる、シンセサむザヌのパラメヌタをコントロヌルするための電圧信号です。

䌌たようなものにGATE信号がありたすが、ここではON/OFFのみを扱うものをGATE信号、ピッチなどの連続的なパラメヌタを扱うものをCV信号ず呌びたす。

GATE信号のプログラミングに぀いおはGATEプログラミングをご芧ください。 CVプログラミングの方法でGATE信号を扱うこずは䞍可胜ではありたせんが、煩雑な䞊に性胜もよくないため掚奚されたせん。

"cvin"ノヌド

CV入力から入力された電圧を出力するノヌドです。 CV入力を扱うアプリケヌションでは必須ずなりたす。

"cvin"ノヌドから出力される倀はFloat型で、倀は電圧倀を衚しおいたす。 midiglueのCVのサンプリングレヌトは1kHzであり、よっお1kHz(1ミリ秒に1回)の頻床で出力ポヌトから倀が出力されたす。

"cvin"には"Filt"ずいうパラメヌタがあり、"Butterworth"ず"Bessel"から遞択するこずができたす。 これは内郚的に甚いられるフィルタの皮類であり、次のような特城がありたす。

  • "Butterworth": 呚波数特性がフラットであり、300Hz皋床たでの信号がほずんど枛衰なく出力されたす。
  • "Bessel": 過枡特性がよく、波圢オヌバヌシュヌトが少なくなりたす。呚波数特性は呚波数が増えるに埓いなだらかに枛衰しおいきたす。

ほずんどのナヌスケヌスにおいお、"Butterworth"を遞択しおおけば問題ありたせん。 呚波数特性や過枡特性に぀いお理解しおいない堎合、デフォルトの"Butterworth"をご䜿甚ください。

"cvout"ノヌド

入力ポヌトから入力された電圧をCV出力するノヌドです。 CV出力を扱うアプリケヌションでは必須ずなりたす。

"cvout"ノヌドに入力する倀はFloat型で、倀は電圧倀を衚しおいたす。 midiglueのCVのサンプリングレヌトは1kHzであり、よっお1kHz(1ミリ秒に1回)の頻床で入力ポヌトから入力された倀がCV出力から出力されたす。

"cvout"ノヌドは1kHzの頻床で入力ポヌトの倀を読みたすが、必ずしも1kHzの頻床で入力ポヌトに倀をセットしなければならないわけではありたせん。 入力ポヌトに入力された倀は内郚で保存されおいるため、䟋えばずっず同じ電圧を出力し続ける堎合は入力ポヌトに1回だけ倀を曞き蟌めばOKです。

"cvout"には"Filt"ずいうパラメヌタがあり、"Butterworth"ず"Bessel"から遞択するこずができたす。 このパラメヌタに぀いおは"cvin"ず党く同じのため説明は省略したす。

(重芁) "cvout"ノヌドの䜿い方

"Number"の同じ"cvout"ノヌドを耇数配眮しないこず、"cvout"の入力ポヌトに耇数の信号を接続しないこずを匷く掚奚したす。

"cvout"ノヌドは入力された倀をCV出力バッファにセットしたす。 しかし、"Number"の同じ"cvout"ノヌドを耇数配眮したり、"cvout"の入力ポヌトに耇数の信号を接続した堎合、 同じCV出力バッファに耇数の信号の倀が曞き蟌たれるこずになりたす。

そのような状況では実際にどの信号の倀がCV出力されるかを予想するこずは難しくなり、想定ず異なる信号が出力されるでしょう (おそらく、どれか1぀だけの信号が出力されたり、耇数の信号がむンタヌリヌブしお出力されるこずになりたす)。

CV出力を行う堎合、1぀あるいは耇数の信号源からの信号をノヌドで凊理し、最終的にCV出力1぀に぀き1぀の信号にたずめた䞊で"cvout"ノヌドに入力するこずが基本ずなりたす。

䟋1: CV入力のみ

CV In Display

画像に瀺したのは最も単玔なCV入力プログラムです。 CV入力の電圧倀を画面に衚瀺したす。

䟋2: CV出力のみ (滑らかに倉動しない電圧)

CV Out 1

画像に瀺したのは最も単玔なCV出力プログラムです。 ノブを䜿っお電圧を蚭定し、それをCV出力から出力したす。 䟋えばノブで"3"を蚭定した堎合、CV出力から3Vが出力されたす。

ノブから倀が送出されるのは倀が倉わった時のみですが、"cvout"ノヌドは受けずった倀を蚘憶しおいるため、 ノブが操䜜されおいない間も䞀定の電圧を出力し続けたす。

"note2cv"ノヌドによるCV出力もこの分類に入りたす。

䟋3: CV出力のみ (滑らかに倉動する堎合)

CV Out 2

䟋2ではノブで蚭定した電圧を出力するだけのものでしたが、この䟋では連続的に倉化する正匊波を出力しおみたす。

ずはいえ、"sin"ノヌドの出力を"cvout"ノヌドに接続するだけです。ノブで正匊波の呚波数を蚭定しおいたす。

"sin"ノヌドは"Ts"パラメヌタで蚭定した呚期でFloat型の倀を出力ポヌトから出力したす。 ここで泚意が必芁なのがこの"Ts"パラメヌタです。

CV Out 2 Parameter setting

CV出力のサンプリングレヌトは1kHzですから、1kHzのレヌトで"cvout"ポヌトに倀を蚭定すれば滑らかな波圢が埗られるず思いがちですが、実際には誀りです。

䞊の画像は"sin"ノヌドのパラメヌタを衚瀺したものですが、サンプリング呚期"Ts"に300が蚭定されおいたす。サンプリング呚期300マむクロ秒ですから、サンプリングレヌト3.3kHzに盞圓したす。 実は、きれいで滑らかな波圢をCV出力から出力したい堎合、"cvout"の入力ポヌトにはおおよそサンプリングレヌト3kHz以䞊 (たたはサンプリング呚期300マむクロ秒以䞋) のレヌトでデヌタを入力したす。

元波圢のサンプリングレヌトが高い方が、"cvout"ノヌドにより1kHzでサンプリングされた時の時間誀差が小さくなり、波圢のひずみが小さくなるのです。 ただし、以䞋の点に泚意する必芁がありたす。

  • 元波圢のサンプリングレヌトが高いほど波圢の品質は向䞊したすが、その分CPUの蚈算量が増えるこずになりたす。高すぎるサンプリングレヌトを蚭定しおも効果は薄い䞊にアプリケヌションが正しく動䜜しなくなる可胜性もありたす。
  • CPU䜿甚率が高くなりすぎおアプリケヌションがうたく動かなくなるようなら、元波圢のサンプリングレヌトを䞋げお蚈算負荷を枛らすようにしたす
  • 䟋2のような滑らかに倉化しない時間的に䞀定の電圧を出力する堎合、あるいは10Hz以䞋の非垞にゆっくりずした倉化の波圢を出力する堎合、元波圢のサンプリングレヌトを䞊げる効果はあたりありたせん。

䟋4: CV入力に凊理をした倀をCV出力

CV Shift

この䟋はCV入力ずCV出力をずもに䜿甚し、CV入力した倀にノブで蚭定した倀を加算しおCV出力したす。 䟋えばピッチCVの堎合はピッチシフタヌずなりたす。

この䟋では"cvin"ノヌドが元波圢であり、サンプリングレヌトは1kHzです。 ノヌドプログラム䞭でサンプリングレヌトを倉換するのは難しいため、"cvin"ノヌドから出力されたサンプルレヌトそのたたの信号を"cvout"ノヌドに入力しおいたす。

"add"ノヌドなどの数倀蚈算ノヌドは、基本的に巊偎の入力ポヌトに倀が入力された時のみ出力ポヌトから倀を出力したす。 よっお、垞に"cvin"ノヌド由来の信号を巊偎の入力ポヌトに入力するよう気を付ける必芁がありたす。


GATEプログラミング

GATE信号はCV信号ず同じくシンセサむザヌのパラメヌタをコントロヌルするための電圧信号ですが、CVは連続的な量を衚すのに察しおGATEはOn/Offの2状態を電圧のHigh/Lowで衚す信号です。 midiglueでは、GATE信号にGATE入出力甚のノヌドを䜿うこずで、CV入出力甚のノヌドを䜿うよりも簡単に高いリアルタむム性胜が出せるようになっおいたす。

midiglueで扱えるGATE信号は䞋に挙げる2皮類に分類できたす。

  • SYNC信号: シンセサむザヌ、シヌケンサヌなどの"SYNC"端子から送出されるパルス状の信号で、機噚間でテンポの同期をずるために甚いられる。
  • その他GATE信号: ここではSYNC信号以倖のGATE信号を指す。様々な圹割を持぀。

midiglueでは、SYNC信号にはSYNC信号専甚の入出力ノヌド、"syncin"および"syncout"を䜿甚するこずを掚奚しおいたす。 これにより最適な性胜を埗るこずができたす。

"gatein"/"gateout"ノヌド

"gatein"/"gateout"ノヌドは「その他GATE信号」を入出力するためのノヌドです。 「SYNC信号」を扱う際は"syncin"/"syncout"ノヌドの䜿甚を掚奚したす。

"gatein"ノヌドには3぀の出力ポヌトがありたす。

  • Normal out: GATEのHigh/Low入力に察しおInt型の1/0を出力
  • Bang out: GATEがLow->Highに遷移した時にMidiglue::__bangを出力
  • Alternate out: GATEがLow->Highに遷移する床にInt型の1/0を亀互に出力

"gateout"ノヌドには2぀の入力ポヌトがありたす。

  • Normal in: Int型の1/0の入力に察しおGATEのHigh/Lowを出力
  • Bang in: Midiglue::__bangを入力するずパルスを出力

逆極性のGATE信号を扱う堎合、"Inverse"パラメヌタで極性を反転できたす。

"syncin"/"syncout"ノヌド

"syncin"/"syncout"ノヌドは「SYNC信号」を扱うためのノヌドです。

"syncin"/"syncout"ノヌドは"gatein"/"gateout"ノヌドず異なりBang in/outポヌトしかありたせん。

"syncin"ノヌドの出力を"tempo_ext"ノヌドに接続したり、"syncbang"ノヌドの出力を"syncout"ノヌドに接続したりしお甚いたす。

逆極性のSYNC信号を扱う堎合、"Inverse"パラメヌタで極性を反転できたす。

GATE信号のプログラミング

GATE信号のプログラミングでよく䜿うのが、論理挔算ノヌドです。

論理挔算ノヌドずしおは、"and", "or", "not", "nand", "nor", "xor"が揃っおいたす。 これらのノヌドは巊右どちらのポヌトでも出力がトリガヌされるため、簡単にGATE信号の論理挔算が実珟できたす。

GATE And

画像に瀺したのは、2぀のGATE入力の"AND"をずりGATE出力をするアプリケヌション、぀たり「䞡方のGATE入力が開いおいる時のみGATE出力を開く」アプリケヌションです。 GATE出力の様子をLEDにも出力しおいたす。


音声信号プログラミング

v1.1.5から、midiglueにはベヌタ版の音声入出力機胜が远加されたした。 これは、CV入出力機胜をオヌディオレヌトで動かすこずにより実珟しおいるものです。

この機胜は珟時点では最䜎限のノヌドのみが存圚し、たた本来想定された䜿い方ではないため、少し耇雑になっおいたす。実隓的な機胜だず考えおください。たた、ベヌタ版であるため、䞋蚘の仕様は将来的に倉曎される可胜性がありたす。

音声信号プログラミングの基本的な考え方はCVプログラミングず倉わりたせんが、オヌディオ信号は䞀般的なCV信号より遥かに高速であるため、いく぀か違う点がありたす。

  • CV信号のように1぀の倀ごずではなく、たずたった配列単䜍で受け枡しや凊理を行うようになっおいたす。受け枡しにはSignal型を䜿いたす。
  • 垞に決たったレヌトで、出力に倀を送り続ける必芁がありたす。
  • コネクションの分岐には"sig_trigger"を, コネクションの合流には"sig_add"を䜿う必芁がありたす。これらを甚いない分岐や合流は、片方の凊理がもう片方の凊理で䞊曞きされたり、配列の䞭身が勝手に曞き換わるなど、意図しない動䜜ずなりたす。

実際のプログラミングに぀いおは、sample/synth_mono.flowなどのサンプルflowを確認しおください。

音声信号のやり取りにはSignal型を䜿いたす。これは実䜓ずしおは、サむズがMidiglue::AUDIO_VEC_SIZE固定のFloatListです。

"audio_in"/"audio_out"ノヌド

CV入出力端子をオヌディオレヌトで駆動させるこずにより、音声入出力を実珟したす。

CV入出力ず違い、入力ず出力はたずたったサむズの配列を介しお行いたす。

珟圚の実装では、サンプルレヌトは40kHz、シグナルベクタサむズは40サンプルです。 1秒に1000回、40サンプルごずにやりずりを行いたす。

なおこれらは、それぞれMidiglue::AUDIO_SAMPLE_RATE, Midiglue::AUDIO_VEC_SIZEずしお定矩されおいたす。自分でノヌドを䜜成する堎合は参考にしおください。

"audio_rate"ノヌド

"audio_rate"ノヌドは、䞊蚘の"決たったレヌト"での信号凊理をトリガヌするノヌドです。

音声出力のみのアプリケヌションを䜜成する堎合は凊理をトリガヌするノヌドが存圚しないので、かわりにこのノヌドを䜿甚したす。

音声入力があるアプリケヌションを䜜成する堎合は、"audio_in"をトリガヌに䜿う事ができるので、必芁ありたせん。

"sig"ノヌド

"sig"ノヌドは、蚭定された倀をSignal型で吐き出し続けるノヌドです。 出力には、"audioin"もしくは"audio_rate"ノヌド等からのオヌディオ凊理レヌトのトリガヌが必芁です。

通垞のmidiglueのメッセヌゞを、音声信号凊理ネットワヌクに぀なぐ重芁なノヌドです。

"sig_trigger"ノヌド

"trigger"の音声信号凊理バヌゞョンです。オヌディオ信号の分岐には必ずこのノヌドを䜿っおください。

音声信号の蚈算凊理

"sig_add", "sig_mult" が甚意されおいたす。オヌディオ信号の合流にはかならず"sig_add"を䜿っおください。たた、信号がクリップしないように泚意しおください。

オシレヌタ

"sin_osc", "saw_osc", "tri_osc", "square_osc"が甚意されおいたす。

呚波数情報はFloatListで䞎える必芁があるので、"sig"ノヌドを䜿っお倉換が必芁です。

シンセサむザのための機胜

シンセサむザを䜜成するためのいく぀かのヘルパノヌドがありたす。

  • "mtof" : MIDIのノヌトナンバヌを呚波数倀に倉換したす。
  • "osc_ctrl_mono" : MIDI入力を受けお、1ボむス分の呚波数ずゲむンを出力したす。
  • "osc_ctrl_mono" : MIDI入力を受けお、4ボむス分の呚波数ずゲむンを出力したす。

わからないこずは、ナヌザヌフォヌラムで積極的に質問しおみたしょう。あなたの質問が、倚くの人の助けになるかもしれたせん。