Changeset 774

Show
Ignore:
Timestamp:
02/07/09 18:36:38 (4 years ago)
Author:
cmennie@…
Message:

Added initial (untested) midi out support

Location:
branches/midi_out/libs/hydrogen/src/IO
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • branches/midi_out/libs/hydrogen/src/IO/PortMidiDriver.h

    r733 r774  
    2727 
    2828#include <hydrogen/IO/MidiInput.h> 
     29#include <hydrogen/IO/MidiOutput.h> 
    2930#include <portmidi.h> 
    3031 
     
    3637public: 
    3738        PmStream *m_pMidiIn; 
     39        PmStream *m_pMidiOut; 
    3840        bool m_bRunning; 
    3941 
     
    4547        virtual std::vector<QString> getOutputPortList(); 
    4648         
    47         virtual void handleQueueNote(Note* pNote) {} 
    48         virtual void handleQueueAllNoteOff() {} 
     49        virtual void handleQueueNote(Note* pNote); 
     50        virtual void handleQueueAllNoteOff(); 
    4951 
    5052private: 
  • branches/midi_out/libs/hydrogen/src/IO/portmidi_driver.cpp

    r298 r774  
    2424 
    2525#include <hydrogen/Preferences.h> 
     26#include <hydrogen/note.h> 
     27#include <hydrogen/instrument.h> 
     28#include <hydrogen/hydrogen.h> 
     29#include <hydrogen/globals.h> 
    2630 
    2731#ifdef WIN32 
     
    114118 
    115119PortMidiDriver::PortMidiDriver() 
    116                 : MidiInput( "PortMidiDriver" ) 
     120                : MidiInput( "PortMidiDriver" ), MidiOutput( "PortMidiDriver" ), Object( "PortMidiDriver" ) 
    117121                , m_bRunning( false ) 
    118122{ 
     
    136140 
    137141        int nDeviceId = -1; 
     142        int nOutDeviceId = -1; 
    138143        QString sMidiPortName = Preferences::getInstance()->m_sMidiPortName; 
    139144        int nDevices = Pm_CountDevices(); 
     
    149154                        } 
    150155                } 
     156                 
     157                if ( info->output == TRUE ) { 
     158                        if ( info->name == sMidiPortName.toStdString() ) { 
     159                                nOutDeviceId = i; 
     160                        } 
     161                } 
    151162        } 
    152163 
    153164        if ( nDeviceId == -1 ) { 
    154165                INFOLOG( "Midi input device not found." ); 
     166                return; 
     167        } 
     168         
     169        if ( nOutDeviceId == -1 ) { 
     170                INFOLOG( "Midi output device not found." ); 
    155171                return; 
    156172        } 
     
    176192                ERRORLOG( "Error in Pm_OpenInput" ); 
    177193        } 
     194         
     195        err = Pm_OpenOutput( 
     196                          &m_pMidiOut, 
     197                          nOutDeviceId, 
     198                          NULL, 
     199                          nInputBufferSize, 
     200                          TIME_PROC, 
     201                          NULL, 
     202                          0 
     203                      ); 
     204 
     205        if ( err != pmNoError ) { 
     206                ERRORLOG( "Error in Pm_OpenInput" ); 
     207        } 
    178208 
    179209        m_bRunning = true; 
     
    220250} 
    221251 
     252void PortMidiDriver::handleQueueNote(Note* pNote) 
     253{        
     254        if ( m_pMidiOut == NULL ) { 
     255                ERRORLOG( "m_pMidiOut = NULL " ); 
     256                return; 
     257        } 
     258 
     259        int channel = pNote->get_instrument()->get_midi_out_channel(); 
     260        if (channel < 0) { 
     261                return; 
     262        } 
     263                 
     264        int key = pNote->get_instrument()->get_midi_out_note(); 
     265        int velocity = pNote->get_velocity() * 127; 
     266         
     267        PmEvent event; 
     268        event.timestamp = 0; 
     269         
     270        //Note off 
     271        event.message = Pm_Message(0x80 | channel, key, velocity); 
     272        Pm_Write(m_pMidiOut, &event, 1); 
     273         
     274        //Note on 
     275        event.message = Pm_Message(0x90 | channel, key, velocity); 
     276        Pm_Write(m_pMidiOut, &event, 1); 
     277} 
     278 
     279void PortMidiDriver::handleQueueAllNoteOff() 
     280{ 
     281        if ( m_pMidiOut == NULL ) { 
     282                ERRORLOG( "m_pMidiOut = NULL " ); 
     283                return; 
     284        } 
     285         
     286        InstrumentList *instList = Hydrogen::get_instance()->getSong()->get_instrument_list(); 
     287                 
     288        unsigned int numInstruments = instList->get_size(); 
     289        for (int index = 0; index < numInstruments; ++index) { 
     290                Instrument *curInst = instList->get(index); 
     291         
     292                int channel = curInst->get_midi_out_channel(); 
     293                if (channel < 0) { 
     294                        continue; 
     295                } 
     296                int key = curInst->get_midi_out_note(); 
     297                 
     298                PmEvent event; 
     299                event.timestamp = 0; 
     300         
     301                //Note off 
     302                event.message = Pm_Message(0x80 | channel, key, 0); 
     303                Pm_Write(m_pMidiOut, &event, 1); 
     304        } 
     305} 
     306 
    222307}; 
    223308