リファレンス

画面の移動

MIDoRI は Home 画面で起動します。タイルをタップするとその画面へ。タイルの小さな文字はその画面の状態です (BPM、パッチの数、Tombola が動いているか など)。

ナビバー動作
Home(左)Home 画面へ戻る。
中央画面ごとのボタン(Tempo は TAP、Knobs は Send、Tombola は Start / Stop、Bluetooth は Scan)。ないときは画面名。
Back(右)直前の画面へ(Home は数えません)。もう一度押すと元の画面に戻るので、XYPad ⇄ Knobs のように 1 タップで行き来できます。

Pads・Knobs・XYPad は、スクリプトかプラグインが中身を決めるまで空です。SD カード用ファイルには中身を作るプラグインが 入っていて(/sd/plugins/、起動時に読み込み)、自分で書くときは examples が出発点になります。 プラグインが部品を組み合わせて作った画面(レイアウト)は、それぞれ Home にタイルが出ます。

Pads

Tab5・CrowPanel: 12 個(4 × 3)CoreS3: 6 個(3 × 2)

ワンショットの操作に使うボタンのグリッド。ドラムを叩く、シーンを切り替える、フレーズを始める、など。 パッドごとにラベルと色があり、何をするかはスクリプトが決めます。複数の指で同時に押せます。

パッドの種類

種類動作
trigger押した瞬間に 1 回(既定)。
momentary押している間オン、離すとオフ。音やエフェクトを押さえている間だけかけるのに。
toggle押すたびにオン / オフが切り替わり、オンの間は点灯。Hold・ミュート・Play に。

スクリプトから

dev = MIDI::Device.new(MIDIDevices.sam2695)
UI.pad(1, label: "Kick", color: :red) { dev.trigger(36, 127, channel: 9) }
UI.pad(2, label: "Hold", color: :yellow, type: :momentary) { |down| ... }
UI.pad(3, label: "Play", color: :green, type: :toggle) { |on| on ? UI::Tempo.start : UI::Tempo.stop }
UI.pad_label(1, "Kick!")   # pad_color / pad_state / pad_clear も
UI.show(:pads)

色: :red :green :blue :yellow :cyan :magenta :orange :purple :white :gray。ブロックはスクリプトが UI.process を呼んでいる間に動きます。

Knobs

Tab5・CrowPanel: 12 個 × 4 バンクCoreS3: 6 個 × 4 バンク

カットオフ・レゾナンス・音量・センドなど、合わせておく値のためのノブ。バンク(A〜D)はノブ一式の丸ごと 1 セットで、 ラベルも色もバンクごとに違ってかまいません(A = シンセ、B = ドラム、C = エフェクト のように)。

操作動作
ノブのまわりをなぞる実物のノブのように回ります。ゲージの先端が指の下から動きません。ノブの枠の中ならどこを持ってもよく、中心から遠くを持つほど細かく合わせられます。
複数の指いくつものノブを同時に回せます。
A / B / C / D(右端)バンクの切り替え。切り替えても何も送りません。ほかのバンクの値はそのまま残ります。
Send(ナビバー)表示中のバンクの今の値を送り直します。あとから機材をつないだときに。

ノブが送るのは値が変わったときだけ。定義しただけでは初期値は送られないので、画面と機材をそろえるには Send を押すか UI.knob_send_all を呼びます。

スクリプトから

UI.knob(1, label: "Cutoff", color: :cyan, value: 64) { |v| dev.control_change(74, v.to_i) }
UI.knob(2, bank: 2, label: "Pan", origin: :center, value: 64) { |v| dev.control_change(10, v.to_i) }
UI.knob(3, label: "BPM", min: 40, max: 240) { |v| UI::Tempo.bpm = v }
UI.knob_send_all(bank: :all)
UI.knobs
シミュレーターで開く ▶

オプション: min: / max:(0〜127)、step:(1。0 で連続値)、origin: :center (中央から両側へ伸びるゲージ)、sensitivity:(1.0)。

詳細: docs/KNOBS.md

XYPad

Tab5・CoreS3・CrowPanel最大 5 本の指

