#!/usr/bin/env ruby -Ke # Id: timidity++r,v 1.5 2002/11/13 10:04:50 Yuukis Exp ScriptVersion = '0.4' DEBUG = false AutoNext = true MidiDir = '/home/kazane/mp3/midi/' MidiEntries = Dir.glob("#{MidiDir}*.mid") FileNames = MidiEntries FileNames.collect!{|fn| File.basename(fn)} require 'gtk' require 'kconv' class Timidity def initialize @timiPid = '' @gonext = true end def playmidi(filename) puts 'timidity.playmidi' if DEBUG stopmidi if AutoNext @gonext = true else @gonext = false end @timiPid = fork do exec("timidity #{MidiDir}#{filename} >/dev/null 2>&1") end puts "Just Timidity++ started. Pid is #{@timiPid}" if DEBUG end def stopmidi() puts 'timidity.stopmidi' if DEBUG @gonext = false begin `kill #{@timiPid.to_i+1} >/dev/null 2>&1` `kill #{@timiPid} >/dev/null 2>&1` puts "killed #{@timiPid} & #{@timiPid+1}" if DEBUG rescue puts 'No child processes' if DEBUG end @timiPid = '' end def stop?() if @gonext return(false) else return(true) end end def alive?() if @timiPid != '' return(true) else return(false) end end def getpid() puts @timiPid if DEBUG return(@timiPid) end def getname(filename) sequence = '' events = `timidity -Ol #{filename}` events.each{ |el| sequence = el if el =~ /^sequence:/i } sequence.gsub!(/^sequence: /i, '') sequence.gsub!(/\s\s*/, ' ') sequence.gsub!(/กก/e, ' ') sequence.chomp! sequence = "Can't Find Sequence" if sequence == '' while sequence =~ /^\s/ do sequence.gsub!(/^\s/,'') end return(sequence.toeuc) end end class State def initialize @change = false end def clear() @change = false end def change() puts 'state.change!' if DEBUG @change = true end def change?() if @change @change = false return(true) else return(false) end end end timidity = Timidity.new state = State.new w = Gtk::Window.new trackLabel = Gtk::Label.new(' Track ') fileLabel = Gtk::Label.new(' File ') fileName = Gtk::Combo.new fileName.set_popdown_strings(FileNames) trackName = Gtk::Entry.new trackName.set_text(timidity.getname(MidiDir+fileName.entry.get_text)) fileName.entry.signal_connect('changed'){ trackName.set_text(timidity.getname(MidiDir+fileName.entry.get_text)) state.change if timidity.alive? } buttons = Gtk::HBox.new play = Gtk::Button.new('Play') stop = Gtk::Button.new('Stop') prev = Gtk::Button.new('Prev.') nexb = Gtk::Button.new('Next') quit = Gtk::Button.new('Quit') buttons.pack_start(play, true, true, 0) buttons.pack_start(stop, true, true, 0) buttons.pack_start(prev, true, true, 0) buttons.pack_start(nexb, true, true, 0) buttons.pack_start(quit, true, true, 0) play.signal_connect('clicked'){ if AutoNext timidity.stopmidi begin puts 'processes is exiting.....' if DEBUG Process.wait rescue end Thread.start { index = FileNames.index(fileName.entry.get_text) index = -1 if index+1 == FileNames.size timidity.playmidi(fileName.entry.get_text) puts 'wait next' if DEBUG state.clear Process.waitpid(timidity.getpid) puts 'waiting has done' if DEBUG if timidity.stop? puts 'timidity thread stop' if DEBUG elsif state.change? puts 'timidity thread change stop' if DEBUG else puts 'timidity thread set next' if DEBUG fileName.entry.set_text(FileNames[index.to_i+1]) play.clicked end } else timidity.playmidi(fileName.entry.get_text) end } stop.signal_connect('clicked'){ timidity.stopmidi } prev.signal_connect('clicked'){ playPid = timidity.getpid index = FileNames.index(fileName.entry.get_text) index = FileNames.size.to_i if index == 0 timidity.stopmidi fileName.entry.set_text(FileNames[index.to_i-1]) play.clicked if playPid != '' } nexb.signal_connect('clicked'){ playPid = timidity.getpid index = FileNames.index(fileName.entry.get_text) index = -1 if index+1 == FileNames.size timidity.stopmidi fileName.entry.set_text(FileNames[index.to_i+1]) play.clicked if playPid != '' } quit.signal_connect('clicked'){ timidity.stopmidi ; `killall timidity` if DEBUG ; exit } t = Gtk::Table.new(3, 2, false) t.attach(trackLabel, 0, 1, 0, 1, 0, 0) t.attach(fileLabel, 0, 1, 1, 2, 0, 0) t.attach(trackName, 1, 2, 0, 1) t.attach(fileName, 1, 2, 1, 2) t.attach(buttons, 0, 2, 2, 3) w.add(t) w.set_title("Timidity++R / #{ScriptVersion}") w.show_all Gtk.main