Beispiel #1
0
    def play_midieventstream(self, midieventstream):
        # We don't start at the very beginning. This to give the sequencer
        # a little time to get ready.
        t = 30
        a, b = self.m_sequencer.queue_tempo(self.m_queue)
        self.m_sequencer.queue_tempo(self.m_queue, a, b)
        self.m_sequencer.start_queue(self.m_queue)
        for e in midieventstream:
            if e[0] == 'program-change':
                event = alsaseq.SeqEvent(type=alsaseq.SEQ_EVENT_PGMCHANGE)
                event.dest = self.m_clientport
                event.time = t
                event.set_data({'control.channel' : e[1],
                               'control.value' : e[2],
                               })
            elif e[0] == 'volume':
                continue
            elif e[0] == 'bender':
                continue
            elif e[0] == 'note-on':
                event = alsaseq.SeqEvent(type=alsaseq.SEQ_EVENT_NOTEON)
                event.dest = self.m_clientport
                event.time = t
                event.set_data({'note.channel' : e[1],
                               'note.note' : e[2],
                               'note.velocity' : e[3],
                               })
            elif e[0] == 'notelen-time':
                t += int(96*2*4*e[1])
                continue
            elif e[0] == 'note-off':
                event = alsaseq.SeqEvent(type=alsaseq.SEQ_EVENT_NOTEOFF)
                event.dest = self.m_clientport
                event.time = t
                event.set_data({'note.channel' : e[1],
                               'note.note' : e[2],
                               'note.velocity' : e[3],
                               })
            elif e[0] == 'tempo':
                event = alsaseq.SeqEvent(type=alsaseq.SEQ_EVENT_TEMPO)
                event.dest = (0, 0)
                event.time = t
                event.set_data({'queue.param.value' : 500000 * 60 / e[1],
                                'queue.queue': self.m_queue})
            else:
                print e
                raise Exception("Not implemented")
            event.source = (0, 0)
            event.queue = self.m_queue
            self.m_sequencer.output_event(event)
        event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_STOP)
        event.source = (0, 0)
        event.queue = self.m_queue
        event.time = t
        event.dest = (alsaseq.SEQ_CLIENT_SYSTEM, alsaseq.SEQ_PORT_SYSTEM_TIMER)
        event.set_data({'queue.queue' : self.m_queue})
        self.m_sequencer.output_event(event)

        # make sure that the sequencer sees all our events
        self.m_sequencer.drain_output()
    def __init__(self, Midi_Port_Name='Nano Basket MIDI 1'):
        self.Seq = alsaseq.Sequencer(clientname='Nano Basket')
        self.Event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_SYSEX)
        self.Controller = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_CONTROLLER)
        self.Port = self.Seq.create_simple_port(name=Midi_Port_Name,
          type=alsaseq.SEQ_PORT_TYPE_APPLICATION,
          caps=alsaseq.SEQ_PORT_CAP_SUBS_READ | \
               alsaseq.SEQ_PORT_CAP_READ | \
               alsaseq.SEQ_PORT_CAP_WRITE | \
               alsaseq.SEQ_PORT_CAP_SUBS_WRITE)

        self.Response_Wait = 0.2
Beispiel #3
0
    def get_event(self):
        if not self._event:
            self._event = alsaseq.SeqEvent(_event_type_toalsa[self._type])
            if self._type in [NOTEON, NOTEOFF, POLY_AFTERTOUCH]:
                data = {'note.channel': self.channel, 'note.note': self.data1, 'note.velocity': self.data2}
                self._event.set_data(data)
            elif self._type == CTRL:
                data = {'control.channel': self.channel, 'control.param': self.data1, 'control.value': self.data2}
                self._event.set_data(data)
            elif self._type in [PROGRAM, AFTERTOUCH, PITCHBEND]:
#                print self.channel
                data = {'control.channel': self.channel, 'control.value': self.data2}
                self._event.set_data(data)
            elif self._type == SYSEX:
                data = {'ext': self.sysex}
                self._event.set_data(data)
            elif self._type == SYSTEM:
                data = {'result.event': self.data1, 'result.result': self.data2}
                self._event.set_data(data)
            elif self._type in [SYSRT_START, SYSRT_CONTINUE, SYSRT_STOP]:
                data = {'queue.queue': self.queue}
                self._event.set_data(data)
            if self.source:
                self._event.source = tuple(self.source)
            if self.dest and isinstance(self.dest, tuple):
                self._event.dest = self.dest
        return self._event
