Johakyu
このページの機能は Harucom OS 2.0 から使えます。
Johakyu(序破急)は、音と照明をパターンで動かすライブコーディング環境です。 TidalCycles や Strudel と同じようにDSLを書いて演奏します。
スクリプトを書き換えて Ctrl-Enter を押すと、 音を止めずに、次のサイクル(1周の区切り)の頭から新しいパターンに切り替わります。
ドラムマシンだけではなく、DMXモジュールを接続することで照明を制御することもできます。
目次
起動する
irb> johakyu
irb> johakyu /data/myshow.rb
ファイル名を指定しないと、新しいバッファが開きます。
/data/johakyu/starter.rb があれば、その内容がひな形として読み込まれます。
音を鳴らすには 3.5mm ジャックにイヤホンやスピーカーをつないでください。 照明を動かす場合は DMX モジュールの接続を先に済ませておきます。
キー操作
| キー | 動作 |
|---|---|
| Ctrl-Enter | バッファを評価する(次のサイクルの頭から反映される) |
| Ctrl-S | 保存して評価する(名前がなければ聞かれます) |
| Ctrl-O | ファイルを開く |
| Alt-1 〜 Alt-0 | シーンを切り替える(10個のバッファを行き来できます) |
| Ctrl-B | 照明をすべて消す |
| Ctrl-Z / Ctrl-Y | 元に戻す / やり直す |
| Ctrl-Q | 照明を消して終了する |
エディタは edit コマンドと同じで、シンタックスハイライトと自動インデント、
日本語入力が使えます。
書いたコードにまちがいがあっても、演奏は止まりません。 エラーが出た場合はその評価が捨てられ、前のパターンがそのまま続きます。
パターンを書く
1周する長さの単位を「サイクル」と呼びます。テンポは tempo で決めます。
tempo 120
track(:drums) { sound("bd ~ sd ~") }
これで「バスドラム・休み・スネア・休み」が1サイクルの中で等間隔に鳴ります。
トラック
track(:名前) { ... } でパターンに名前を付けます。名前ごとに独立して差し替えられるので、
1つのトラックだけを書き換えたときは、ほかのトラックは何も影響を受けません。
track(:drums) { sound("bd*4") }
track(:hats) { sound("hh*8") }
_track にするとそのトラックだけ鳴らなくなります。消さずに一時的に止められます。
_track(:hats) { sound("hh*8") }
評価するたびに、バッファに書かれている内容が全体の状態になります。 書いていないトラックは消えるので、バッファを空にして評価すればすべて止まります。
ミニ表記
パターンは文字列で書きます。この書き方をミニ表記と呼びます。
| 書き方 | 意味 |
|---|---|
bd ~ sd ~ |
順番に並べる(~ と - は休み) |
bd*2 |
その場所で2回鳴らす |
bd!3 |
3つ分の場所に並べる |
bd/2 |
2サイクルに1回鳴らす |
[bd hh] |
1つの場所にまとめる |
<a b c> |
1サイクルにつき1つずつ順番に使う |
bd, hh*4 |
同時に重ねる |
[c5,e5,g5] |
1つの場所で重ねる(和音になる) |
bd:2 |
サンプルの番号を指定する |
_ |
直前の音を伸ばす |
track(:drums) { sound("bd*2 [~ sd] bd sd, hh*8") }
音を鳴らす
sound にドラムの名前を渡します。
| 名前 | 音 |
|---|---|
bd |
バスドラム |
sd |
スネア |
hh |
ハイハット |
oh |
オープンハイハット |
cp |
クラップ |
lt |
ロータム |
ht |
ハイタム |
rim |
リムショット |
音は /data/drums の WAV が使われます。ファイルがない場合は、
Synth がその場で音を作ります。
音程のある音を鳴らす
note を使うと音階のある音が鳴らせます。
track(:lead) { note("c5 e5 [c5,e5,g5] ~").sound("saw").gain(0.6) }
c5 が真ん中のド(262 Hz)です。c#5 や cs5 でシャープ、eb5 でフラットになります。
数字を省くと5オクターブ目になります。
.sound で波形(sine、square、tri、saw)、.gain で音量(0〜1)を指定できます。
同時に鳴らせるのは3音までです。
パターンを変形する
パターンにはメソッドをつなげて変化を付けられます。
| メソッド | 動作 |
|---|---|
fast(n) / slow(n) |
速くする / 遅くする |
rev |
逆順にする |
every(n) { ... } |
n サイクルに1回だけ変形する |
euclid(pulses, steps) |
ユークリッドリズムにする |
degrade_by(amount) |
ときどき音を抜く |
segment(n) |
なめらかな値を n 個に区切る |
range(min, max) |
値の範囲を変える |
add / sub / mul / div |
値を計算する |
track(:drums) { sound("bd*4").every(4) { |p| p.fast(2) } }
信号でなめらかに動かす
sine、cosine、saw、isaw、tri、square_signal は、
時間とともになめらかに変わる値です。音量や照明の動きに使います。
track(:wash) { dmx(:s1).dimmer(sine.slow(4)) }
range で範囲を変えたり、slow でゆっくりにしたりできます。
照明を動かす
照明を登録する
使う照明を fixture で登録します。定義ファイルは /data/dmx/fixtures に置いた
Open Fixture Library の JSON を使います。
fixture :s1, "shehds_80w_led_spot_light", mode: "13ch", address: 1
fixture :s2, "shehds_80w_led_spot_light", mode: "13ch", address: 14
group :all, :s1, :s2
group で複数の照明をまとめると、いっぺんに動かせます。
照明の登録はスクリプトの先頭に書いてください。
fixture を書かなかった場合は、いま登録されている照明がそのまま残ります。
照明のパラメータ
dmx(:名前) に続けてパラメータを指定します。値は 0.0 から 1.0 で表します。
track(:s1) { dmx(:s1).dimmer("0 1 1 1").color("<red blue green>") }
track(:move) { dmx(:all).pan(sine.range(0.3, 0.7).slow(8)) }
| パラメータ | 意味 |
|---|---|
dimmer |
明るさ |
color |
色 |
pan / tilt |
向き(左右 / 上下) |
strobe |
ストロボ |
gobo |
ゴボ(模様) |
focus |
フォーカス |
prism |
プリズム |
speed |
動きの速さ |
どのパラメータが使えるかは照明の機種によります。定義ファイルに載っているものだけが使えます。
色などの名前も定義ファイルから読み込まれるので、color(:red) のように名前で指定できます。
値をそのまま指定したいときは raw を使います。
dmx(:s1).raw(:pan, 200)
音のパターンに照明をつなげると、音に合わせて照明が動きます。
track(:drums) { sound("bd*4").color("<red blue>") }
spread を使うと、グループの中で少しずつ値をずらせます。
track(:chase) { dimmer("1 0").spread(0.5, on: :all) }
プログラムから使う
johakyu アプリを使わずに、自分のプログラムからパターンを鳴らすこともできます。
require "board/pwm_audio"
require "johakyu/dsl"
session = Johakyu::Session.new(audio: Board::PWMAudio.new, bpm: 120)
session.load_kit
session.bind_statement(:drums, Johakyu.sound("bd*4 , hh*8"))
loop do
session.update
sleep_ms 10
end
session.update はかならず毎回のループで呼んでください。ここで音の予約と照明の書き込みが行われます。
照明も使う場合は DMX.keepalive もあわせて呼びます。