/// <summary> /// Gets the track tempo change as a ratio (i.e. 1.02, .97 etc) /// </summary> /// <param name="track1">The track being fading out</param> /// <param name="track2">The track being faded into.</param> /// <returns>The ratio the first track needs to be multiplied by to in order to match the second track</returns> public static float GetTrackTempoChangeAsRatio(Track track1, Track track2) { if (track1 == null || track2 == null) { return(1f); } var percentChange = (float)(BpmHelper.GetAdjustedBpmPercentChange(track1.EndBpm, track2.StartBpm)); return(1 + percentChange / 100f); }
/// <summary> /// Sets the audio stream pitch to match another BPM /// </summary> /// <param name="audioStream">The audio stream to change the temp of.</param> /// <param name="streamBpm">The stream BPM.</param> /// <param name="matchBpm">The match BPM.</param> public static void SetPitchToMatchBpm(AudioStream audioStream, decimal streamBpm, decimal matchBpm) { if (audioStream == null || audioStream.ChannelId == int.MinValue) { return; } var percentChange = (float)(BpmHelper.GetAdjustedBpmPercentChange(streamBpm, matchBpm)); //lock (Lock) { Bass.BASS_ChannelSetAttribute(audioStream.ChannelId, BASSAttribute.BASS_ATTRIB_TEMPO_PITCH, percentChange); Thread.Sleep(1); } }
internal static void SetTempoToMatchBpm(int channel, decimal streamBpm, decimal matchBpm) { if (channel == int.MinValue) { return; } var percentChange = (float)(BpmHelper.GetAdjustedBpmPercentChange(streamBpm, matchBpm)); //lock (Lock) { Bass.BASS_ChannelSetAttribute(channel, BASSAttribute.BASS_ATTRIB_TEMPO, percentChange); Thread.Sleep(1); Bass.BASS_ChannelSetAttribute(channel, BASSAttribute.BASS_ATTRIB_TEMPO_OPTION_SEQUENCE_MS, matchBpm > streamBpm ? 20 : 82); Thread.Sleep(1); } }
/// <summary> /// Sets the audio stream tempo to match another audio stream's tempo /// </summary> /// <param name="changeTrack">The audio stream to change the temp of.</param> /// <param name="matchTrack">The audio stream to match the BPM of</param> public static void SetTrackTempoToMatchAnotherTrack(Track changeTrack, Track matchTrack) { if (changeTrack == null || matchTrack == null) { return; } if (!changeTrack.IsAudioLoaded()) { return; } if (!matchTrack.IsAudioLoaded()) { return; } var percentChange = (float)(BpmHelper.GetAdjustedBpmPercentChange(changeTrack.EndBpm, matchTrack.StartBpm)); //lock (Lock) { Bass.BASS_ChannelSetAttribute(changeTrack.ChannelId, BASSAttribute.BASS_ATTRIB_TEMPO, percentChange); Thread.Sleep(1); } }
/// <summary> /// Saves the partial as wave. /// </summary> /// <param name="inFilename">The in filename.</param> /// <param name="outFilename">The out filename.</param> /// <param name="start">The start position in seconds.</param> /// <param name="length">The length in seconds.</param> /// <param name="offset">The offset position in seconds.</param> /// <param name="gain">The gain.</param> /// <param name="bpm">The BPM.</param> /// <param name="targetBpm">The target BPM.</param> public static void SavePartialAsWave(string inFilename, string outFilename, double start, double length, double offset = 0, float gain = 0, decimal bpm = 0, decimal targetBpm = 0) { // DebugHelper.WriteLine("Saving portion of track as wave with offset - " + inFilename); var audioStream = new Sample { Filename = inFilename, Description = inFilename, Gain = gain, Bpm = bpm }; AudioStreamHelper.LoadAudio(audioStream); if (targetBpm != 0) { if (bpm == 0) { bpm = BpmHelper.GetBpmFromLoopLength(length); } var percentChange = BpmHelper.GetAdjustedBpmPercentChange(bpm, targetBpm) / 100; AudioStreamHelper.SetTempoToMatchBpm(audioStream.ChannelId, bpm, targetBpm); length = length * (double)(1 + percentChange); } const BASSEncode flags = BASSEncode.BASS_ENCODE_PCM; BassEnc.BASS_Encode_Start(audioStream.ChannelId, outFilename, flags, null, IntPtr.Zero); var startByte = Bass.BASS_ChannelSeconds2Bytes(audioStream.ChannelId, start); var endByte = Bass.BASS_ChannelSeconds2Bytes(audioStream.ChannelId, start + length); if (offset == 0 || offset == start) { TransferBytes(audioStream.ChannelId, startByte, endByte); } else { startByte = Bass.BASS_ChannelSeconds2Bytes(audioStream.ChannelId, offset); TransferBytes(audioStream.ChannelId, startByte, endByte); startByte = Bass.BASS_ChannelSeconds2Bytes(audioStream.ChannelId, start); endByte = Bass.BASS_ChannelSeconds2Bytes(audioStream.ChannelId, offset); TransferBytes(audioStream.ChannelId, startByte, endByte); } BassEnc.BASS_Encode_Stop(audioStream.ChannelId); Bass.BASS_StreamFree(audioStream.ChannelId); AudioStreamHelper.UnloadAudio(audioStream); }