leftovers...

about grails groovy

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でコードはかかない。。