# This is a shell archive. Save it in a file, remove anything before # this line, and then unpack it by entering "sh file". Note, it may # create directories; files and directories will be owned by you and # have default permissions. # # This archive contains: # # timidity++r # r++xpm.rb # echo x - timidity++r sed 's/^X//' >timidity++r << 'END-of-timidity++r' X#!/usr/bin/env ruby -Ke X# $Id: timidity++r,v 1.10 2003/06/02 12:36:02 Yuukis Exp $ X XScriptVersion = '0.6.2 (+XPM)' XCmd = '/usr/local/bin/timidity++' XDEBUG = false XAutoNext = true XAutoRepeat = true Xif ARGV[0] != nil X d = ARGV[0] X d = d + '/' if d != /^.*\/$/ X MidiDir = d Xelse X MidiDir = "#{ENV['HOME']}/music/midi/" Xend XXpmDir = "#{ENV['HOME']}/opt/lib/ruby/" XMidiEntries = Dir.glob("#{MidiDir}*.mid") XFileNames = MidiEntries.sort! XFileNames.collect!{|fn| File.basename(fn)} X Xrequire 'gtk' Xrequire 'kconv' X Xclass Timidity X def initialize X @timiPid = '' X @gonext = true X if AutoNext X @autonext = true X else X @autonext = false X end X if AutoRepeat X @autorepeat = true X else X @autorepeat = false X end X end X X def playmidi(filename) X puts 'timidity.playmidi' if DEBUG X stopmidi X if AutoNext X @gonext = true X else X @gonext = false X end X @timiPid = fork do X exec("#{Cmd} #{MidiDir}#{filename} >/dev/null 2>&1") X end X puts "Just Timidity++ started. Pid is #{@timiPid}" if DEBUG X end X X def stopmidi() X puts 'timidity.stopmidi' if DEBUG X @gonext = false X begin X `kill #{@timiPid.to_i+1} >/dev/null 2>&1` X `kill #{@timiPid} >/dev/null 2>&1` X puts "killed #{@timiPid} & #{@timiPid+1}" if DEBUG X rescue X puts 'No child processes' if DEBUG X end X @timiPid = '' X end X X def stop?() X if @gonext X return(false) X else X return(true) X end X end X X def alive?() X if @timiPid != '' X return(true) X else X return(false) X end X end X X def autonext?() X if @autonext X return(true) X else X return(false) X end X end X X def autonext_toggle() X if @autonext X @autonext = false X else X @autonext = true X end X end X X def autorepeat?() X if @autorepeat X return(true) X else X return(false) X end X end X X def autorepeat_toggle() X if @autorepeat X @autorepeat = false X else X @autorepeat = true X end X end X X def getpid() X puts @timiPid if DEBUG X return(@timiPid) X end X X def getname(filename) X sequence = '' X events = `#{Cmd} -Ol #{filename}` X events.each{ |el| X sequence = el if el =~ /^sequence:/i X } X sequence.gsub!(/^sequence: /i, '') X sequence.gsub!(/\s\s*/, ' ') X sequence.gsub!(/กก/e, ' ') X sequence.chomp! X while sequence =~ /^\s/ do X sequence.gsub!(/^\s/,'') X end X sequence = "Can't Find Sequence" if sequence == '' X return(sequence.toeuc) X end Xend X Xclass RPix X def initialize(wObject) X load XpmDir + 'r++xpm.rb' X wObject.realize X @pixHash = {} X PixArray.each{ |name, array| X pix, mask = Gdk::Pixmap.create_from_xpm_d(wObject.window, nil, array) X @pixHash[name]= Gtk::Pixmap.new(pix, mask) X } X end X X def getPix(name) X return(@pixHash[name]) X end Xend X Xclass State X def initialize X @change = false X end X X def clear() X @change = false X end X X def change() X puts 'state.change!' if DEBUG X @change = true X end X X def change?() X if @change X @change = false X return(true) X else X return(false) X end X end Xend X Xtimidity = Timidity.new Xstate = State.new Xw = Gtk::Window.new Xpix = RPix.new(w) X XtrackLabel = Gtk::Label.new(' Track ') XfileLabel = Gtk::Label.new(' File ') X XfileName = Gtk::Combo.new X fileName.set_popdown_strings(FileNames) XtrackName = Gtk::Entry.new X trackName.set_text(timidity.getname(MidiDir+fileName.entry.get_text)) X XfileName.entry.signal_connect('changed'){ X trackName.set_text(timidity.getname(MidiDir+fileName.entry.get_text)) X state.change if timidity.alive? X} X Xbuttons = Gtk::HBox.new X play = Gtk::Button.new ; play.add pix.getPix('pixPlay') X stop = Gtk::Button.new ; stop.add pix.getPix('pixStop') X prev = Gtk::Button.new ; prev.add pix.getPix('pixBack') X nexb = Gtk::Button.new ; nexb.add pix.getPix('pixNext') X quit = Gtk::Button.new ; quit.add pix.getPix('pixOpen') X autonext = Gtk::ToggleButton.new ; autonext.add pix.getPix('pixAutoNext') X autonext.set_active(true) if timidity.autonext? X autorepeat = Gtk::ToggleButton.new ; autorepeat.add pix.getPix('pixAutoRepeat') X autorepeat.set_active(true) if timidity.autorepeat? X Xbuttons.pack_start(play, true, true, 0) Xbuttons.pack_start(stop, true, true, 0) Xbuttons.pack_start(prev, true, true, 0) Xbuttons.pack_start(nexb, true, true, 0) Xbuttons.pack_start(autonext, true, true, 0) Xbuttons.pack_start(autorepeat, true, true, 0) Xbuttons.pack_start(quit, true, true, 0) X Xplay.signal_connect('clicked'){ X if AutoNext X timidity.stopmidi X begin X puts 'processes is exiting.....' if DEBUG X Process.wait X rescue X end X Thread.start { X puts timidity.autorepeat? if DEBUG X index = FileNames.index(fileName.entry.get_text) X index = -1 if index+1 == FileNames.size X timidity.playmidi(fileName.entry.get_text) X puts 'wait next' if DEBUG X state.clear X Process.waitpid(timidity.getpid) X puts 'waiting has done' if DEBUG X if timidity.stop? X puts 'timidity thread stop' if DEBUG X elsif state.change? X puts 'timidity thread change stop' if DEBUG X elsif timidity.autonext? == false X puts 'timidity autonext? == false' if DEBUG X elsif index == -1 X if timidity.autorepeat? == false X puts 'timidity autorepeat? == false' if DEBUG X else X puts 'timidity autorepeat? == true' if DEBUG X fileName.entry.set_text(FileNames[index.to_i+1]) X play.clicked X end X else X puts 'timidity thread set next' if DEBUG X fileName.entry.set_text(FileNames[index.to_i+1]) X play.clicked X end X } X else X timidity.playmidi(fileName.entry.get_text) X end X} X Xstop.signal_connect('clicked'){ timidity.stopmidi } X Xprev.signal_connect('clicked'){ X playPid = timidity.getpid X index = FileNames.index(fileName.entry.get_text) X index = FileNames.size.to_i if index == 0 X timidity.stopmidi X fileName.entry.set_text(FileNames[index.to_i-1]) X play.clicked if playPid != '' X} X Xnexb.signal_connect('clicked'){ X playPid = timidity.getpid X index = FileNames.index(fileName.entry.get_text) X index = -1 if index+1 == FileNames.size X timidity.stopmidi X fileName.entry.set_text(FileNames[index.to_i+1]) X play.clicked if playPid != '' X} X Xautonext.signal_connect('toggled'){ X timidity.autonext_toggle X puts timidity.autonext? if DEBUG X} X Xautorepeat.signal_connect('toggled'){ X timidity.autorepeat_toggle X puts timidity.autorepeat? if DEBUG X} X Xquit.signal_connect('clicked'){ timidity.stopmidi ; exit } X Xt = Gtk::Table.new(3, 2, false) X t.attach(trackLabel, 0, 1, 0, 1, 0, 0) X t.attach(fileLabel, 0, 1, 1, 2, 0, 0) X t.attach(trackName, 1, 2, 0, 1) X t.attach(fileName, 1, 2, 1, 2) X t.attach(buttons, 0, 2, 2, 3) X Xw.add(t) Xw.signal_connect('delete_event'){ timidity.stopmidi ; exit } Xw.set_title("Timidity++R / #{ScriptVersion}") Xw.show_all XGtk.main END-of-timidity++r echo x - r++xpm.rb sed 's/^X//' >r++xpm.rb << 'END-of-r++xpm.rb' XpixNext = [ X"22 16 2 1", X" c black", X". c None", X"......................", X"......................", X"......................", X".... ..... ...........", X".... .... .... ....", X".... ... ... ....", X".... .. .. ....", X".... . . ....", X".... . . ....", X".... .. .. ....", X".... ... ... ....", X".... .... .... ....", X".... ..... ...........", X"......................", X"......................", X"......................" X] X XpixPlay = [ X"22 16 2 1", X" c black", X". c None", X"......................", X"......................", X"......................", X"...... ..............", X"...... ............", X"...... ..........", X"...... ........", X"...... ......", X"...... ......", X"...... ........", X"...... ..........", X"...... ............", X"...... ..............", X"......................", X"......................", X"......................" X] X XpixBack = [ X"22 16 2 1", X" c black", X". c None", X"......................", X"......................", X"......................", X"........... ..... ....", X".... .... .... ....", X".... ... ... ....", X".... .. .. ....", X".... . . ....", X".... . . ....", X".... .. .. ....", X".... ... ... ....", X".... .... .... ....", X"........... ..... ....", X"......................", X"......................", X"......................" X] X XpixOpen = [ X"22 16 2 1", X" c black", X". c None", X"......................", X"......................", X"......................", X".......... ..........", X"......... .........", X"........ ........", X"....... .......", X"...... ......", X"..... .....", X"......................", X"......................", X"..... .....", X"..... .....", X"..... .....", X"......................", X"......................" X] X XpixAutoRepeat = [ X"22 16 2 1", X" c black", X". c None", X"................. ....", X"......... ..... ...", X"...... ... ...", X".... ...", X".... ...... ...", X"... .......... ...", X".. .......... ...", X"............ ..", X".. .............. ..", X".. ............", X"... .......... ..", X"... .......... ...", X"... ...... ....", X"... ....", X"... ... ......", X"... ..... .........", X".... ................." X] X XpixAutoNext = [ X"22 16 2 1", X" c black", X". c None", X"......................", X"......................", X"......................", X"................. ....", X"......... ..... ...", X"...... ... ...", X".... ...", X".... ...... ...", X"... .......... ...", X".. .......... ...", X"............ ..", X".................. ..", X"......................", X"......................", X"......................", X"......................" X] X XpixStop = [ X"22 16 2 1", X" c black", X". c None", X"......................", X"......................", X"......................", X"......................", X"....... .......", X"....... .......", X"....... .......", X"....... .......", X"....... .......", X"....... .......", X"....... .......", X"....... .......", X"......................", X"......................", X"......................", X"......................" X] X XPixArray = [['pixNext', pixNext], X ['pixPlay', pixPlay], X ['pixBack', pixBack], X ['pixOpen', pixOpen], X ['pixAutoRepeat', pixAutoRepeat], X ['pixAutoNext', pixAutoNext], X ['pixStop', pixStop]] END-of-r++xpm.rb exit