JSyn循环工作站:如何将所有采样输出连接至WaveRecorder录制混音?
JSyn中录制多采样叠加混音的最优方案
嘿,我刚好对JSyn的音频路由这块比较熟悉,给你梳理下怎么搞定这个录制问题~
你之前直接把每个采样播放器连到LineOut能听到叠加声音,是因为LineOut内部其实帮你做了混音,但如果要录制最终的混合音频,咱们得自己搭建一个专门的混音单元,也就是你看到文档里的finalMix,这样既能让用户听到声音,又能把混合后的信号传给WaveRecorder。
具体实现步骤:
- 创建混音器单元:
JSyn提供了Mix2(固定2路输入)和MixN(可自定义输入数量)两种混音器,如果你不确定未来会有多少个采样需要叠加,优先用MixN更灵活。 - 路由所有采样到混音器:
把每个采样播放器的输出端口(比如单声道的output,或者立体声的left/right)分别连接到混音器的不同输入通道。 - 同时连接混音器到LineOut和WaveRecorder:
混音器的输出要分两路:一路连LineOut保证用户能实时听到声音,另一路连WaveRecorder的输入端口,这样录制的就是最终的混合音频了。
代码示例(Java版):
// 初始化JSyn合成器 Synth synth = JSyn.createSynth(); synth.start(); // 创建LineOut用于监听 LineOut lineOut = new LineOut(); synth.add(lineOut); lineOut.start(); // 创建finalMix:这里设为4路输入,可根据你的采样数量调整 MixN finalMix = new MixN(synth, 4); synth.add(finalMix); // 假设你已经有几个采样播放器:drumSampler, melodySampler, bassSampler // 把每个采样的输出连到finalMix的不同输入通道 drumSampler.output.connect(0, finalMix.input, 0); melodySampler.output.connect(0, finalMix.input, 1); bassSampler.output.connect(0, finalMix.input, 2); // 把混音后的信号连到LineOut(立体声左右声道) finalMix.output.connect(0, lineOut.input, 0); finalMix.output.connect(0, lineOut.input, 1); // 创建WaveRecorder准备录制 WaveRecorder recorder = new WaveRecorder(synth, new File("my_recording.wav")); synth.add(recorder); // 把混音输出连到Recorder的输入(同样立体声) finalMix.output.connect(0, recorder.input, 0); finalMix.output.connect(0, recorder.input, 1); // 开始录制 recorder.start(); // 当需要停止录制时 // recorder.stop(); // recorder.close(); // synth.stop();
额外小提示:
- 如果你的采样是立体声的,记得把采样播放器的
left和right分别连接到混音器对应的左右输入通道,再把混音器的左右输出分别连到LineOut和WaveRecorder的左右输入。 MixN的输入数量可以通过setNumInputs(int num)动态调整,不用一开始就固定死。- 录制完成后一定要调用
stop()和close(),否则WAV文件可能损坏无法正常播放。
内容的提问来源于stack exchange,提问作者MalteK
相关产品推荐
相关产品推荐

