IronPython内でNAudioを使用して、複数のオーディオストリームを混合してアンビエントオーディオを作成しています。これはいくつかのトラックではうまく動作しますが、いくつかのトラック(風、雨)の場合は、ループ再生で不快感を与えることがあります。IronPython NAudioルーピングクロスフェードグリッチ
私はLoopStreamクラスの例をPythonで実装する方法を100%確信していなかったので、10分の1秒以下で位置チェックを行うだけでした。私はなぜそこにギャップがあるのか知っています。それ以来、私はPythonでLoopStreamを再作成する方法を見つけ出すことができました。それはうまくいきましたが、以前と同じように再生のギャップが残っていました。私はトラックの終わりを同じトラックの始めにクロスフェードしようとしています。そのとき、オーディオが完全に不具合を起こします。ここ
はコードです:愚かな質問をして申し訳ありません
class LoopStream(WaveStream):
def __init__(self,WaveStream,AudioStream):
self.wavestream = WaveStream
self.audiostream = AudioStream
def get_WaveFormat(self):
return self.wavestream.WaveFormat
def get_Length(self):
return self.wavestream.Length
def get_Position(self):
return self.wavestream.Position
def HasData(count):
return True
def Read(self,buf,offset,count):
read = 0
while(read < count):
required = count - read
#print(str(self.audiostream.get_chan_id()) + " reading @ " + str(self.wavestream.Position) + "/" + str(self.wavestream.Length))
pos = self.wavestream.Position
readthistime = self.wavestream.Read(buf,offset+read,required)
if pos == 0:
self.startbuf = buf
if readthistime < required:
self.wavestream.Position = 0
#print(len(buf))
#buf = buf+self.startbuf
print(len(buf))
buf = FadeOut(self,buf,offset,readthistime) + FadeIn(self,self.startbuf,0,required)
print(len(buf))
readthistime+=required
print(str(self.audiostream.get_chan_id()) + " restarting1")
elif self.wavestream.Position + required > self.wavestream.Length:
#read += readthistime
#readthistime = self.wavestream.Read(buf,self.wavestream.Position,required)
#print(str(self.audiostream.get_chan_id()) + " restarting2")
pass
if self.wavestream.Position >= self.wavestream.Length:
self.wavestream.Position = 0
buf = buf + self.startbuf
print(str(self.audiostream.get_chan_id()) + " restarting3")
read += readthistime
return read
def FadeOut(self,buf,offset,count):
sample = 0
maxfadesamples = int((self.wavestream.WaveFormat.SampleRate * 75)/1000)
fadesamples = 0
while sample < count:
multiplier = 1.0 - (fadesamples/maxfadesamples)
for i in range(0,self.wavestream.WaveFormat.Channels):
buf[offset+sample] *= multiplier
sample+=1
fadesamples+=1
if fadesamples > maxfadesamples:
for j in range(0,self.wavestream.WaveFormat.Channels):
while sample < count:
buf[offset+sample] = 0
sample+=1
def FadeOut(self,buf,offset,count):
sample = 0
maxfadesamples = int((self.wavestream.WaveFormat.SampleRate * 75)/1000)
fadesamples = 0
while sample < count:
multiplier = (fadesamples/maxfadesamples)
for i in range(0,self.wavestream.WaveFormat.Channels):
buf[offset+sample] *= multiplier
sample+=1
fadesamples+=1
のErr ...まだ、私が投稿した直後にいくつかの問題に気づいたので、私はちょうどここに...エラー処理文を追加することに慣れる必要が気付いたので、私は自分が1)フェードアウトが2回宣言された解決に終わる可能性がありFadeInは実際にはまったく存在しません。 FadeOut#2をFadeInに名前を変更すると、それはまだ不具合がありましたが、無限ループに詰まっていたためです。私はそれを修正してまだ問題があるが、私はそれがどこか他の場所で読み込み機能に誤りがあると思う。 –