Gish::monome Beat Slicer written in ChucK (English)

DSC09927


Gish is Beat Slicer written in Chuck programming enviroment for monome.
(日本語はこっち)


Download here(GitHub).
http://github.com/soundflower/Gish/tree/master

Features

4 Audio Tracks
Editable parameters:
Plyaback position select, Pitch, Reverce and Beat Repeat

OSC Settings

Prefix /chuck
Receive port 8080
Send port 8000

How To Run

1.Aassign Audio file path
2.Launch Cish.ck(Add Shread button or cmd+) on miniAudicle
3.Push Enter key.(Enter key is assigned Sequnecer start button.)
4.When you push space key, monome LED params change.

HID Keyboad assignments

enter Start/Stop Sequence
space monome LED Params Change∗
z Select Track 01
x Select Track 02
c Select Track 03
v Select Track 04
a BPM-5
s BPM+5
delete All LED Off

∗ when you push space key, parameters LED change(sample => pitch => reverce => repeat => sample... loop).

LED Pamams Assignmets

Sample playback position

When you push a lighting LED(selected sample position), this step is muted.

Pitch

Reverse

Beat Repeat

Gish::monome Beat Slicer written in ChucK

DSC09927


monomeのためのBeat Slicerなシーケンサー。です。
(english docs is here.)

たまにコード書いては盛大に放置しつつあったので、中途半端だけど現状のもので放出してしまう。
個性というかアクの強さというかバグというかを回避しつつやってたけど、
アプリ的なカチッとしたものを作るには向いてないぞ、ChucK。
ガーッと書き捨てる感じで使うのがいいですね。。。


GitHubに上げたので、ここから。
http://github.com/soundflower/Gish/tree/master

キーボードでパラメータ切り替えながらPICnome使うのが面倒なんでTouchOSCを併用してるけど、
みんなが持ってるわけじゃないと思うんでGitHubに上げたコードからは一旦外してます。
キー入力からボタンの状態を制御したために、GUIからボタン押したときの挙動が怪しいです。
miniAudicleのエディタ以外のウインドがカレントになってるとキー入力のたびに警告音鳴るので、
システム音声の出力と別なAuido IFから出力するようにminiAudicle側で設定したほうがいいです。

機能

オーディオ4トラック
パラメータ:
オーディオサンプルの再生位置、オーディオサンプルの再生ピッチ、逆再生、リピート

Sampleの元BPMとか拍の頭とか無視して強引に8つにチョップしてるので、
元のフレーズはきっちり再現しないです。
頑張れば起動時にSampleを走査して閾値以上のピークを検出できそうだけど、
そこまでやるならもっと簡単に実現できる別の環境でやったほうがいい。

OSCの設定

Prefix /chuck∗
Receive port 8080
Send port 8000

∗Gish.ckの実行時にOSCコマンドで勝手に割り当てるので特に気にする必要ないです。

操作方法

1.オーディオファイルのパスを指定(111行目から)
2. miniAudicle上でGish.ckの実行(Add Shreadボタンかcmd+)
3.Enter keyでシーケンスのスタート
4.スペースキーでmonomeのパラメータ表示の切り替え

(PCの)キーボードの設定

enter シーケンスのスタート/ストップ
space monomeのLED表示の切り替え
z Track 01の選択
x Track 02の選択
c Track 03の選択
v Track 04の選択
a BPMを5下げる
s BPMを5上げる
delete 全てのLEDを非点灯にする

LEDのパラーメタの割り当て

行は常にシーケンスのSTEPになります。
行のLEDの点灯で再生STEP位置を示してます。

オーディオサンプルの再生位置

点灯してるボタン(現在選ばれてる再生位置)押すと、そのSTEPがミュートになります。

オーディオサンプルの再生ピッチ

逆再生

リピート

ChucK(miniAudicle)のMAUI

ChucKGUIScreenCapture01


on the flyのlivecodingが基本のChucKなんだけど。
macのmidiAuidcleだけ?)簡易的なUser Interface Elements APIが使えます。


現状(mac版の0.1.3.9 (alpha))だと

MAUI_View ウインドウ
MAUI_Gauge プログレスバー
MAUI_LED LED
MAUI_Button ボタン(プッシュ/トグル)
MAUI_Slider スライダー

