Я использую 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?