#name=Roland A-49
# ↑使用しているデバイスの名前.
import transport # FLのTransport(Play, Stop, Pause & Record)を操作する.
import channels # FLのチャンネルラック操作.
import patterns # FLのパターン操作.
import plugins # FLのプラグイン操作.
import ui # FLのUI操作.
# 定義が見つからないのでここで定義してみる...
SONGLENGTH_MS = 0 # SONGモードの長さをMSで取得.
## ウィンドウID.
widMixer = 0 # ミキサー.
widChannelRack = 1 # チャンネルラック.
widPlaylist = 2 # プレイリスト.
widPianoRoll = 3 # ピアノロール.
# MIDI信号/CCの番号.
A49_MOD = 1 # モジュレーションの番号.
A49_C1 = 74 # C1ダイヤルの番号(Cut-off).
A49_C2 = 71 # C2ダイヤルの番号(Resonace).
A49_C1_SN = 16 # SuperNATURALモード時のC1の番号.
A49_C2_SN = 17 # SuperNATURALモード時のC2の番号.
A49_S1_SN = 80 # SuperNATURALモード時のS1の番号.
A49_S2_SN = 81 # SuperNATURALモード時のS2の番号.
## FUNCTIONキーで割り当てたCC.
A49_S1 = 2
A49_S2 = 3
VAL_MIN = 0 # 値の最小.
VAL_MAX = 127 # 値は0〜127まで.
## MIDI入力時に呼び出されるコールバック関数.
def OnNoteOn(event):
# イベントを処理する場合はこれをTrueにする.
event.handled = False
# FLが受け取ったMIDI信号を出力.
print("note on channel:%d number:%d"%(event.status, event.data1))
## CCメッセージ受け取り.
def OnControlChange(event):
# イベントを処理する場合はこれをTrueにする.
event.handled = False
# FLが受け取ったCCを出力.
print("CC channel:%d number:%d"%(event.status, event.data1))
print("- data2:%d"%event.data2)
#print("- pressure:%d"%event.pressure)
#print("- progNum:%d"%event.progNum)
#print("- controlNum:%d"%event.controlNum)
#print("- pitchBend:%d"%event.pitchBend)
#print("- isIncrement:%d"%event.isIncrement)
#print("- res:%d"%event.res)
#print("- inEv:%d"%event.inEv)
#print("- outEv:%d"%event.outEv)
#print("- midiId:%d"%event.midiId)
#print("- midiChan:%d"%event.midiChan)
#print("- midiChanEx:%d"%event.midiChanEx)
# 選択しているチャンネル番号を取得する.
channel_idx = channels.channelNumber()
#print(plugins.getPluginName(channel_idx))
# プラグインのパラメータをすべて出力.
#for i in range(plugins.getParamCount(channel_idx)):
# print(plugins.getParamName(i, channel_idx), ":", plugins.getParamValue(i, channel_idx))
# 再生位置を移動させられる.
#print("ui.jog:", ui.jog(1))
if event.data1 == A49_MOD:
print("setFocused(widPianoRoll)")
ui.setFocused(widPianoRoll) # ピアノロールにフォーカスする.
event.handled = True # FLに処理させる.
if event.data1 == A49_C1:
# ノブの位置で再生位置を移動してみる.
if transport.getLoopMode() == 0:
# パターンモード.
idx = patterns.patternNumber() # 現在選択しているパターン.
total = patterns.getPatternLength(idx) # パターンの長さ.
pos = int(total * event.data2 / VAL_MAX)
print("pos:", pos , " total:", total)
transport.setSongPos(1.0 * pos / total)
else:
# ソングモード.
total = transport.getSongLength(SONGLENGTH_MS) # 曲の長さ.
pos = total * event.data2 / VAL_MAX
print("pos:", pos , " total:", total)
transport.setSongPos(pos, SONGLENGTH_MS)
event.handled = True # FLに処理させる.
if event.data1 == A49_C2:
# チャンネルボリュームを変更する.
vol = 1.0 * event.data2 / VAL_MAX
channels.setChannelVolume(channel_idx, vol)
print("channel vol:%3.2f"%vol)
event.handled = True # FLに処理させる.
if event.data1 == A49_S1 and event.data2 > 0:
print("play/stop") # 再生/停止する.
transport.start()
event.handled = True # FLに処理させる.
if event.data1 == A49_S2 and event.data2 > 0:
print("stop") # 停止する.
transport.stop()
event.handled = True # FLに処理させる.
if event.data1 == A49_S1_SN and event.data2 > 0:
# プリセット変更(1つ前).
print("prevPreset")
plugins.prevPreset(channel_idx)
event.handled = True # FLに処理させる.
if event.data1 == A49_S2_SN and event.data2 > 0:
# プリセット変更(1つ先).
print("nextPreset")
plugins.nextPreset(channel_idx)
event.handled = True # FLに処理させる.
"""
# S1/S2をCCに割り当てない場合はこちらで再生/停止する.
if event.data1 == A49_C2:
# 再生/停止処理.
if event.data2 == VAL_MIN:
print("stop") # 停止する.
transport.stop() # C2が最小になったら停止.
event.handled = True # FLに処理させる.
if event.data2 == VAL_MAX:
print("play/stop") # 再生/停止する.
transport.start() # C2が最大になったら再生/停止.
event.handled = True # FLに処理させる.
"""
## プログラムチェンジメッセージのコールバック関数.
def OnProgramChange(event):
# イベントを処理する場合はこれをTrueにする.
event.handled = False
# FLが受け取ったMIDI信号を出力.
print("program change channel:%d number:%d"%(event.status, event.data1))
## システムエクスクルーシブのコールバック関数.
def OnSysEx(event):
# イベントを処理する場合はこれをTrueにする.
event.handled = False
# FLが受け取ったMIDI信号を出力.
print("sys ex channel:%d number:%d"%(event.status, event.data1))
## ピッチベンドのコールバック関数.
def OnPitchBend(event):
# イベントを処理する場合はこれをTrueにする.
event.handled = False
# FLが受け取ったMIDI信号を出力.
print("pitch bend channel:%d number:%d"%(event.status, event.data1))
print("- data2:%d"%event.data2)
if event.data2 > 64:
# ピッチを上げる.
print("setFocused(widPlaylist)")
ui.setFocused(widPlaylist) # プレイリストにフォーカスする.
event.handled = True # FLに処理させる.
elif event.data2 < 64:
# ピッチを下げる.
print("setFocused(widChannelRack)")
ui.setFocused(widChannelRack) # チャンネルラックにフォーカスする.
event.handled = True # FLに処理させる.