指で弾く演奏面。横が音程、縦が CC。指ごとに別の MIDI チャンネルで鳴るので、1 音ずつ別々にベンドしたりフィルタを開けたりできます。

操作動作
指を置く画面はスケールの音の数だけ縦に区切られていて、指を置いた列の音が鳴ります。
横に動かす置いた位置からピッチベンド。画面の端から端までで、グライド幅(既定 2 半音)ぶん曲がります。
縦に動かすCC を送ります(既定 74。多くの音源でフィルタのカットオフ)。上ほど大きい値。
離すノートオフ。Hold がオンなら、Hold を切るまで鳴り続けます。

指の近くに、いま何を鳴らしているかが短く出ます。音の代わりに CC を 2 つ送る指にもできます。

スクリプトから

pad = UI::XYPad.new(scale: [36, 38, 40, 41, 43, 45, 47, 48],
                    glide_range: 2, y_cc: 74, device: dev)
pad.slot(5, x_mode: :cc, x_cc: 70, y_cc: 71, device: fx)   # 5 本目の指だけ
UI.pad(1, label: "Hold", type: :toggle) { |on| pad.hold = on }
pad.show
シミュレーターで開く ▶

XYPad は MIDI Devices にも出ているので、そこでパッチすれば弾いた内容をほかの機材にも送れます。

詳細: docs/XYPAD.md

Keys

Tab5・CoreS3・CrowPanel1〜4 オクターブ最大 5 本の指

画面の鍵盤(既定は C3 から 2 オクターブ)。受け取ったノートで鍵が光るので、光る MIDI 鍵盤のように、機材や DAW が 何を弾いているかも見られます。

操作動作
鍵を押すその音が鳴ります(押している間はシアン)。
指を滑らせる隣の鍵に移るとその鍵を弾き直します(グリッサンド)。
押す位置スクリプトで velocity: :position にすると、鍵の手前ほど強く鳴ります。

MIDI Devices で

  • Keys → 機材: 弾いた音がその機材へ。
  • 機材 → Keys: 届いたノートで鍵が光ります(オレンジ)。鍵盤や PC を Keys へパッチすると鳴っている音が見えます。 Keys は受けた音を先へ流さないので、鍵盤の音も聞きたいときはシンセへのパッチも張ります。

スクリプトから

keys = UI::Keys.new(octaves: 2, low: 48, velocity: :position, device: MIDIDevices.amy)
MIDI.route(MIDIDevices.usb_midi_host, keys)   # 外部鍵盤の演奏で鍵を光らせる
keys.set_color([48, 52, 55], :blue)           # 和音やスケールを表示
keys.show
シミュレーターで開く ▶

詳細: docs/KEYS.md

Sequencer

Tab5・CoreS3・CrowPanel16 ライン × 16 パターン

セット全体を回すパターンシーケンサー。ソングは最大 16 本のライン(トラック。ラインごとに MIDI チャンネル)と 16 個のパターンからなり、チェーンでパターンを順番に再生します。ラインごとに長さを変えられるので、 長さの違うラインを並べればポリリズムになります。

タイミングと再生

  • Sequencer は受け取った MIDI クロックで進みます。初期状態で Tempo → Sequencer のパッチ(クロックだけ)があるので、Tempo 画面の BPM で動きます。 ほかの機材に合わせるときは、MIDI Devices でその機材 → Sequencer を Clock で張り替えます。
  • Sequencer 画面の Play / Stop は、クロックが Tempo から来ているなら Tempo を(それに従うほかの機材ごと)再生・停止します。 Tempo 画面の Play や外部機材の Start でも動きます。
  • ノートは MIDI Devices で Sequencer からパッチした先へ、ラインのチャンネルで送られます。

パターンとチェーン

操作動作
パターン(1〜16)をタップそのパターンへ。停止中はすぐ、再生中は今のパターンの終わりで切り替わります(待っている間は点滅)。チェーンはオフになります。
パターンを長押しメニュー: Edit here(別のパターンを再生したままこのパターンを編集)、Copy、Paste、Clear、Length。
Chainタップでオン / オフ、長押しで順番と繰り返し回数の編集。
◀ ▶ / 8・16 / Follow長いラインを半ページずつ送る、8 か 16 ステップ表示、再生位置に追従。

