hello to all
i am making the MIDI palyer if Windows mobile. i am refering this
http://www.ifihadadollarforeverytime...site.com/Midi/
i managed to get it compiled . however it return MMSYSERR_ERROR
does any body encontered the same problem! here is the code
with regardsCode:bool CMIDIDlg::playMidi(CString name) { AfxMessageBox(name); #ifdef PLAY_MIDI struct miditrack seq[MAXTRKS]; CFile f; f.Open(name.GetBuffer(), CFile::modeRead | CFile::shareDenyWrite); unsigned char * p = new unsigned char[f.GetLength()+1]; f.Read(p, f.GetLength()); int tracks = readmidi(p, f.GetLength(), seq); WAVEFORMAT_MIDI wfm; // WAVEFORMATEX memset(&wfm,0,sizeof(wfm)); wfm.USecPerQuarterNote=263157; // wfm.USecPerQuarterNote=1000000; wfm.TicksPerQuarterNote=(p[12]<<8) | p[13];//480 // wfm.TicksPerQuarterNote= 100; int j = parseMidiData(0, &wfm.USecPerQuarterNote, &wfm.TicksPerQuarterNote, 0, seq); wfm.USecPerQuarterNote=263157; // wfm.USecPerQuarterNote=1000000; wfm.TicksPerQuarterNote=480; // wfm.TicksPerQuarterNote=100; if (j < 48) { MMRESULT Result; HWAVEOUT hWaveOut; HANDLE hEvent; hEvent=CreateEvent( NULL,TRUE,FALSE,NULL); wfm.wfx.wFormatTag=WAVE_FORMAT_MIDI; wfm.wfx.nChannels=1; wfm.wfx.nSamplesPerSec=32; wfm.wfx.nAvgBytesPerSec=32; wfm.wfx.nBlockAlign=sizeof(WAVEFORMAT_MIDI_MESSAGE); wfm.wfx.wBitsPerSample=16; wfm.wfx.cbSize=WAVEFORMAT_MIDI_EXTRASIZE; Result = waveOutOpen(&hWaveOut, WAVE_MAPPER, (LPWAVEFORMATEX)&wfm, (DWORD)waveOutProc, (DWORD)hEvent, CALLBACK_FUNCTION); if (Result!=MMSYSERR_NOERROR) { DWORD i = GetLastError(); return false; } waveOutSetVolume(hWaveOut, 0x7777 ); WAVEFORMAT_MIDI_MESSAGE MidiMessage[48]; /* WAVEFORMAT_MIDI_MESSAGE * MidiMessage; MidiMessage = new WAVEFORMAT_MIDI_MESSAGE[48]; //*/ parseMidiData(MidiMessage, 0, 0, 0, seq); MidiMessage[j].DeltaTicks=0; MidiMessage[j].MidiMsg=0; j++; f.Close(); delete [] p; //s.Format(L"created %d midi messages", j); //MessageBox(s); WAVEHDR WaveHdr; WaveHdr.lpData = (LPSTR)&MidiMessage; WaveHdr.dwBufferLength = sizeof(WAVEFORMAT_MIDI_MESSAGE) * j; WaveHdr.dwFlags = 0; WaveHdr.dwLoops = 1; Result = waveOutPrepareHeader(hWaveOut,&WaveHdr,sizeof(WaveHdr)); if (Result != MMSYSERR_NOERROR) MessageBox(L"waveOutPrepareHeader failed"); else { Result = waveOutWrite(hWaveOut,&WaveHdr,sizeof(WaveHdr)); if (Result != MMSYSERR_NOERROR) MessageBox(L"waveOutWrite failed"); else { WaitForSingleObject(hEvent,10000); } Result = waveOutUnprepareHeader(hWaveOut,&WaveHdr,sizeof(WaveHdr)); } waveOutReset(hWaveOut); Result = waveOutClose(hWaveOut); //delete [] MidiMessage; return true; } else { f.Close(); delete [] p; return false; } #else return false; #endif }




Reply With Quote