class TinyMidiPlayer

Constants

VERSION

Attributes

selected_file[RW]

Public Class Methods

new() click to toggle source
# File examples/midi_player.rb, line 12
def initialize
  @pid = nil
  @music_directory = File.expand_path('../sounds', __dir__)
  @midi_files      = Dir.glob(File.join(@music_directory, '**/*.mid'))
                        .sort_by { |path| File.basename(path) }
  at_exit { stop_midi }
  create_gui
end

Public Instance Methods

create_gui() click to toggle source
# File examples/midi_player.rb, line 48
def create_gui
  menu('Help') {
    menu_item('Version') {
      on_clicked do
        show_version
      end
    }
  }
  window('Tiny Midi Player', 200, 50) {
    horizontal_box {
      vertical_box {
        stretchy false
        
        button('▶') {
          on_clicked do
            play_midi
          end
        }
        button('■') {
          on_clicked do
            stop_midi
          end
        }
      }

      combobox {
        items @midi_files.map { |path| File.basename(path) }
        # data-bind selected item (String) to self.selected_file with on-read/on-write converters and after_write operation
        selected_item <=> [self, :selected_file, on_read: ->(f) {File.basename(f.to_s)}, on_write: ->(f) {File.join(@music_directory, f)}, after_write: -> { play_midi if @th&.alive? }]
      }
    }
  }.show
end
play_midi() click to toggle source
# File examples/midi_player.rb, line 28
def play_midi
  stop_midi
  if @pid.nil? && @selected_file
    begin
      @pid = spawn "timidity #{@selected_file}"
      @th = Process.detach @pid
    rescue Errno::ENOENT
      warn 'Timidty++ not found. Please install Timidity++.'
      warn 'https://sourceforge.net/projects/timidity/'
    end
  end
end
show_version() click to toggle source
# File examples/midi_player.rb, line 41
def show_version
  msg_box('Tiny Midi Player',
            "Written in Ruby\n" \
              "https://github.com/kojix2/libui\n" \
              "Version #{VERSION}")
end
stop_midi() click to toggle source
# File examples/midi_player.rb, line 21
def stop_midi
  if @pid
    Process.kill(:SIGKILL, @pid) if @th.alive?
    @pid = nil
  end
end