ライン

操作動作
ライン見出しをタップラインを選ぶ(REC と Follow の対象)。
Mミュート / 解除。
ライン見出しを長押しラインの設定: Grid / Realtime、チャンネル、ステップ数、レート、小節数、ベロシティ、ゲート、クオンタイズ、録音モード、プログラム・バンク、名前、このラインの Copy / Paste / Clear、Delete。
+ Lineラインを足す。

グリッドにノートを置く

グリッドに置くのは和音: Keys や Sequencer へパッチした鍵盤で最後に弾いた音です(ヘッダに表示。タップで試聴)。

操作動作
空のマスをタップ和音を長さ 1 ステップで置く。
空のマスを押してドラッグドラッグした長さで和音を置く。
ノートのあるマスをタップそこから始まるノートを消す。
ノートのあるマスを押してドラッグ長さを変える。
ノートのあるマスを長押し和音で置き換える。

録音

ラインを選んで REC をタップすると録音待機。Sequencer が動いている間に弾いたものが、再生中のパターンに録音されます。 overdub / replace とクオンタイズはラインの設定で選びます。停止中は録音しません。

保存

  • File(ソング名を表示。* は未保存の変更あり): Save、Save new、Load、New、Delete(2 回押し)、Close。 ソングは /sd/patterns/ に保存されます。
  • 作業内容は自動でも保存されます(最後の変更から 5 秒後、編集が続いていれば 60 秒ごと、Stop のとき)。再起動しても戻ります。

スクリプトから

seq = UI::Sequencer.current        # 画面のソング
seq.on_pattern { |e| UI.log("pattern #{e[:pattern]}") }
seq.show
シミュレーターで開く ▶

詳細: docs/SEQUENCER.md

Tombola

Tab5・CoreS3・CrowPanelボール最大 16 個

回転する多角形の中でボールが跳ね、辺に当たるたびにその辺の音が鳴ります。強く当たるほど大きな音。 初期状態ではドラムキット(チャンネル 10 の GM ドラム)を鳴らします。

操作動作
Start / Stop(ナビバー)開始 / 停止。ボールがなければ 3 個入れて始めます。
多角形の内側をタップそこにボールを足す。
ドラッグ多角形を手で回す。指についてきて、指を止めれば止まります。弾くとボールが飛び散ります。離すと設定の速さで回り始めます。

隅の文字は辺の数・回転(rpm)・重力・反発・ボールの数。ほかの画面を見ている間も演奏は続きます。

MIDI Devices で

  • Tombola → 機材: 当たった音がその機材へ。
  • 機材 → Tombola: 押さえたノートごとに、その音を鳴らすボールが増え、離すと消えます。
  • Tempo → Tombola: Tempo の Play / Stop で回る・止まる。

スクリプトから

t = UI::Tombola.new(sides: 6, rotation: 12, gravity: 0.5, device: dev)
t.scale = [36, 38, 42, 45, 46, 49]   # 辺 N → scale[N % size]
t.add_ball(color: :red)
UI.pad(1, label: "Faster") { t.rotation += 4 }
t.start
t.show
シミュレーターで開く ▶

ほかに gravity_mode(:down / :center / :none)、bounce、friction、ball_size、channel、duration、on_hit。

詳細: docs/TOMBOLA.md

Tempo

Tab5・CoreS3・CrowPanel20〜300 BPM

MIDoRI のマスタークロック。MIDI Devices でパッチした機材すべてに MIDI クロックを送り、セット全体の Start / Stop を出します。 ほかの機材のクロックに合わせて、それを送り直すこともできます。

