Sha256: 8e77d37455ace58feb5e3728ad9899ff56ba47212757f7d114a5b69a894533bd

Contents?: true

Size: 1.67 KB

Versions: 1

Compression:

Stored size: 1.67 KB

Contents

require 'banjo/version'

require 'eventmachine'
require 'unimidi'

require 'banjo/keys'
require 'banjo/channel'
require 'banjo/note'

$: << '.'

module Banjo
  class << self
    attr_accessor :tick
    attr_accessor :beats_per_measure
    attr_accessor :measures_per_loop
    attr_accessor :tempo
    attr_accessor :ticks_per_beat
    attr_accessor :ticks_per_period
    attr_accessor :loop_count
  end

  def self.load_channels
    load_channels!
  rescue Exception
  end

  def self.load_channels!
    Dir['./channels/*.rb'].each do |file|
      load file
    end
  end

  def self.hush_all
    Banjo::Channel.channels.each do |channel|
      channel.new.hush
    end
  end

  def self.play
    Banjo.measures_per_loop ||= 1
    Banjo.ticks_per_period    = Banjo.ticks_per_beat * Banjo.beats_per_measure * Banjo.measures_per_loop
    poll_rate                 = (60.0 / Banjo.tempo / Banjo.ticks_per_beat)
    p "Tick every: #{poll_rate} seconds"

    EventMachine.run do
      Banjo.tick      = 0
      self.loop_count = 0

      # Display available channels
      p Banjo::Channel.channels

      # Shut down all channels
      hush_all

      EM.add_periodic_timer(poll_rate) do
        #puts Time.now if (Banjo.tick % 4 == 0)
        p Banjo.tick

        Banjo.load_channels if Banjo.tick == 0

        Banjo::Channel.channels.each do |klass|
          channel = klass.new
          channel.perform
        end

        Banjo.tick = update_counters(Banjo.tick)
      end

      puts "Banjo Reactor started..."
    end
  end

  def self.update_counters(tick)
    if tick < (ticks_per_period - 1)
      tick += 1
    else
      puts "Loop: #{self.loop_count += 1}"
      tick = 0
    end
    tick
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
banjo-0.0.5 lib/banjo.rb