が使えます。
せめて単なるラベルが欲しかったけど。。。贅沢は言えん。


ボタンやらスライダーのインスタンスをつくってMAUI_ViewにaddElementするだけです。

MAUI_View control_view;
MAUI_Button screenSelect[8];
MAUI_Button trackSelect[4];
MAUI_Slider bpmChange;
string buttonLabel[8];

//ウインドウの初期化
control_view.size(430, 300);
control_view.name("Beat Slicer::Monome");

//スライダー
"BPM" => bpmChange.name;
bpmChange.display();
bpmChange.irange(20, 200);

bpmChange.range(20, 200);
bpmChange.size(420, bpmChange.height());
bpmChange.position(10, 0);
bpmChange.value(bpm);
bpmChange.name("BPM");
control_view.addElement(bpmChange);

80 => int y;
0 => int pos;

//トグルボタン・グループ1
for (0 => int i; i < 4; i++) {
	trackSelect[i].toggleType();
	trackSelect[i].size(125, 75);
	trackSelect[i].position(pos, y);
	trackSelect[i].name("Track "+(i+1));
	control_view.addElement(trackSelect[i]);
	
	100 +=> pos;
}

160 => y;
0 => pos;

//ボタンのラベル*8
"Sample"  => buttonLabel[0];
"Gain"    => buttonLabel[1];
"Attack"  => buttonLabel[2];
"Release" => buttonLabel[3];
"Pitch"   => buttonLabel[4];
"Pan"     => buttonLabel[5];
"Reverce" => buttonLabel[6];
"Repeat"  => buttonLabel[7];

//トグルボタン・グループ2
for (0 => int i; i < 8; i++) {
	screenSelect[i].toggleType();
	screenSelect[i].size(125, 75);
	screenSelect[i].position(pos, y);
	screenSelect[i].name(buttonLabel[i]);
	control_view.addElement(screenSelect[i]);
	
	if (i == 3) {
		50 +=> y;
		0 => pos;
	}
	else 100 +=> pos;
}

//表示
control_view.display();


で、実行するとこんな感じです。

ChucKGUIScreenCapture02


こいつら全てEventクラスを継承してるので、ボタンが押された時の処理とかはイベントリスナでonChangeなEventを拾ってごにょごにょします。イベントリスナは明示的に別プロセス(ChucKではshredとか言う)で走らせます。
ちなみに、ChucKはプロセスの同期/非同期とタイミング合わせが簡単にできるように用意されていて、Strongly-timedだと言うだけはあるなぁ、と。


で、リスナはこんな感じです。

//イベントリスナのプロセス登録
spork ~changeBPMListener();

//リスナ関数
function void changeBPMListener() {
	while(true) {
		//何か処理
	}
}


排他的なトグルボタン・グループみたいなやつの場合。

//ボタンの数だけリスナのプロセスを登録しとく
for(0 => int i; i < 4; i++) spork ~ trackSelectListener(i);

//リスナ関数
function void trackSelectListener(int index) {
	while (true) {
		trackSelect[index] => now;//ボタンが押されるのを待ってる
		
		//他のボタンをオフする
		for(0 => int i; i < 4; i++) {
			if(i != index){
				trackSelect[i].state(0);
			}
		}
		
		//ここで再度明示的にオンにしないとうまく動作しない場合があったので一応
		trackSelect[index].state(1);
		
		trackSelect[index] => now;//ボタンが離されるのを待ってる
	}
}


上のコードの

trackSelect[index] => now;

が慣れないと気持ち悪いんですけども。

10::ms => now;

みたいな単純な時間単位のsleep的な使い方以外に、プロセスを適切な時間(次回のイベントがトリガーされるまで)だけ待つっていうした使い方ができて、今回はこっちです。


nowはChucKで重要なスペシャルワードなんで、詳しいことはここ見てくださいー。


そんなこんなで、ボタンパッドだけの操作を補完するのにUIとHIDのキー入力のコード書いてたら、Monomeアプリ完成しないんですけども。。。たいした機能とか無いのにさ。

Audio Preview: ChucK Beat Slicer App for monome

DSC09704


MIDIアウトなChucKアプリだと早々に飽きたので、Beat Slicerなやつを同じくChucKで。今度はChucKだけで完結させてます。ボタン64個の制限の中でどの機能を残して何を捨てるか、悩んで弄くり回してたら1日じゃ完成しそうにないので、SoundCloudを使ってみたく実装途中のやつで適当に素材鳴らしてさっと録ってみた。


