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: 1361 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 |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
|
1º lugar: Java |






