Ejemplo n.º 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);
        }
Ejemplo n.º 2
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());
            }
        }
Ejemplo n.º 3
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();
                }
            }
        }
Ejemplo n.º 4
0
        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());
            }
        }
Ejemplo n.º 5
0
 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);
 }