private void SelectMIDIDialog_Click(object sender, EventArgs e) { Init: OpenMIDI.InitialDirectory = Properties.Settings.Default.LastMIDIFolder; if (OpenMIDI.ShowDialog() == DialogResult.OK) { if (Path.GetExtension(OpenMIDI.FileName).ToLower() != ".mid") { MessageBox.Show("Select a MIDI!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); goto Init; } else { Data.MIDIToLoad = OpenMIDI.FileName; String MIDIFileName = Path.GetFileName(Data.MIDIToLoad); if (MIDIFileName.Length > 55) { CurrentMIDILoaded.Text = Path.GetFileName(Data.MIDIToLoad).Truncate(55) + "..."; } else { CurrentMIDILoaded.Text = Path.GetFileName(Data.MIDIToLoad); } Properties.Settings.Default.LastMIDIFolder = Path.GetDirectoryName(OpenMIDI.FileName); Properties.Settings.Default.Save(); CurrentMIDILoaded.ToolTipText = String.Format("Selected MIDI:\n{0}", Data.MIDIToLoad); } } }
private void OpenMIDIButton_Click(object sender, EventArgs e) { if (OpenMIDI.ShowDialog() == DialogResult.OK) { Bass.BASS_StreamFree(chan); if (!IsWinXPOrOlder()) { BassWasapi.BASS_WASAPI_Free(); WasapiProc = new WASAPIPROC(MyWasapiProc); BassWasapi.BASS_WASAPI_Init(-1, 0, 2, BASSWASAPIInit.BASS_WASAPI_BUFFER | BASSWASAPIInit.BASS_WASAPI_SHARED, 0.5f, 0, WasapiProc, IntPtr.Zero); } LoopSyncProc = null; LyricSyncProc = null; EndSyncProc = null; TempoSyncProc = null; LyricsFromStream.Text = ""; if ((chan = BassMidi.BASS_MIDI_StreamCreateFile(OpenMIDI.FileName, 0L, 0L, (IsWinXPOrOlder() ? BASSFlag.BASS_DEFAULT : (BASSFlag.BASS_STREAM_DECODE | BASSFlag.BASS_SAMPLE_FLOAT)) | BASSFlag.BASS_MIDI_DECAYEND | (RvAndChr.Checked ? BASSFlag.BASS_MIDI_NOFX : 0), 0)) == 0) { OpenMIDIButton.Text = "Click here to open a file..."; MIDITitle.Text = ""; Position.Text = "-"; Error("Can't play the file"); return; } Bass.BASS_ChannelSetAttribute(chan, BASSAttribute.BASS_ATTRIB_MIDI_VOICES, VoiceBar.Value); // apply to current MIDI file too Bass.BASS_ChannelSetAttribute(chan, BASSAttribute.BASS_ATTRIB_MIDI_CPU, CPUBar.Value); // apply to current MIDI file too OpenMIDIButton.Text = OpenMIDI.FileName; { // set the title (track name of first track) BASS_MIDI_MARK mark = new BASS_MIDI_MARK(); if (BassMidi.BASS_MIDI_StreamGetMark(chan, BASSMIDIMarker.BASS_MIDI_MARK_TRACK, 0, mark) && mark.track == 0) { MIDITitle.Text = mark.text; } else { MIDITitle.Text = ""; } } TrackbarStream.Value = 0; TrackbarStream.Minimum = 0; TrackbarStream.Maximum = (int)Bass.BASS_ChannelGetLength(chan, BASSMode.BASS_POS_MIDI_TICK) / 120; { // set looping syncs BASS_MIDI_MARK mark = new BASS_MIDI_MARK(); LoopSyncProc = new SYNCPROC(LoopSync); if (FindMarker(chan, "loopend", mark)) // found a loop end point { Bass.BASS_ChannelSetSync(chan, BASSSync.BASS_SYNC_POS | BASSSync.BASS_SYNC_MIXTIME, mark.pos, LoopSyncProc, IntPtr.Zero); // set a sync there } Bass.BASS_ChannelSetSync(chan, BASSSync.BASS_SYNC_END | BASSSync.BASS_SYNC_MIXTIME, 0, LoopSyncProc, IntPtr.Zero); // set one at the end too (eg. in case of seeking past the loop point) } { // clear lyrics buffer and set lyrics syncs BASS_MIDI_MARK mark = new BASS_MIDI_MARK(); LyricSyncProc = new SYNCPROC(LyricSync); EndSyncProc = new SYNCPROC(EndSync); lyrics = ""; if (BassMidi.BASS_MIDI_StreamGetMark(chan, BASSMIDIMarker.BASS_MIDI_MARK_LYRIC, 0, mark)) // got lyrics { Bass.BASS_ChannelSetSync(chan, BASSSync.BASS_SYNC_MIDI_MARKER, (long)BASSMIDIMarker.BASS_MIDI_MARK_LYRIC, LyricSyncProc, (IntPtr)BASSMIDIMarker.BASS_MIDI_MARK_LYRIC); } else if (BassMidi.BASS_MIDI_StreamGetMark(chan, BASSMIDIMarker.BASS_MIDI_MARK_TEXT, 20, mark)) // got text instead (over 20 of them) { Bass.BASS_ChannelSetSync(chan, BASSSync.BASS_SYNC_MIDI_MARKER, (long)BASSMIDIMarker.BASS_MIDI_MARK_TEXT, LyricSyncProc, (IntPtr)BASSMIDIMarker.BASS_MIDI_MARK_TEXT); } Bass.BASS_ChannelSetSync(chan, BASSSync.BASS_SYNC_END, 0, EndSyncProc, IntPtr.Zero); } { // override the initial tempo, and set a sync to override tempo events and another to override after seeking SetTempo(true); TempoSyncProc = new SYNCPROC(TempoSync); Bass.BASS_ChannelSetSync(chan, BASSSync.BASS_SYNC_MIDI_EVENT | BASSSync.BASS_SYNC_MIXTIME, (long)BASSMIDIEvent.MIDI_EVENT_TEMPO, TempoSyncProc, IntPtr.Zero); Bass.BASS_ChannelSetSync(chan, BASSSync.BASS_SYNC_SETPOS | BASSSync.BASS_SYNC_MIXTIME, 0, TempoSyncProc, IntPtr.Zero); } { // get default soundfont in case of matching soundfont being used BASS_MIDI_FONT[] sf = { new BASS_MIDI_FONT(font, fontp, fontb) }; // now set them BassMidi.BASS_MIDI_StreamSetFonts(chan, sf, sf.Length); } } Bass.BASS_ChannelSetAttribute(chan, BASSAttribute.BASS_ATTRIB_MIDI_CPU, 95); if (PlayPauseBtn.Text != "Pause") { if (IsWinXPOrOlder()) { Bass.BASS_ChannelPlay(chan, true); } else { BassWasapi.BASS_WASAPI_Start(); } } }