Example #1
0
        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);
        }
Example #2
0
        private void LoopSync(int handle, int channel, int data, IntPtr user)
        {
            BASS_MIDI_MARK mark = new BASS_MIDI_MARK();

            if (FindMarker(channel, "loopstart", mark))
            {
                Bass.BASS_ChannelSetPosition(channel, mark.pos, BASSMode.BASS_POS_BYTES | BASSMode.BASS_MIDI_DECAYSEEK);
            }
            else
            {
                Bass.BASS_ChannelSetPosition(channel, 0, BASSMode.BASS_POS_BYTES | BASSMode.BASS_MIDI_DECAYSEEK);
            }
        }
Example #3
0
        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());
            }
        }
Example #4
0
        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();
                }
            }
        }