gpt4 book ai didi

java - java中如何生成音频

转载 作者:行者123 更新时间:2023-11-30 08:01:07 25 4
gpt4 key购买 nike

这个问题与我正在开发的游戏机有关,现在我正在尝试编写一个Java程序来模拟游戏机的DSP。这样,当我将其移植到实际硬件时,我就能准确地知道该怎么做。但我很难找到合适的声音库。我所需要的基本上是这样的:我有自己的声音格式,并将其输入 DSP。然后,它对数据进行解码,处理解码后效果(回声、放大等),并将结果分成两个声波以进行立体声输出。我已经计划好了一切,除了将声波传输到计算机声卡的方法之外。所以基本上是正弦波发生器的更高级版本。一些帮助我入门的代码示例会有所帮助。如果我需要澄清任何事情,请告诉我。

编辑:好的,为了清楚起见,声波数据将存储在字节数组中的 block 中。所以我需要一种从那里播放声音的方法。而且我不想将音频转储到文件中然后播放该文件,那样会花费太长时间。

最佳答案

这是使用 java 生成声音的一种方法。

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.sound.midi.Instrument;
import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Synthesizer;
import javax.swing.*;

public class SimpleSound extends JFrame{
Synthesizer syn;
MidiChannel[] midChannel;
Instrument[] instrument;

public SimpleSound() {
this.setLayout(new BorderLayout());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JPanel panel = new JPanel();
JButton button1 = new JButton("Try");
this.add(panel);
panel.add(button1);
this.pack();

try {
syn = MidiSystem.getSynthesizer();
syn.open();
midChannel = syn.getChannels();

instrument = syn.getDefaultSoundbank().getInstruments();
syn.loadInstrument(instrument[90]);

button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
makeASound();
}
});

} catch (MidiUnavailableException ex) {
ex.printStackTrace();
}

}

void makeASound() {
this.midChannel[5].noteOn(55,550);
// this.midChannel[5].noteOn(70,700);
// this.midChannel[5].noteOn(30,400);
}

public static void main(String[] args) {
new SimpleSound().setVisible(true);
}
}

您可以对代码中的值进行实验 this.midChannel[5].noteOn(55,550);

您可以在这里找到更多说明:http://patater.com/gbaguy/javamidi.htm在这里:https://docs.oracle.com/javase/tutorial/sound/MIDI-synth.html

更新:

我从这里找到了另一个来源http://www.automatic-pilot.com/midifile.html 。这是一个简单的程序,演示了 MIDI 声音的创建,然后将其保存到文件中。我对最后一部分进行了修改,以便将声音写入字节数组。

     // write to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
MidiSystem.write(s,1,baos);

byte[] bytes = baos.toByteArray();

但我只是认为字节数组内容的格式可能与您已经想到的格式不同。我可以知道您可以使用的声音数据的格式是什么吗?

关于java - java中如何生成音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31910434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com