DjSL(Dj Specific Language)をざっくり書いてみる

DSL(Domain Specific Language)じゃなくてDjSL。つまりDJingに特化した言語。これができたらターミナルからDJができる。rubyでかけばirbでDJができる。DJとはいえbeat検知とか高尚なものは無くて、フツーにプレイリストの曲をダダ流しするだけなんだけどな!

せっかくなんでraop-clientというおもろそうなものを使ってAirMac Expressから音を出してみることに。つなみにraop-clientにmp3のデコードはできないのでlameインスコしてそれにおまかせ。

%w(rubygems raop).each{|x| require x}

class Dj
  def initialize(&block)
    @playlist = Array.new
    @raop = Net::RAOP::Client.new('YR AirMac Express IP')

    begin
      instance_eval(&block)
    ensure
      do_the_hustle
    end
  end

  def plays(song)
    @playlist << song
  end
  
  private
  def do_the_hustle
    @raop.connect
    @raop.volume = 5

    @playlist.each do |trak|
      th = Thread.new(trak) do |t|
        IO.popen("lame --mp3input --decode #{t} -"){|out|
          @raop.play out
          @raop.disconnect
        }
      end
      th.join
    end
  end
end

module Ron
  def self.hardy(&b)
    Dj.new(&b) if block_given?
  end
end

こんなふうにして以下のようにDSLingする。

Ron::hardy{
  plays("1.mp3")
  plays("2.mp3")
  plays("3.mp3")
}

ちなみにRon Hardyとはわたしが敬愛するこんなひとですよ。こういう風にかいたほうがDSLっぽいなと思ったから、こうしたわけであってべつにRon HardyじゃなくてLarry LevanでもGrandmaster Flashでもいいわけだし、「Dj.new{...}」とかいてもいいんですけどね。