Beispiel #4
0
 def notes_event(self, beat, instr_id, measure_data):
     # TODO: take advantage of ports 128:1, 128:2, 128:3
     channel = instrument_channel(instr_id)
     event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_NOTE)
     start_tm = beat * self.ppq  # Beginning of measure, in ticks
     try:
         base_velocity = self.velocity[instr_id]
     except KeyError:
         base_velocity = 64
     for note in measure_data.events:
         ticks = int(4 * self.ppq / note.duration)
         if instr_id == 0:
             # Don't jitter the metronome!
             jitter = 0
         else:
             jitter_dist = int(32 / note.duration)
             jitter = random.randrange(jitter_dist)
         if note.pitch != 0:
             event.dest = (self.cid, instrument_port(instr_id))  #self.pid)
             event.queue = self.outq
             event.time = start_tm + jitter + DELAY
             veloc = base_velocity + random.randrange(10)
             dur = ticks + jitter
             event.set_data({
                 'note.note': note.pitch,
                 'note.velocity': veloc,
                 'note.duration': ticks - jitter,
                 'note.off_velocity': veloc,
                 'note.channel': channel
             })
             #print 'event:', event, event.get_data()
             self.seq.output_event(event)
         start_tm += ticks
     self.seq.drain_output()
Beispiel #5
0
 def alsa_event(cls,
                event_type,
                port,
                channel=0,
                data1=0,
                data2=0,
                sysex=None):
     event = alsaseq.SeqEvent(_event_type_toalsa[event_type])
     if event_type in [NOTEON, NOTEOFF, POLY_AFTERTOUCH]:
         data = {
             'note.channel': channel,
             'note.note': data1,
             'note.velocity': data2
         }
         event.set_data(data)
     elif event_type == CTRL:
         data = {
             'control.channel': channel,
             'control.param': data1,
             'control.value': data2
         }
         event.set_data(data)
     elif event_type in [PROGRAM, AFTERTOUCH, PITCHBEND]:
         data = {'control.channel': channel, 'control.value': data2}
         event.set_data(data)
     elif event_type == SYSEX:
         data = {'ext': sysex}
         event.set_data(data)
     elif event_type == SYSTEM:
         data = {'result.event': data1, 'result.result': data2}
         event.set_data(data)
     event.source = (0, port)
     return event
Beispiel #6
0
def note(n, state=False):
    if state:
        etype = alsaseq.SEQ_EVENT_NOTEON
    else:
        etype = alsaseq.SEQ_EVENT_NOTEOFF
    event = alsaseq.SeqEvent(type=etype)
    event.set_data({'note.channel': 0, 'note.note': n, 'note.velocity': 90})
    seq.output_event(event)
    seq.drain_output()
Beispiel #7
0
 def instrument_event(self, beat, instr_id, new_instrument):
     event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_PGMCHANGE)
     event.dest = (self.cid, instrument_port(instr_id))
     event.queue = self.outq
     event.time = beat * self.ppq
     event.set_data({
         'control.value': new_instrument,
         'control.channel': instrument_channel(instr_id)
     })
     self.seq.output_event(event)
def test():
    print('\n==== MidiEventFactory test')

    CCMidiEvent.register_event_type_builder()
    CCMidiEvent.register()

    JStationSysexEvent.register_event_type_builder()
    WhoAmIResponse.register()

    sysex_data = [
        0xf0, 0, 0, 0x10, 0x7f, 0x54, 0x41, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1,
        121, 0xf7
    ]
    print('input sysex data: %s' %
          ['x%02x' % (val & 0xff) for val in sysex_data])

    sysex_seq_event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_SYSEX)
    sysex_evt_data = dict()
    sysex_evt_data['ext'] = sysex_data
    sysex_seq_event.set_data(sysex_evt_data)

    factory = MidiEventFactory()
    sysex_event = factory.build_from_seq_event(sysex_seq_event)
    if sysex_event:
        print(sysex_event.is_valid())
        print(str(sysex_event))
    else:
        print('sysex not recognised')

    cc_seq_event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_CONTROLLER)
    cc_data = dict()
    cc_data['control.channel'] = 1
    cc_data['control.param'] = 34
    cc_data['control.value'] = 20
    cc_seq_event.set_data(cc_data)

    cc_event = factory.build_from_seq_event(cc_seq_event)
    if cc_event:
        print(cc_event.is_valid())
        print(str(cc_event))
    else:
        print('cc not recognised')
Beispiel #9
0
 def volume_event(self, beat, instr_id, new_volume):
     # Global volume
     event = alsaseq.SeqEvent(alsaseq.SEQ_EVENT_CONTROLLER)
     event.dest = (self.cid, instrument_port(instr_id))
     event.queue = self.outq
     event.time = beat * self.ppq
     event.set_data({
         'control.param': 7,
         'control.value': int(new_volume),
         'control.channel': 0
     })
     self.seq.output_event(event)
Beispiel #10
0
 def fill_seq_event(self):
     self.seq_event = alsaseq.SeqEvent(self.event_type)