1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| procedure TThreadJoueNote.JouerNote;
function EncodeMessageMIDI1(const nMsg, nParam1: Integer): Integer;
begin
Result := nMsg + (nParam1 shl 8);
end;
function EncodeMessageMIDI2(const nMsg, nParam1, nParam2: Integer): Integer;
begin
Result := nMsg + (nParam1 shl 8) + (nParam2 shl 16);
end;
const
INSTRUMENT = $C0;
NOTE_ON = $90;
NOTE_OFF = $80;
var
nDuree: Cardinal;
Res: DWORD;
MidiOut: hMidiOut;
szMsg: String;
begin
// Si silence.
if _Silence <> nil then
begin
nDuree := 0;
case _Silence.GetDuree of
dHuitiemeDeSoupir:
nDuree := ((60000 div (_nTempo * PPQN)) * (PPQN div 8));
dQuartDeSoupir:
nDuree := ((60000 div (_nTempo * PPQN)) * (PPQN div 4));
dDemiSoupir:
nDuree := ((60000 div (_nTempo * PPQN)) * (PPQN div 2));
dSoupir:
nDuree := ((60000 div (_nTempo * PPQN)) * PPQN);
dDemiPause:
nDuree := ((60000 div (_nTempo * PPQN)) * (PPQN * 2));
dPause:
nDuree := ((60000 div (_nTempo * PPQN)) * (PPQN * 4));
dBatonDePause:
nDuree := ((60000 div (_nTempo * PPQN)) * (PPQN * 8));
end;
Sleep(nDuree);
end
else
begin
// Ouverture du port Midi.
// Res := midiOutOpen(@MidiOut, MIDI_MAPPER, Handle, 0, CALLBACK_WINDOW);
Res := midiOutOpen(@MidiOut, MIDI_MAPPER, 0, 0, CALLBACK_NULL);
if Res <> 0 then
begin
case Res of
MIDIERR_NODEVICE:
szMsg := 'Erreur : pas de port MIDI trouvé !';
MMSYSERR_ALLOCATED:
szMsg := 'Erreur : la ressource spécifiée est déjà allouée !';
MMSYSERR_BADDEVICEID:
szMsg := 'Identifiant d''élément en dehors des bornes !';
MMSYSERR_INVALPARAM:
szMsg := 'Erreur : poiteur ou structure invalide !';
MMSYSERR_NOMEM:
szMsg := 'Erreur : le système ne peut pas allouer de mémoire, ou la mémoire est verrouillée !';
MIDIERR_NOMAP:
szMsg := 'Midi mapper non trouvé';
else
szMsg := 'Erreur inconnue !';
end;
Application.MessageBox(PChar(szMsg), 'Erreur', MB_OK);
Terminate;
Exit;
end;
// Instrument.
midiOutShortMsg(MidiOut, EncodeMessageMIDI1(INSTRUMENT, _nInstrumentMidi));
// Joue la note.
midiOutShortMsg(MidiOut, EncodeMessageMIDI2(NOTE_ON, Ord(_Note.GetNoteMidi), $7F));
nDuree := 0;
case _Note.GetDuree of
dTripleCroche:
nDuree := ((60000 div (_nTempo * PPQN)) * ((PPQN div 8) + IfThen(_Note._bPointee, (PPQN div 16))));
dDoubleCroche:
nDuree := ((60000 div (_nTempo * PPQN)) * ((PPQN div 4) + IfThen(_Note._bPointee, (PPQN div 8))));
dCroche:
nDuree := ((60000 div (_nTempo * PPQN)) * ((PPQN div 2) + IfThen(_Note._bPointee, (PPQN div 4))));
dNoire:
nDuree := ((60000 div (_nTempo * PPQN)) * (PPQN + IfThen(_Note._bPointee, (PPQN div 2))));
dBlanche:
nDuree := ((60000 div (_nTempo * PPQN)) * ((PPQN * 2) + IfThen(_Note._bPointee, PPQN)));
dRonde:
nDuree := ((60000 div (_nTempo * PPQN)) * ((PPQN * 4) + IfThen(_Note._bPointee, (PPQN * 2))));
dCarree:
nDuree := ((60000 div (_nTempo * PPQN)) * ((PPQN * 8) + IfThen(_Note._bPointee, (PPQN * 4))));
end;
Sleep(nDuree);
midiOutShortMsg(MidiOut, EncodeMessageMIDI2(NOTE_OFF, Ord(_Note.GetNoteMidi), $7F));
// Fermeture du port Midi.
midiOutShortMsg(MidiOut, $00007BB0);
midiOutClose(MidiOut);
end;
Terminate;
end; |
Partager