Você está aqui: C++ ::: Dicas & Truques ::: MIDI Musical Instrument Digital Interface, Mapeamento e sequenciamento MIDI, Entrada e saída MIDI |
Usando a função midiOutShortMsg() da API do Windows para enviar uma mensagem MIDI para o dispositivo de saída MIDIQuantidade de visualizações: 1140 vezes |
A função midiOutShortMsg() da API Win32 do Windows nos permite enviar uma mensagem MIDI para o dispositivo de saída MIDI. Esta função possui a seguinte assinatura:MMRESULT midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg ); O parâmetro HMIDIOUT é um handle para o dispositivo de saída MIDI, obtido a partir de uma chamada midiOutOpen(). O parâmetro dwMsg é do tipo DWORD, um inteiro sem sinal de 32 bits que pode armazenar valores na faixa de 0 até 4.294.967.295. Vamos ver um exemplo de como tocar uma única nota MIDI, a nota dó central no piano. Para isso precisamos entender como tal mensagem é enviada. Sabendo que um DWORD possui quatro bytes, o último byte ( o byte de ordem mais baixa) é o byte de status MIDI. Os valores de status mais comuns são "Note on", com o valor hexadecimal 90 e "Note off", com valor hexadecimal 80. O segundo byte de ordem mais baixa é o número da nota MIDI a ser tocada. O dó central no piano possui o valor decimal 48. Convertendo para hexadecimal temos 3C. Então, para tocar essa nota, já temos os dois últimos bytes com seus respectivos valores: 3C90 Vamos ao terceiro byte de order mais baixa. Este, no caso dos eventos "Note on" e "Note off", representa a velocidade (a força com a qual a nota é tocada no instrumento). Este valor pode ser na faixa de 0 a 127. Assim, para atacarmos a nota com a velocidade (ou volume) de 100, podemos fornecer o valor hexadecimal 64. Agora, o nosso valor fica: 643C90 Finalmente, para nosso alívio, o byte de mais alta ordem não é usado. Então temos: 00643C90 Agora só precisamos fornecer este valor para a função midiOutShortMsg(). Veja: #include <cstdlib> #include <iostream> #include <windows.h> using namespace std; int main(int argc, char *argv[]) { unsigned int erro; // guarda o erro caso algo dê errado HMIDIOUT saida; // handle para o dispositivo de saída MIDI. // vamos abrir o dispositivo de saída MIDI erro = midiOutOpen(&saida, MIDI_MAPPER, 0, 0, CALLBACK_NULL); if (erro != MMSYSERR_NOERROR) { printf("Não foi possível abrir o mapeador MIDI: %d\n", erro); } else { printf("Mapeador MIDI aberto com sucesso\n"); } // vamos tocar o dó central com velocidade 100 midiOutShortMsg(saida, 0x00643C90); Sleep(1000); // a nota vai durar 1 segundo // dispara a mensagem Note-off midiOutShortMsg(saida, 0x00643C80); // agora vamos fechar o dispositivo de saída MIDI midiOutClose(saida); system("PAUSE"); return EXIT_SUCCESS; } Execute esse código e você ouvirá uma linda nota dó nos auto-falantes do seu PC ou Notebook. |
![]() |
Desafios, Exercícios e Algoritmos Resolvidos de C++ |
Veja mais Dicas e truques de C++ |
Dicas e truques de outras linguagens |
Python - Como inserir uma determinada quantidade de espaços à esquerda de um valor numérico usando Python |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |