private bool FindMarker(int handle, string text, BASS_MIDI_MARK mark) { int a; for (a = 0; BassMidi.BASS_MIDI_StreamGetMark(handle, BASSMIDIMarker.BASS_MIDI_MARK_MARKER, a, mark); a++) { if (mark.text.ToLowerInvariant() == text.ToLowerInvariant()) { return(true); } } return(false); }
private void LyricSync(int handle, int channel, int data, IntPtr user) { try { BASS_MIDI_MARK mark = new BASS_MIDI_MARK(); string text; string p; int lines; BassMidi.BASS_MIDI_StreamGetMark(channel, (BASSMIDIMarker)user, data, mark); text = mark.text; if (text[0] == '@') { lyrics = "No lyrics available."; return; // skip info } if (text[0] == '\\') { // clear display lyrics = "" + text.Substring(1); p = lyrics; } else { if (text[0] == '/') { // new line text = '\n' + text.Substring(1); } lyrics += text; } lines = lyrics.Split('\n').Length; if (lines > 3) { // remove old lines so that new lines fit in display... int a; for (a = 0; a < lines - 3; a++) { lyrics = lyrics.Substring(lyrics.IndexOf('\n') + 1); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
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(); } } }
private void FrameConverter_DoWork(object sender, DoWorkEventArgs e) { try { // Initialize BASS and variables Bass.BASS_Init(0, 44100, BASSInit.BASS_DEVICE_NOSPEAKER, IntPtr.Zero); Bass.BASS_SetConfig(BASSConfig.BASS_CONFIG_MIDI_VOICES, 0); Data.StreamHandle = BassMidi.BASS_MIDI_StreamCreateFile(Data.MIDIToLoad, 0L, 0L, BASSFlag.BASS_MIDI_NOCROP | BASSFlag.BASS_STREAM_DECODE | BASSFlag.BASS_MIDI_DECAYEND, 0); Data.PlayedNotesAvg = new List <Double>(); // Check if the MIDI file is valid BASSError Error = Bass.BASS_ErrorGetCode(); if (Error == BASSError.BASS_ERROR_ILLPARAM || Error == BASSError.BASS_ERROR_FILEOPEN || Error == BASSError.BASS_ERROR_FILEFORM) { MessageBox.Show("Invalid MIDI file.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); Settings.Interrupt = true; return; } Data.OsuemSize = Properties.Settings.Default.CounterFont.Size; Int64 StreamLength = Bass.BASS_ChannelGetLength(Data.StreamHandle); Int32 ChunkLength = Convert.ToInt32(Bass.BASS_ChannelSeconds2Bytes(Data.StreamHandle, FFMPEGProcess.Hertz)); Byte[] Buffer; // Initialize played notes sync Data.NoteSync = new SYNCPROC(NoteSyncProc); Bass.BASS_ChannelSetSync(Data.StreamHandle, BASSSync.BASS_SYNC_MIDI_EVENT, (long)BASSMIDIEvent.MIDI_EVENT_NOTE, Data.NoteSync, IntPtr.Zero); // Initialize time signature sync BassMidi.BASS_MIDI_StreamGetMark(Data.StreamHandle, BASSMIDIMarker.BASS_MIDI_MARK_TIMESIG, 0, Data.Mark); Data.TimeSigSync = new SYNCPROC(TimeSigSyncProc); Bass.BASS_ChannelSetSync(Data.StreamHandle, BASSSync.BASS_SYNC_MIDI_TIMESIG, (long)BASSMIDIMarker.BASS_MIDI_MARK_TIMESIG, Data.TimeSigSync, IntPtr.Zero); // Initialize note count Data.TotalNotes = Convert.ToUInt32(BassMidi.BASS_MIDI_StreamGetEvents(Data.StreamHandle, -1, (BASSMIDIEvent)0x20000, null)); Data.HowManyZeroesNotes = String.Concat(Enumerable.Repeat("0", Data.TotalNotes.ToString().Length)); // Initialize conversion if (!StartConversion(Data.MIDIToLoad)) { return; } FPSUpdate(); if (Properties.Settings.Default.StillFramesBeginning) { for (int a = 0; a <= (Properties.Settings.Default.FPSExport * 5); a++) { // 5 seconds of nothing if (Settings.Interrupt == true) { break; } CheckPosition(); Data.NotesPerSecond = "0"; PushFrame(false); FFMPEGProcess.Frames++; FPSUpdate(); } } while (Bass.BASS_ChannelIsActive(Data.StreamHandle) == BASSActive.BASS_ACTIVE_PLAYING) { if (Data.OsuemSize > Properties.Settings.Default.CounterFont.Size) { Data.OsuemSize -= (Properties.Settings.Default.CounterFont.Size / 24); if (Data.OsuemSize < Properties.Settings.Default.CounterFont.Size) { Data.OsuemSize = Properties.Settings.Default.CounterFont.Size; } } else { Data.OsuemSize = Properties.Settings.Default.CounterFont.Size; } if (Settings.Interrupt == true) { break; } Buffer = new Byte[ChunkLength]; Bass.BASS_ChannelGetData(Data.StreamHandle, Buffer, ChunkLength); CheckPosition(); if (FFMPEGProcess.Frames % (ulong)Properties.Settings.Default.FPSExport == 0) { Data.NotesPerSecond = Data.PlayedNotesFrame.ToString(); Data.PlayedNotesAvg.Add(Data.PlayedNotesFrame); Data.AverageNotesPerSecond = Data.PlayedNotesAvg.Average().ToString("0.0"); Data.PlayedNotesFrame = 0; } PushFrame(false); FFMPEGProcess.Frames++; FPSUpdate(); } Buffer = new Byte[ChunkLength]; Bass.BASS_ChannelGetData(Data.StreamHandle, Buffer, ChunkLength); if (Properties.Settings.Default.StillFramesEnd) { for (int a = 0; a <= (Properties.Settings.Default.FPSExport * 5); a++) { if (Data.OsuemSize > Properties.Settings.Default.CounterFont.Size) { Data.OsuemSize -= (Properties.Settings.Default.CounterFont.Size / 24); if (Data.OsuemSize < Properties.Settings.Default.CounterFont.Size) { Data.OsuemSize = Properties.Settings.Default.CounterFont.Size; } } else { Data.OsuemSize = Properties.Settings.Default.CounterFont.Size; } // 5 seconds of nothing if (Settings.Interrupt == true) { break; } CheckPosition(); Data.NotesPerSecond = "0"; PushFrame(false); FFMPEGProcess.Frames++; FPSUpdate(); } } for (int i = 0; i < Data.PlayedNotesChan.Length; i++) { Data.PlayedNotesChan[i] = 0; } Data.Mark = new BASS_MIDI_MARK(); FFMPEGProcess.Frames = 0; FFMPEGProcess.FFMPEG.StandardInput.Close(); Bass.BASS_StreamFree(Data.StreamHandle); Bass.BASS_Free(); Settings.Interrupt = false; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
private void TimeSigSyncProc(int handle, int channel, int data, IntPtr user) { BassMidi.BASS_MIDI_StreamGetMark(Data.StreamHandle, BASSMIDIMarker.BASS_MIDI_MARK_TIMESIG, data, Data.Mark); }