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);
 }
Esempio n. 2
0
        /// <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
        }
Esempio n. 4
0
        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);
            }
        }
Esempio n. 5
0
        // 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);
            }
        }