private void buttonPlay_Click(object sender, System.EventArgs e) { this.checkBoxSwap.Checked = false; this.checkBoxFlanger.Checked = false; this.checkBoxEcho.Checked = false; Bass.BASS_StreamFree(_StreamFX); if (_FileName != String.Empty) { // create the decoding stream _Stream = Bass.BASS_StreamCreateFile(_FileName, 0, 0, BASSFlag.BASS_STREAM_DECODE | BASSFlag.BASS_SAMPLE_FLOAT | BASSFlag.BASS_STREAM_PRESCAN); if (_Stream != 0) { _20mslength = (int)Bass.BASS_ChannelSeconds2Bytes(_Stream, 0.02f); // 20ms window // and start to get the BPM...BEFORE! playing bpmProc = new BPMPROCESSPROC(MyBPMProc); float bpm = BassFx.BASS_FX_BPM_DecodeGet(_Stream, 1f, 180f, Utils.MakeLong(50, 180), BASSFXBpm.BASS_FX_BPM_BKGRND | BASSFXBpm.BASS_FX_FREESOURCE | BASSFXBpm.BASS_FX_BPM_MULT2, bpmProc, IntPtr.Zero); this.labelBPM.Text = String.Format("BPM={0}", bpm); // and set the position back...so that we hear the playback from the beginning... // never get the BPM from '_Stream' while playing...this will steel the data from the decoding channel Bass.BASS_ChannelSetPosition(_Stream, 0); // now we create a Tempo channel...the actual playing channel _StreamFX = BassFx.BASS_FX_TempoCreate(_Stream, BASSFlag.BASS_FX_FREESOURCE | BASSFlag.BASS_SAMPLE_FLOAT | BASSFlag.BASS_SAMPLE_LOOP); } if (_StreamFX != 0 && Bass.BASS_ChannelPlay(_StreamFX, false)) { this.timerUpdate.Start(); // real-time beat position beatProc = new BPMBEATPROC(MyBeatProc); BassFx.BASS_FX_BPM_BeatCallbackSet(_StreamFX, beatProc, IntPtr.Zero); } else { Console.WriteLine("Error = {0}", Bass.BASS_ErrorGetCode()); } } }
public override bool Execute(ref TrackData track, int rowIndex) { TracksGrid.SetProgressBar(100); int stream = Bass.BASS_StreamCreateFile(track.FullFileName, 0, 0, BASSFlag.BASS_STREAM_DECODE); if (stream == 0) { Log.Error("BPM: Could not create stream for {0}. {1}", track.FullFileName, Bass.BASS_ErrorGetCode()); return false; } _bpmProc = BpmProgressProc; double len = Bass.BASS_ChannelBytes2Seconds(stream, Bass.BASS_ChannelGetLength(stream)); float bpm = BassFx.BASS_FX_BPM_DecodeGet(stream, 0.0, len, 0, BASSFXBpm.BASS_FX_BPM_BKGRND | BASSFXBpm.BASS_FX_FREESOURCE | BASSFXBpm.BASS_FX_BPM_MULT2, _bpmProc, IntPtr.Zero); track.BPM = Convert.ToInt32(bpm); BassFx.BASS_FX_BPM_Free(stream); TracksGrid.MainForm.progressBar1.Value = 0; return true; }
public static extern float BASS_FX_BPM_DecodeGet(int channel, double startSec, double endSec, int minMaxBPM, BASSFXBpm flags, BPMPROCESSPROC proc);
/// <summary> /// Detects the BPM /// </summary> public void Bpm() { log.Trace(">>>"); int trackCount = tracksGrid.SelectedRows.Count; foreach (DataGridViewRow row in tracksGrid.Rows) { SetProgressBar(100); ClearStatusColumn(row.Index); if (!row.Selected) { continue; } Application.DoEvents(); if (_progressCancelled) { ResetProgressBar(); return; } TrackData track = Options.Songlist[row.Index]; int stream = Bass.BASS_StreamCreateFile(track.FullFileName, 0, 0, BASSFlag.BASS_STREAM_DECODE); if (stream == 0) { log.Error("BPM: Could not create stream for {0}. {1}", track.FullFileName, Bass.BASS_ErrorGetCode()); continue; } GCHandle rowIndex = GCHandle.Alloc(row.Index); _bpmProc = BPMProgressProc; double len = Bass.BASS_ChannelBytes2Seconds(stream, Bass.BASS_ChannelGetLength(stream)); float bpm = BassFx.BASS_FX_BPM_DecodeGet(stream, 0.0, len, 0, BASSFXBpm.BASS_FX_BPM_BKGRND | BASSFXBpm.BASS_FX_FREESOURCE |BASSFXBpm.BASS_FX_BPM_MULT2, _bpmProc,GCHandle.ToIntPtr(rowIndex)); track.BPM = Convert.ToInt32(bpm); BassFx.BASS_FX_BPM_Free(stream); SetBackgroundColorChanged(row.Index); track.Changed = true; Options.Songlist[row.Index] = track; _itemsChanged = true; } Util.SendProgress(""); ResetProgressBar(); tracksGrid.Refresh(); tracksGrid.Parent.Refresh(); log.Trace("<<<"); }