MIDI

Windows Mobile SupportedWindows Embedded CE Supported

9/8/2008

A seguinte tabela mostra os recursos MIDI (Musical Instrument Digital Interface) que sejam com suporte.

Capacidade Descrição

Instrumentos

Seno onda geração, há outros instrumentos.

Polyphony

Nenhum limite sobre o número de fluxos MIDI. Número de simultâneo anotações por transmitir limitado pelos recursos do driver e é definido como 32 para todos os drivers exemplo.

Na prática, o número total de anotações será limitado por potência da CPU. A maioria dos dispositivos devem ser capazes de reproduzir anotações oito para dez simultaneamente.

As mensagens

Somente detalhes no, detalhes logoff e todas as anotações logoff.

Temporização

Exemplo preciso.

Extensões

Oferece suporte a alterações de geração e tempo de tom freqüência arbitrário.

O áudio de forma de onda API suporta MIDI (Musical Instrument Digital Interface) por meio de formato onda WAVE_FORMAT_MIDI. Às anotações MIDI (Musical Instrument Digital Interface) Play, aberto o áudio de forma de onda dispositivo por chamado de função waveOutOpen e fornecendo um ponteiro para um WAVEFORMAT_MIDI estrutura e conversão-lo para um WAVEFORMATEX estrutura. Use o valor WAVE_FORMAT_MIDI para identificar que os dados enviados é MIDI (Musical Instrument Digital Interface) dados.

Você e iniciar passando buffers para o driver usando waveOutWrite, apenas como você faria para regular áudio em formato wave dados. Enviar dados MIDI (Musical Instrument Digital Interface) para o driver em uma reserva constituída de uma matriz de WAVEFORMAT_MIDI_MESSAGE estruturas.

O áudio de forma de onda driver será automaticamente cuidam de temporização e seqüências para cada mensagem MIDI (Musical Instrument Digital Interface). Essa abordagem deve ser satisfatória para a maioria dos aplicativos. Se, no entanto, você localizar que você precisa fazer seu próprios seqüenciamento MIDI (Musical Instrument Digital Interface), você pode enviar mensagens MIDI (Musical Instrument Digital Interface) diretamente para o áudio driver pelo chamado waveOutMessage e enviando o substituído mensagem MM_MOM_MIDIMESSAGE. As alças driver mensagens MIDI (Musical Instrument Digital Interface) enviar com MM_MOM_MIDIMESSAGE assim que eles são recebidos. Isso significa que o aplicativo é a única origem de temporização e seqüência controle para MIDI (Musical Instrument Digital Interface) todas as mensagens enviadas em dessa maneira, que pode ser difícil para implementar.

Exemplo de código

O seguinte codificar mostra um aplicativo que reproduz uma escalabilidade simples de oito anotações MIDI (Musical Instrument Digital Interface).

#define DEFINE_GUIDS 1
#include "windows.h"
#include "stdio.h"
#include "wfmtmidi.h"

unsigned char Scale[8] = {63,65,67,68,70,72,74,75};
HANDLE hEvent;

void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance,
                          DWORD dwParam1, DWORD dwParam2){
    if (uMsg==WOM_DONE){
        SetEvent(hEvent);
    }
    return;
}

int _tmain(int argc, TCHAR *argv[]) {
    // Code to play a simple 8-note scale.

    // Create an event to signal when playback is done
    hEvent=CreateEvent( NULL,TRUE,FALSE,NULL);

    // Build a MIDI waveformat header
    WAVEFORMAT_MIDI wfm;
    memset(&wfm,0,sizeof(wfm));
    wfm.wfx.wFormatTag=WAVE_FORMAT_MIDI;
    wfm.wfx.nChannels=1;
    wfm.wfx.nBlockAlign=sizeof(WAVEFORMAT_MIDI_MESSAGE);
    wfm.wfx.cbSize=WAVEFORMAT_MIDI_EXTRASIZE;

    // These fields adjust the interpretation of DeltaTicks,
    // and thus the rate of playback
    wfm.USecPerQuarterNote=1000000;   // Set to 1 second. Note driver
                                      // will default to 500000 if we set
                                      // this to 0
    wfm.TicksPerQuarterNote=100;      // Set to 100. Note driver will
                                      // default to 96 if we set this to 0
    MMRESULT Result;
    HWAVEOUT hWaveOut;

    // Open the waveout device
    Result = waveOutOpen(&hWaveOut, WAVE_MAPPER, (LPWAVEFORMATEX)&wfm,
                         (DWORD)waveOutProc, 0, CALLBACK_FUNCTION);

    if (Result!=MMSYSERR_NOERROR){
        return -1;
    }

    // Build a MIDI buffer with 16 MIDI messages.
    int i,j;
    WAVEFORMAT_MIDI_MESSAGE MidiMessage[16];
    for (i=0,j=0;i<8;i++,j+=2) {
        // Wait 1 second : 
        // (DeltaTicks * (UsecPerQuarterNote / TicksPerQuarterNote))
        MidiMessage[j].DeltaTicks=100;      
        MidiMessage[j].MidiMsg=0x1F0090 | ((Scale[i])<<8);   // Note on
        MidiMessage[j+1].DeltaTicks=100;                // Wait 1 second
        MidiMessage[j+1].MidiMsg=0x1F0080 | ((Scale[i])<<8); // Note off
    }

    WAVEHDR WaveHdr;
    WaveHdr.lpData = (LPSTR)&MidiMessage;
    WaveHdr.dwBufferLength = sizeof(MidiMessage);
    WaveHdr.dwFlags = 0;
    Result = waveOutPrepareHeader(hWaveOut,&WaveHdr,sizeof(WaveHdr));

    // Play the data
    Result = waveOutWrite(hWaveOut,&WaveHdr,sizeof(WaveHdr));

    // Wait for playback to complete
    WaitForSingleObject(hEvent,INFINITE);

    // Cleanup
    Result = waveOutUnprepareHeader(hWaveOut,&WaveHdr,sizeof(WaveHdr));
    Result = waveOutClose(hWaveOut);
    return 0;
}

See Also

Concepts

Using the Waveform Audio Interface