操作動作
BPM をタップタップテンポ。ナビバーの TAP も同じ。
BPM をスワイプ上・右で速く、下・左で遅く、1 BPM ずつ。スワイプ中は数字が黄色。
▶ Play / ■ StopMIDI Start / Stop を送ります。再生中は BPM が緑。
USB-H / USB-D / DIN / BLE外部クロックの出どころ(USB の機材、パソコン、DIN / TRS ジャック、Bluetooth)。Ext: にそこから測った BPM が出ます。
Sync外部クロックに追従(BPM が水色)。Tempo からパッチした機材もそれに従います。

クロックを送るのは Tempo からパッチした機材だけ(Tempo は MIDI Devices の行に出ます)。多くの機材が期待するとおり、 Play を押していなくてもクロックは流れ続けます。

スクリプトから

MIDI.route(UI::Tempo, MIDIDevices.usb_midi_device)   # DAW へクロック
UI::Tempo.bpm = 128
UI::Tempo.start                                      # .stop / .tap / .sync = true
UI::Tempo.on_change { |bpm| UI.knob_set(1, bpm, notify: false) }
シミュレーターで開く ▶

詳細: docs/TEMPO.md

AMY

Tab5・CrowPanelスピーカー / ヘッドホン

内蔵シンセサイザー(AMY)。ボードのスピーカー(Tab5 はヘッドホンも)から鳴り、 音源は FM(DX7 のプリセット 128 種)と Synth(Juno-60 のプリセット 128 種を持つアナログ風シンセ)の 2 種類。 Home の AMY タイルから、スクリプトなしで音色を組むパネルを開けます。

AMY パネル

画面の部分動作
タブタブ 1 枚 = パート 1 個(MIDI チャンネルに載った音色)。+ → + FM / + Synth で、空いている一番小さいチャンネルに足します。最大 8 枚。
<< < > >>プリセットを 1 つ / 10 個ずつ前後へ。
Ch- / Ch+パートの MIDI チャンネル(1〜16)。同じチャンネルのパートは重なって一緒に鳴ります。
Del2 回押し(Sure?)でパートを消す。
エンベロープハンドルをドラッグ(A: 横、D: 横と縦、S: 縦、R: 横)。Synth は Amp と Filter、FM はオペレータを 1 つずつ(Op n で選ぶ)。
ノブSynth: Cutoff・Reso・FltEnv・KeyTrk・Glide・Pan・Volume・Reverb。FM: Algo・Feedbk・OpLvl・Ratio・Cutoff・Reso・Volume・Reverb(Reverb は全パート共通)。
鍵盤パートのチャンネルで試し弾きする 1 オクターブ。Oct- / Oct+ で移動。
  • ほかの機材から AMY を弾くには、MIDI Devices でその機材 → AMY をパッチします。AMY は初めて必要になったときに起動します。
  • スピーカーとヘッドホンの音量は Settings 画面。Tab5 はヘッドホンを挿すとヘッドホンの音量に切り替わります。
  • パネルで組んだパートはまだ保存できません(スクリプトを実行すると消えます)。

スクリプトから

amy = MIDIDevices.amy
fm  = amy.add_fm(channel: 0, patch: 128)      # DX7 のプリセット
syn = amy.add_synth(channel: 1, patch: 5)     # Juno-60 のプリセット
syn.cutoff = 900
MIDI.route(MIDIDevices.usb_midi_host, amy)    # 鍵盤から弾く
シミュレーターで開く ▶

詳細: docs/AMY_SYNTH.md ・ docs/AMY_PANEL.md

MIDI Devices(MIDI Info)

Home のタイル: MIDI Info最大 16 台

パッチベイ。行が MIDI IN(MIDI の出どころ)、列が MIDI OUT(行き先)。セルの丸は「その行から来たものを その列へ送る」という意味です。ここで張ったパッチはすぐ保存され、電源を入れ直しても戻ります。

操作動作
セルをタップパッチの付け外し(全チャンネル)。外すと、使っていたチャンネルに All Notes Off を送るので音が残りません。
セルを長押し → Ch通すものを選ぶ: All、Clock(クロックと Start / Stop だけ)、チャンネル 1〜16(複数可)、Off。Done か外側のタップで閉じます。
セルを長押し → FiltersMIDI フィルタ(プラグインのコード・アルペジオなど)を選んだ順につなぐ。選んだフィルタを長押しで設定。
行・列の名前を長押しデバイスの詳細: 状態、製品名、転送の回数(MIDI が届かないときの切り分けに)。
グリッドをドラッグ収まらないときにスクロール。名前の行・列は固定です。
左上の角のボタンAll(全部)/ Patched(パッチのあるものだけ)/ Unpatched(ないものだけ)を切り替え。

