public PercussionNoteSegment( int track, MidiEventWithTime <OnNoteVoiceMidiEvent> onNoteEvent, MidiEventWithTime <OffNoteVoiceMidiEvent> offNoteEvent, int startSample, int durationSamples, GeneralMidiPercussion instrument) : base(track, onNoteEvent, offNoteEvent, startSample, durationSamples) { PercussionInstrument = instrument; PercussionType = PercussionHelper.GetPercussionType(instrument); }
/// <summary> /// Gets the duration of a percussion note based on its generalized type. Used by the default INoteSegmentProvider implementation. /// </summary> /// <param name="percussionType"></param> /// <returns></returns> public static int GetPercussionDurationSamples(PercussionType percussionType) { // 440 ms (when samping at 44100 hz). This is the default for Kicker in LMMS int percussionSampleCount = 19404; // Bass drum has a shorter sample count to be "punchier" if (percussionType == PercussionType.Bass) { return((int)(percussionSampleCount * 0.5)); } return(percussionSampleCount); }
private float GetPercussionMultiplier(PercussionType percussionType) { if (PercussionLevels is null || PercussionLevels.Count == 0) { return(DefaultMultiplier); } if (PercussionLevels.TryGetValue(percussionType, out float multiplier)) { return(multiplier); } return(DefaultMultiplier); // Default to a "non-modified" multiplier }
private AdsrParameters GetPercussionAdsrParameters(PercussionType percussionType) { switch (percussionType) { case PercussionType.Bass: // Same as default but with a AttackAmplitude of 3 return(new AdsrParameters(0.05, 0.1, 1, 0.075, 3)); case PercussionType.Snare: return(AdsrParameters.Default); case PercussionType.Crash: return(AdsrParameters.Long); case PercussionType.Ride: default: return(AdsrParameters.Short); } }
// todo Abundant Music WebAudioPlayer has synthesis settings. How did it do the percussion? private DiscreteSignal GetPercussionSignal(PercussionType percussionType, int sampleCount) { switch (percussionType) { // Bass drums case PercussionType.Bass: var bass = SignalHelper.GetChirp(90, 120, sampleCount); var bass2 = SignalHelper.GetChirp(180, 240, sampleCount); var bass3 = SignalHelper.GetChirp(270, 360, sampleCount); // The chirp builder goes in the "up" direction, so we need to reverse it to go "down" bass = new DiscreteSignal(Constants.SAMPLE_RATE, bass.Samples.Reverse()); bass2 = new DiscreteSignal(Constants.SAMPLE_RATE, bass2.Samples.Reverse()); bass3 = new DiscreteSignal(Constants.SAMPLE_RATE, bass3.Samples.Reverse()); // Combine the two bass signals so that the bass has more "presence" bass = bass.Superimpose(bass2).Superimpose(bass3); return(bass); // Snare drums case PercussionType.Snare: var snare = SignalHelper.GetKarplusStrongDrum(0.5, 30, 1, 1, sampleCount); return(snare); // Crash drums case PercussionType.Crash: var crash = SignalHelper.GetKarplusStrongDrum(0.5, 11, 1, 1, sampleCount); return(crash); // Ride drums case PercussionType.Ride: // Defaulting to a ride drum probably isn't good, but it will sound in lots of situations. default: var ride = SignalHelper.GetKarplusStrongDrum(0.5, 60, 0.1, 1, sampleCount); return(ride); } }