Как исправить обрыв звука и загромождение при воспроизведении последовательных звуковых волн с помощью naudio - PullRequest
1 голос
/ 03 июня 2019

Я использую Naudio и пытаюсь сгенерировать код, который берет список нот (включая полутоны или четверть тона) и воспроизводит его, воспроизводя отдельные ноты из соответствующих волновых файлов. Я могу слышать обрыв звука в конце каждого воспроизводимого волнового файла

код, который я сделал, работает, но я обнаружил, что в конце каждой сыгранной ноты есть отсечение звука. какие-либо рекомендации, как решить эту проблему? какие-нибудь рекомендации по использованию кругового буфера для буферизации волн и последующего их воспроизведения? В любом случае я могу начать с понимания и использования циклических буферов с помощью naudio?

в следующем коде .. seeka.ladder представляет собой список из 8 нот, которые отправляются игроку для воспроизведения. записывается eatch note, и соответствующая волна воспроизводится после того, как она сдвинута по высоте в соответствии с ее случайным (полутонами или четвертными тонами)

Я предоставлю полный код, если необходимо.

   class Program
        {
            static void Main(string[] args)
            {


    var seeka = new Maqam(new Note()
     { Type = NoteType.E,Accedintal=AccedintalType.HBmol }, new int[] { 3, 4, 4, 3, 3, 4, 3 }, new int[] { 4, 4, 2, 4, 4, 4, 2 });

            var player = new NotePlayer();
            var path = @"C:\Users\ahmad\source\repos\OudPlayBack\OudPlayBack\Resources\"
                            + note.Type.ToString().ToLower()+ note.Octave +".wav";
            player.play(seeka.ForewardLadder);


        }

    }

    public class NotePlayer
        {

        private double upOneQuartertone;
        private double downOneQuartertone;
        private double upOneSemitone;
        private double downOneSemitone;
        public NotePlayer()
        {
            upOneQuartertone = Math.Pow(2, 1.0 / 24);
            downOneQuartertone = 1.0 / upOneQuartertone;
            upOneSemitone = upOneQuartertone * upOneQuartertone;
            downOneSemitone = 1 / upOneSemitone;
        }

        public void Play(Note note, string notePath)
        {
            var factor = SetFactor(note);

            using (var reader = new MediaFoundationReader(notePath))
            {
                var pitch = new SmbPitchShiftingSampleProvider(reader.ToSampleProvider());
                using (var device = new WaveOutEvent())
                {

                    pitch.PitchFactor = (float)factor; // or downOneTone
                                                        // just playing the first 10 seconds of the file
                    device.Init(pitch.Take(TimeSpan.FromMilliseconds(500)));
                    device.Volume = 1;
                    device.Play();
                    var x = 0;
                    while (device.PlaybackState == PlaybackState.Playing)
                    {
                        Thread.Sleep(5);
                        x += 5;
                    }

                    Console.WriteLine(x);

                }

            }
        }

        public void play(List<Note> score)
        {
            foreach (var tempnote in score)
            {
                tempnote.Octave += 1;
                var ipath = @"C:\Users\ahmad\source\repos\OudPlayBack\OudPlayBack\Resources\"
                            + tempnote.Type.ToString().ToLower() + tempnote.Octave + ".wav";
                this.Play(tempnote, ipath);
            }
        }
        private double SetFactor(Note note)
        {
            double factor = 1.0;
            switch (note.Accedintal)
            {
                case AccedintalType.Bmol:
                    factor = downOneSemitone;
                    break;
                case AccedintalType.HBmol:
                    factor = downOneQuartertone;
                    break;
                case AccedintalType.Natural:

                    break;
                case AccedintalType.HDiaz:
                    factor = upOneQuartertone;
                    break;
                case AccedintalType.Diaz:
                    factor = upOneSemitone;
                    break;
                default:
                    break;
            }
            return factor;
        }
    }

программа работает хорошо и воспроизводит ноты, но при звуке возникают очевидные обрывы и загромождение ... это становится настолько очевидным в конце каждой ноты ... это из-за удаления плеера? и начать новый? как решить это ?? Есть ли лучший способ сделать это со звуковыми шрифтами или любой другой библиотекой, кроме Naudio?

...