グリッドの見方

  • 行の名前の丸: 緑 = 接続中、灰色 = 未接続。列の名前の下の線: 黄 = 待機中(起動前の AMY)。
  • つながっていない機器のパッチは灰色の輪。機器が戻ればそのまま効きます。
  • セルの左下は通すチャンネル(1-4,10,clk)、右上の f2 はフィルタ 2 段のチェーン。

並ぶデバイス

名前中身
(製品名)USB MIDI 機器。USB ハブ越しに最大 4 台。
PCUSB でつないだパソコンや iPad(midi_device モード)。
SAM2695SAM2695 ユニット(GM 音源と DIN / TRS ジャック)。
BLE /(機器名)Bluetooth でつながった iPad や Mac と、MIDoRI からつないだ BLE-MIDI 機器。
AMY内蔵シンセ(OUT のみ)。
Keys・Sequencer・Tombola画面の楽器(IN と OUT の両方)。
Tempo・XYPad送るだけ(IN の行のみ)。
Script実行中のスクリプト。Script の行がスクリプトの出力の行き先、列がスクリプトが聞く入力の出どころ。

スクリプトから

md = UI::MIDIDevices
md.patch(MIDIDevices.usb_midi_host, MIDIDevices.amy)
md.patch(MIDIDevices.usb_midi_device, MIDIDevices.sam2695, channel: [0, 9, :clock])
out = md.output            # Script へ送る = Script のパッチの先へ出ていく
md.input.on(:note_on) { |m| out.note_on(m.note + 12, m.velocity) }
md.save                    # スクリプトが張ったパッチはスクリプト限り(save で保存)
シミュレーターで開く ▶

詳細: docs/UI_MIDI_DEVICES.md ・ docs/MIDI_FILTER_REGISTRY.md

Bluetooth

Tab5・CoreS3iPad / Mac 1 台 + BLE-MIDI 機器 2 台

BLE-MIDI は両方向。Device としては iPad や Mac から Bluetooth MIDI 機器として見え(名前は 「Midori Tab5」「Midori CoreS3」)、Host としては BLE-MIDI の鍵盤やアダプタ(WIDI など)へこちらからつなぎます。

操作動作
Device On / OffiPad や Mac から見えるようにする。下に名前と状態(advertising / connected)。
Host On / OffBLE-MIDI 機器へつなぎに行く。
Scan(ナビバー)BLE-MIDI 機器を 8 秒間探す。もう一度押すと止めます。
一覧の機器をタップ接続 / 切断。
x(右端)既知の機器を忘れる。
一覧をドラッグスクロール。
  • 一覧は接続中の機器(紺)、既知の機器(*)、スキャンで見つかった機器(電波の強さつき)の順。
  • 一度つないだ機器は、Host がオンの間は自動でつなぎ直します(自分で切断したものを除く)。
  • On / Off は保存されます。つながった機器は MIDI Devices に出て(iPad / Mac は BLE、機器は機器名)、Tempo は BLE のクロックに同期できます。
  • Mac は「Audio MIDI 設定」→ MIDI スタジオ → Bluetooth から、iPad はアプリの Bluetooth MIDI 設定からつなぎます。 MIDoRI を入れ直したあとペアリングできないときは、iPad / Mac の Bluetooth 設定で「Midori」を削除してからやり直してください。

スクリプトから

widi = BLE_MIDI_HOST.connect("WIDI")          # 名前で(必要ならスキャン)
dev  = MIDI::Device.new(MIDIDevices.ble_midi_host("WIDI"))
MIDI.route(MIDIDevices.ble_midi_device, MIDIDevices.amy)   # iPad → AMY

詳細: docs/BLE_MIDI.md