Entwickler-Ecke

Multimedia / Grafik - BASS_MIDI_StreamEvent + MIDI_EVENT_NOTE


Norbert Stellberg - Mo 16.08.10 18:07
Titel: BASS_MIDI_StreamEvent + MIDI_EVENT_NOTE
Hallo,
ich habe mal wieder ein BASS Unverständnis.
Aus einem laufenden Midifile möchte ich die Velocity extrahieren.
Ich habe das so gemacht:

Dies läuft in einem Timer:

b:boolean; Note,Vol,vv: DWord;

for i := 0 to 15 do
begin
b:= BASS_MIDI_StreamEvent(Chan,i,MIDI_EVENT_NOTE,vv);
if b then
begin
Note := (vv and $FF);
Vol := (vv Shr 8 ) and $ff;
end;
end;

Laut Doku sollte das richtig sein.
Aber ich erhalte für Note immer der Wert 160 und für Vol immer 255

Was mache ich da falsch? Kann mir jemand helfen?
Mit freundlichen Grüßen
Norbert


elundril - Mo 16.08.10 18:17

Probier mal


Delphi-Quelltext
1:
2:
Note := LoByte(vv);
Vol := HiByte(vv);


und verwende bitte die [delphi][/delphi]-Tags für deine Quelltexte hier im Forum.

lg elundril


Norbert Stellberg - Mo 16.08.10 21:30

Hallo,

vielen Dank. Aber das hatte ich auch schon probiert.

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Probier mal

Delphi-Quelltext
1:
2:
Note := LoByte(vv);
Vol := HiByte(vv);



Im Bass Forum sagte man mit:

dass das so gehen müsse:

BASS_ChannelSetSync(handle, BASS_SYNC_MIDI_EVENT, MIDI_EVENT_NOTE, NoteSyncProc, NULL); // set the NOTE event sync

void CALLBACK NoteSyncProc(HSYNC handle, DWORD channel, DWORD data, void *user)
{
int chan=HIWORD(data); // MIDI channel number
int note=LOBYTE(data); // note
int vel=HIBYTE(data); // velocity
// do something with that information...
}


Und da das wohl C ist, hab ich da keine Ahnung von.
Kannst Du da nochmal helfen?

Und:
Wofür ist das "delphi /delphi" Welche Bewandnis hat das?
Sorry, Ich bin halt ein Newbie........

Mit freundlichen Grüßen
Norbert


elundril - Di 17.08.10 00:36

user profile iconNorbert Stellberg hat folgendes geschrieben Zum zitierten Posting springen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
BASS_ChannelSetSync(handle, BASS_SYNC_MIDI_EVENT, MIDI_EVENT_NOTE, NoteSyncProc, NULL); // set the NOTE event sync

void CALLBACK NoteSyncProc(HSYNC handle, DWORD channel, DWORD data, void *user)
{
  int chan=HIWORD(data); // MIDI channel number
  int note=LOBYTE(data); // note
  int vel=HIBYTE(data); // velocity
  // do something with that information...
}


Und da das wohl C ist, hab ich da keine Ahnung von.
Kannst Du da nochmal helfen?


Ich kann zwar selbst kein C/C++ aber ich versuch es mal:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
BASS_ChannelSetSync(handle, BASS_SYNC_MIDI_EVENT, MIDI_EVENT_NOTE, @NoteSyncProc, 0);  //Set the NOTE event sync

procedure NoteSyncProc(handle: HSYNC; channel: DWORD; data: DWORD; user: Pointer); stdcall;
var chan, note, vel: Integer;
begin
  chan := HiWord(data);  //MIDI channel number
  note := LoByte(data);  //note
  vel := HiByte(data);  //velocity
  //do something with that information


Ich hoffe ich hab alles richtig gemacht, ist das erste mal das ich von C/C++ übersetzt habe und dass ich mit CallBacks arbeite.

user profile iconNorbert Stellberg hat folgendes geschrieben Zum zitierten Posting springen:

Und:
Wofür ist das "delphi /delphi" Welche Bewandnis hat das?
Sorry, Ich bin halt ein Newbie........

Mit freundlichen Grüßen
Norbert


Damit mein ich du sollt vor den Quelltext den du hier im Forum postest ein [delphi] schreiben und nach dem Quelltext ein [/delphi]. Dann wird dein Quelltext hervorgehoben, so wie hier:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure foo(var Omfg: String);
var i: integer;
begin
  for i := 0 to MaxInt do
    Showmessage(IntToStr(i));  //Bitte nicht ausprobieren sonst kommen seeehr viele Fenster!
end;