てか、はてなにはSoundCloudのPlayer貼れないんですね。ガックシ。
しゃーないので、恥ずかしながらリンクで貼る。
http://soundcloud.com/soundflower/audio-preview-chuck-beat-slicer-app-for-monome
勢いで一発録り&DAWで何も処理してない素のまま。ChucK内のCompだけ。
展開作る準備もないので尺も30秒ほど。


そろそろChucKで作るのキツいんだけど、ハード本体がオープンなのにAppが商用のばっかりとかどうなんすか?って気がするので、もうちょっとChucKで頑張る。


ChucKのモジュラー指向なルーティングをもっと使いたいけど、何せボタンが64個。
もう1台あれば、シーケンス部分とオーディオ部分で使い分けて色々できそうなんだけど。

ChuckPolyStep64

DSC09778


PICnomeで使うのにChucKでPolyphonicなMIDI Noteを出力する簡単なStep Sequencerつくりました。
もちろん、本家monomeでも大丈夫だと思う。


ChucKを初めて触ってよく分からんままに作り始めたので、最低限無いと困る機能しか実装してないです。
ファイルはgithubに置いてますので、ここからダウンロードしてくださいまし。


miniAudicleで使うことを前提にしてるので事前にインストールが必要です。原因が分からないけど、鳴らす音源側のMIDI PortがChucKから見えない/音源側からChucKのMIDI Portが見えない組み合わせがある(その場合の方が多いかも・・・)ので、Max上で単純にMIDI NoteをスルーするだけのMIDI Bridgeを入れておいたので必要なら使ってください。何らかの方法でもうちょっとスマートに解決したいけど。

ChucK側から見てMIDI Portのリストの最初のやつに自動で接続するようにしてるので、

    1. Max(必要な場合のみ)
    2. 何か音源
    3. ChucK

の順で起動してください。って、めっちゃ面倒ですね。昔のrewireを思い出す・・・。

MIDIのルーティングをIAC Driver経由にすることでMax不要でした。また、これなら起動順も気にしないで済むので、色々面倒が解決します。(※Macの場合です。)

Audio MIDI設定で以下のように設定しておくだけです。


OSCのPrefixは/chuckになってます。
Add Shred(スクリプトの実行)したときに/sys/prefixで自動で指定するので、Serial側の事前設定は不要です。
MIDIチャンネルは現状Ch.01で固定で済ませてます。
LED0 0〜0 7までの1行目は機能ボタンとして割り当てて、残りの2〜8行のLED列はそれぞれのNoteのキーを割り当ててます。


1行目の機能割り当ては以下です。

LED 0 0 Start/Stop
LED 0 1 割り当て無し
LED 0 2 全部のキーのオクターブ下げ
LED 0 3 全部のキーのオクターブ上げ
LED 0 4 発音のDuration下げ(+10ms)
LED 0 5 発音のDuration上げ(-10ms)
LED 0 6 BPM下げ(+2beat/sec)
LED 0 7 BPM上げ(+2beat/sec)


物理的制限でキーの割り当てが7音階分しかなくて、オクターブ単位で上下するようにしちゃったので、遺憾ながらG、G#、A、A#、Bが永久的に鳴らないという。
1Shotのトリガーを想定してたんでこうなったんですけど、さすがにこれはもう少し細かいSTEPで上下するようにした方がいいかな。。。


以下、補足。
Prefixの変更は

"/chuck" => string prefix; //OSC Message prefix

を適当に書き換えで。


2番目以降のMIDI Portに接続するようにするには

if (!midiOutPort.open(0)) me.exit();

のopen()の引数を変更です。

for(0=>int i; true; i++){ 
   if (!midiOutPort.open(i)) me.exit(); 
   if (midiOutPort.name() == " to MaxMSP 1") break;
  <<<"MIDI device:"+midiOutPort.num()+"->"+midiOutPort.name()>>>;
} 

ってやって、デバイス名でMIDIポートを引っかけてもいいんだけど、デバイス名の頭に半角スペース入ってたりして、混乱するので止めてます。


音源との間にいちいちMax経由するのがイヤだなぁ。というとか、何とかならんのですかね。これ。
こんなことなら普通にMaxで作ればよかった。かも。


ChuckPolyStep64Screen


まぁ、何にせよmeeqが高機能でオススメです(笑


機能をいっぱい盛り込むならmeeqとか64Stepみたいなページ(というか機能の)切り替え必須ですね。
現場で集中して使うときにページ切り替えはミスする余計な要素かと思って今回はあえて避けたけど。自動演奏的な方向には行かないとして、64個のボタンでやりくりするにはページ切り替えは避けられないのかな。
それとも、PICnome256とか?

LEDの色ムラと拡散キャップ

DSC09700


さっき海外の方から「お前のLEDってムラなく光ってるように見えるけど何で?」って聞かれたので、回答兼ねて実験してみました。結論としては上の写真のように拡散キャップ使ってるんだけなんだけど、キャップ有り/無しとか値段の違いでどんだけ変わるか試してみました。


DSC09689


左から

です。LEDは超高輝度青LED OSUB516A-PQで指向性は60度です。


DSC09691


まずは単純に光らせてみた。
キャップ無しは横方向はよく見えないです。
写真じゃ分かりにくいけど、30円の高級キャップの方が透過率が高いらしく光は強いように思います。


DSC09696


Sparkfun製ボタンパッドを被せてみた。手で持って被せてるのでパッド面との距離は誤差あります。
指向性60度でもキャップ無しだと頂点部だけクッキリ円形に光ります。
30円高級キャップは透過率が高いせいで、やや円形です。
4円キャップは比較的キューブ全体が光るような状態になります。


ちなみに30円高級キャップは密着度が高くサイズがタイトなので、ピッタリと奇麗に付けるのに苦労しました。破らずに取るのはもっと苦労しましたが。
4円キャップはカット面が揃わないくらいの値段相応のいい加減っぷりですが、今回はこれが一番いい感じだったのでコレ付けてます。30円キャップ×64個は無駄に高い気がしたので、最初からお試しで1個しか買ってませんけどね。。。


そもそも上に厚めのフェイスプレート載せたりすると、横の面は明瞭に光ってる必要すらなかったりするだろうけど。
まぁ、何かの参考までに。

PICnome Kit完成&無事に動作しました(※一部修正)

DSC09669


PICnomeのKitですが、忙しくて手が出せない日が続いたり、そもそも慣れないハンダ作業が遅いとかもあって、時間かかっちゃいましたが、やっと完成しました。そんでもって、ちゃんと動きました。よかった。


最初、ポートからは見えてるのに動かないので一瞬取り乱しましたが、

/var/lock

が無くてPICnomeSerialとの接続ができてないのが原因でした。
対処法はここにバッチリあります。


PICnome Kit & max/msp PICnome Kit Buttonpads


使ったLEDは超高輝度青LED OSUB516A-PQです。
上の写真だとMac側はMax5PICnome_testだけど、他のアプリケーションはこのへん参照で。


DSC09672


このあとまず何とかしたいのは

  • なんとしてイイ感じのケースに納める
  • 正方形のどの辺を上にするかをソフトウェア的に指定したい PICnomeSerial v1.0rc2にて対応済み(07.22.09修正)

ですね。


とりあえず適当な台(例によってLEGO)に載っけてるだけなんで、危なっかしいやら壊われそうやら。
monomeを弁当タッパーみたいのに入れてるDIYもあるけど、気持ちが高速で盛り下がりそうなので、やっぱりそこそこイイ感じにしたいですよね。PonokoArduinomeのフェイスプレートのepsが既にあるし、epsで発注できる手軽さがステキだから、ここでアクリル加工してもらおうかと思ったけど、送料高いねー。どうすっかな。


2つ目は、利き手とかUSBポートの位置とのケーブルの取り回しで便利だと思うんですが、ソースあるんだからとっとと自分でやれよっですね。はい。何とかします。
tkrworksさんに早急にご対応頂き、PICnomeSerial v1.0rc2にてCable Orientation機能が実装されました。v1.0rc2についてはここ
(07.22.09修正)


あと、Sparkfun製のボタンがややフニャ&ストロークが深いので、ボタン間隔が狭くて浅め&重めのストロークのがあると、より楽器的に使えそう気がしますが、こいつを自作するのは難しそうですね。。。