Groovyでリズムボックス。 #gadvent2012
G* Advent Calendar 2012
12/2号!
一日目の、(今のところ)部下でもあり遅刻魔の @kiy0taka より紹介を受けました、 @tyamaです。
なんだかんだで一週間出っぱなしの長期出張から帰ってきて、iPad miniセルラー(白)の在庫も無いと言われて、、、ふて寝しておりました。
miniと言えば、まあ、関係無いですが、
思い起こせば、1年前のJGGUG合宿でMIDIを使って遊んだのを思い出しつつ、懲りずにまたMIDIを扱ってみました。
最初の予定はgoogle spread sheetで、小節パターンを書いて、、とかだったのですが。。
ま、いろいろありまして。 あれがあれなんで。。
コードはこちら。
import javax.sound.midi.* def addNote(track, channel, pitch, start, duration, velocity=127) { def message = new ShortMessage() message.setMessage(ShortMessage.NOTE_ON, channel, pitch, velocity) track.add new MidiEvent(message, start) message = new ShortMessage() message.setMessage(ShortMessage.NOTE_OFF, channel, pitch, velocity) track.add new MidiEvent(message, start + duration) return start + duration } def rbox = {bpm, score-> def seq = new Sequence(Sequence.PPQ, 4) def track = seq.createTrack() track.add new MidiEvent(new ShortMessage([0xC0,0x09,0x00,0x00] as byte[]), 0) def mm = new MetaMessage() int tempo = (60*1000000)/bpm; mm.setMessage(0x51,[tempo/65536, tempo%65536/256,tempo%256] as byte[], 3) track.add new MidiEvent(mm, 0) score.trim().replaceAll('\\|',' ').eachLine{line-> def partLine = line.split(':') def part = partLine[0] as int def notes = partLine[1].trim().split(' ') int time = 0 notes.each{note-> time = (note=='o')? addNote(track, 9, part, time, 1) : time + 1 } } MidiSystem.sequencer.with{ sequence = seq loopCount=Sequencer.LOOP_CONTINUOUSLY open() start() while(isRunning())Thread.sleep(1000) close() } } String.metaClass.gimmeabeat = {bpm-> rbox bpm, delegate} ''' 46:o 42:- - o - o - o - o - o - o - o -|o - o - o - o - o - o - o - o - 38:- - - - o - - - - - - - o - - -|- - - - o - - - - - - - o o - - 36:o - o - - - - - o - o - - - - -|o - - o - - - - o - o - - - - o 27:o o - - - - - - - - - - - - o o| 29:- - - - - - - - - - - - - - - o| 30:- - - - - - - - - - - - - - o -| '''.gimmeabeat(106)
リズムを組み替えて遊んでみたり、リズムに合わせてラップしてみたり、コードをラップしてみてはどうでしょう!
つづきまして、三日目は @nemo_kaz さんです〜。
追伸: もうgroovyConsoleでコードはかかない。。