Avatar billede jeppebecool Nybegynder
31. maj 2000 - 18:57 Der er 2 kommentarer og
1 løsning

Low Level Midi Api

Hvordan benytter man funktionerne i mmsystem uniten til at afspille midi  notes. Jeg kan ikke bruge medieafspilleren til mit program.

Jeg har ikke så meget forstand på handles og pointere, så svaret må meget gerne være 'brugervenligt'.

På forhånd tak
Avatar billede stone Forsker
03. juni 2000 - 00:23 #1
I biblioteket borland/delphi/bin ligger der et program som kan lave en resource fil.Programmet hedder BRCC32.EXE.
Åbn notesblok(eller din favorit tekst editor)og opret en ny fil.
skriv følgende:
JUMP MIDI "jump.midi"
OKIE MIDI "okie.midi"
Gem filen som *.rc, jeg vælger Sounds.rc
Det første ord er det navn som du vil refererer til i den kode som skal spille lyden.
Det andet er den type lyd du vil afspille.
*.Midi filerne skal være i samme bibliotek som din *.rc fil.
Opret et bibliotek med navn source(frit valg)flyt følgende filer til source:BRCC32.EXE,*.rc.
skriv følgende "brcc32.exe sounds.rc"
dette vil lave en sounds.res fil.
I dit program skriver du neden under {$R*.DFM} følgende {$R SOUNDS.RES}
og i uses skriver du MMSYSTEM.
her er følgende kode til den valgte event:
PlaySound(PChar('jump',hInstance,snd_Sync or snd_resource);
PlaySound(PChar('okie'),hInstance,snd_Async or snd_Resource.
forskellen på Sync, og Async er at Sync ikke kan afbrydes før den er færdig.


Avatar billede michaelras Nybegynder
04. juni 2000 - 15:03 #2
Mener du de enkelte noder? Hvis ja, så sådan her:

Result := midiOutOpen(@outHandle, 0, 0, 0, CALLBACK_NULL); // Åbner standard MIDI Out enhed
if Boolean(Result) then
begin
    ShowMessage('Fejl under åbningen af "standard MIDI Out enhed"!');
    Exit;
end;
midiOutShortMsg(OutHandle, $403C90); // Spil C node
// evt en Sleep(500), for at får den til at vente, inden den stopper med at spille tonon C
midiOutShortMsg(OutHandle, $003C90); // Stop med at spil C node
midiOutClose(OutHandle); // Luk MIDI Out enheden igen



Hvad følgende gør: midiOutShortMsg(OutHandle, $403C90);
Splittet op i 3: (alle i HEX tal)
  40 = hastigheden = normal (nå det drejer sig om noder) (00 = stop med at spil den pågældende node)
  3C = miderste C node (node $3C (=60)) ($3D = C#, $3E = D, $3F = D#, $40 = E osv)
  90 = Fortæller der er noder, og de skal spilles i 1. MIDI kanal (91 = 2. MIDI kanal, 92 = 3. ... 9F = 16.)


Hvis du vil afspille en MIDI fil i stedet, kan du fx gøre således:

procedure AfspilMIDI(Filnavn, Alias : String);
  var Buf : PChar;
      Err : Integer;
begin
    Err := mciSendString(PChar('open '+FilNavn+' type sequencer alias ' + Alias), nil, 0, 0);
    if Err = 0 then mciSendString(PChar('play '+Alias), nil, 0, 0)
    else
    begin
          GetMem(Buf, 256);
          FillChar(Buf^, 256, 0);
          mciGetErrorString(err, buf, 256);
          ShowMessage('Fejl under åbningen af MIDI-fil:'#10#13 + buf);
          FreeMem(buf);
    end;
end;


procedure StopMIDI(Alias : String);
begin
    mciSendString(PChar('stop '+Alias), nil, 0, 0);
    mciSendString(PChar('close '+Alias), nil, 0, 0);
end;

Altså:
AfspilMIDI('C:\Windows\Media\NewGrass.Mid', 'NewGrass');

og senere stoppe+lukke den med
StopMIDI('NewGrass');

Michael

PS:
Stone: PlaySound kan ikke bruges til MIDI, i hvert fald ikke på alle computere (deriblandt min)
Avatar billede michaelras Nybegynder
04. juni 2000 - 15:05 #3
I eksemplet med noder er følgende variabler:
var
  outHandle : THandle;
  Result    : Integer;

Michael
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester