class Xi::MIDI::Stream
Constants
- VolcaFm
Attributes
channel[RW]
device[RW]
Public Class Methods
new(name, clock, device: 0, channel: 0, **opts)
click to toggle source
Calls superclass method
# File lib/xi/midi/stream.rb, line 8 def initialize(name, clock, device: 0, channel: 0, **opts) super @device = device @channel = channel @playing_notes = {} midi.open(device) unless midi.open?(device) at_exit { kill_playing_notes } end
Public Instance Methods
set(**params)
click to toggle source
Calls superclass method
# File lib/xi/midi/stream.rb, line 19 def set(**params) super(gate: :midinote, **params) end
stop()
click to toggle source
Calls superclass method
# File lib/xi/midi/stream.rb, line 23 def stop kill_playing_notes super end
Private Instance Methods
cc_parameters()
click to toggle source
@override
# File lib/xi/midi/stream.rb, line 89 def cc_parameters {} end
do_gate_off_change(changes)
click to toggle source
# File lib/xi/midi/stream.rb, line 60 def do_gate_off_change(changes) debug "Gate off change: #{changes}" changes.each do |change| change.fetch(:so_ids).each do |so_id| note = @playing_notes.delete(so_id) if note debug "MIDI Note off: #{[note[:channel], note[:midinote]]}" midi.note_off(@device, note[:channel], note[:midinote]) end end end end
do_gate_on_change(changes)
click to toggle source
# File lib/xi/midi/stream.rb, line 39 def do_gate_on_change(changes) debug "Gate on change: #{changes}" channel = Array(@state[:channel] || 0) midinote = Array(@state[:midinote] || 60) velocity = Array(@state[:velocity] || 127) changes.each do |change| change.fetch(:so_ids).each.with_index do |so_id, i| channel_i = channel[i % channel.size] midinote_i = midinote[i % midinote.size] velocity_i = velocity[i % velocity.size] debug "MIDI Note on: #{[channel_i, midinote_i, velocity_i]}" midi.note_on(@device, channel_i, midinote_i, velocity_i) @playing_notes[so_id] = {channel: channel_i, midinote: midinote_i} end end end
do_state_change()
click to toggle source
# File lib/xi/midi/stream.rb, line 74 def do_state_change debug "State change: #{changed_state}" changed_state.each do |p, vs| cc_id = if p.to_s.start_with?('cc_') p.to_s.split('_')[1].to_i else cc_parameters[p] end Array(vs).each { |v| midi.cc(@device, channel, cc_id, v.to_i) } if cc_id end end
kill_playing_notes()
click to toggle source
# File lib/xi/midi/stream.rb, line 30 def kill_playing_notes @mutex.synchronize do @playing_notes.each do |_, note| midi.note_off(@device, note[:channel], note[:midinote]) end @playing_notes.clear end end
latency_sec()
click to toggle source
# File lib/xi/midi/stream.rb, line 97 def latency_sec 0.04 end
midi()
click to toggle source
# File lib/xi/midi/stream.rb, line 93 def midi Proxy.instance end