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{...}」とかいてもいいんですけどね。