- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想制作一个 Java 程序,可以生成一个音符,并在播放时改变它的音色和音高。
我想用数字来改变音色,这样我就可以从一种音色平滑地过渡到另一种音色,音高也是如此。
我的目标是像这样运行一些代码
for(int i = 0; i < 20; i++ ) {
toneGenerator.changeTimber( toneGenerator.timbre + 10.0 );
toneGenerator.changePitch ( toneGenerator.pitch + 10.0 );
}
目前我不了解声音在 PC 上是如何构成的,所以我真的只是想问问是否有人知道让我学习如何做这两件事的最短路径。
我希望数学会很简单,但看起来不太可能。
最佳答案
这是一个用 Java 编写的音调合成器,具有多种功能。
在持续时间内实时修改主谐波和其他谐波的振幅不是 SimpleSynth 类的功能之一。物理乐器的音符具有该功能。 SimpleSynth 类不播放音符序列,但可以对其进行修改以相对轻松地播放。
主要是,它很好地演示了音频合成原理、谐波以及使用 Java 在运行时通过默认音频输出播放数字音频样本序列。也没有对谐波进行相移的工具,但这是一个有点无关紧要的缺点,因为谐波的相位特性不是人耳能够检测到的。
数学在 playSound() 方法的注释部分进行了解释。如果你上过最基本的三角学课,你就有理解这个程序的数学理论。阅读一些有关数字音频、信号采样以及如何在吉他等弦乐器上弹拨泛音的内容也可能有助于理解。
标准数字音频术语用于常量和变量命名。如果希望在音符过程中修改音高和音色,产生这种效果的数学运算并不简单,但一旦学会了下面的数学运算,就会存在理解基础,并且可以逐步添加进一步的合成功能。
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.SourceDataLine;
class SimpleSynth
{
private static int SAMPLE_BITS = 16;
private static int CHANNELS = 1;
private static boolean SIGNED_TRUE = true;
private static boolean BIG_ENDIAN_FALSE = false;
private static float CDROM_SAMPLE_FREQ = 44100;
private SourceDataLine line;
private double dDuration;
private double dCyclesPerSec;
private double dAmplitude;
private double[] adHarmonics;
private double dMin;
private double dMax;
public SimpleSynth(String[] asArguments) throws Exception
{
dDuration = Double.parseDouble(asArguments[0]);
dCyclesPerSec = Double.parseDouble(asArguments[1]);
dAmplitude = Double.parseDouble(asArguments[2]);
adHarmonics = new double[asArguments.length - 3];
for (int i = 0; i < adHarmonics.length; ++ i)
adHarmonics[i] = Double.parseDouble(
asArguments[i + 3]);
AudioFormat format = new AudioFormat(
CDROM_SAMPLE_FREQ, SAMPLE_BITS,
CHANNELS, SIGNED_TRUE, BIG_ENDIAN_FALSE);
line = AudioSystem.getSourceDataLine(format);
line.open();
line.start();
}
public void closeLine()
{
line.drain();
line.stop();
}
public void playSound()
{
// allocate and prepare byte buffer and its index
int iBytes = (int) (2.0 * (0.5 + dDuration)
* CDROM_SAMPLE_FREQ);
byte[] ab = new byte[iBytes];
int i = 0;
// iterate through sample radian values
// for the specified duration
short i16;
double dSample;
double dRadiansPerSample = 2.0 * Math.PI
* dCyclesPerSec / CDROM_SAMPLE_FREQ;
double dDurationInRadians = 2.0 * Math.PI
* dCyclesPerSec * dDuration;
dMin = 0.0;
dMax = 0.0;
for (double d = 0.0;
d < dDurationInRadians;
d += dRadiansPerSample)
{
// add principle and the dot product of harmonics
// and their amplitudes relative to the principle
dSample = Math.sin(d);
for (int h = 0; h < adHarmonics.length; ++ h)
dSample += adHarmonics[h]
* Math.sin((h + 2) * d);
// factor in amplitude
dSample *= dAmplitude;
// adjust statistics
if (dMin > dSample)
dMin = dSample;
if (dMax < dSample)
dMax = dSample;
// store in byte buffer
i16 = (short) (dSample);
ab[i ++] = (byte) (i16);
ab[i ++] = (byte) (i16 >> 8);
}
// send the byte array to the audio line
line.write(ab, 0, i);
}
public void printStats()
{
System.out.println("sample range was ["
+ dMin + ", " + dMax + "]"
+ " in range of [-32768, 32767]");
if (dMin < -32768.0 || dMax > 32767.0)
System.out.println("sound is clipping"
+ "(exceeding its range),"
+ " so use a lower amplitude");
}
public static void main(String[] asArguments)
throws Exception
{
if (asArguments.length < 3)
{
System.err.println("usage: java SimpleSynth"
+ " <duration>"
+ " <tone.cycles.per.sec>"
+ " <amplitude>"
+ " [<relative.amplitude.harmonic.2>"
+ " [...]]");
System.err.println("pure tone:"
+ " java SimpleSynth 1 440 32767");
System.err.println("oboe-like:"
+ " java SimpleSynth 1 440 15000 0 1 0 .9");
System.err.println("complex:"
+ " java SimpleSynth 1 440 800 .3"
+ " .5 .4 .2 .9 .7 5 .1 .9 12 0 3"
+ " .1 5.2 2.5 .5 1 7 6");
System.exit(0);
}
SimpleSynth synth = new SimpleSynth(asArguments);
synth.playSound();
synth.closeLine();
synth.printStats();
System.exit(0);
}
}
关于java - 在 Java 中生成音调并改变它的音色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24888902/
我环顾了 Google 和 SO,但找不到这个...... 有没有一种方法可以在 Mac 上仅使用 Python 标准库来生成简单的音调(即蜂鸣声、方波、锯齿声)? 基本上,我正在尝试在文本角色扮演游
我搜索了很多术语和量刑,但找不到任何相关信息。所以无论如何:我怎样才能为警报(默认应用程序)获取默认或当前设置的音乐/音调/声音? 假设我每天早上醒来时都会播放闹钟歌曲:Song#1 使用默认闹钟应用
我正在读取来自麦克风的原始波流。 (这部分工作,因为我可以将它发送到扬声器并得到很好的回声。) 为简单起见,假设我想检测波形数据中的 DTMF 音调。实际上我想检测任何频率,而不仅仅是 DTMF 中的
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是偏离
Android 的新手。我有一个应用程序正在运行,我正在生成 DTMF 信号并解释微 Controller 生成的内容。我成功地生成了音调,但是音调是通过扬声器播放的,我想通过一个拼接的耳机插孔播放音
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
我录制了几秒钟的音频,其中包含以相同频率生成的两个相似的音调。他们相隔几秒钟。我想做的是根据该音频文件的采样间隔,检测出第一声的结束和第二声的开始。假设以48KHz音频的16位带符号PCM和一个字节数
我有 wav 文件,使用 naudio 库我已经能够从 wav 文件中获取原始数据。 有谁知道如何循环检测 DTMF 音调的 block 中的数据? 最佳答案 NuGet 包 DtmfDetectio
我有一个使用 OpenEars API 读取文本的 iOS 应用程序。我使用的是最新版本 (1.2.5)。我无法弄清楚如何在阅读单词时改变音调(“即时”)。我创建了一个 slider 来控制音高。更改
如何在 iPhone 中以编程方式检测 dtmf 音调?。我想检测接收到的音频信号(麦克风输入)是否应该是 dtmf 音调? 请帮助我?我真的为此苦苦挣扎了两天。提前致谢...... 最佳答案 由于
我想在 android 中执行以下操作。可能吗? 1) 调用+xx xxxxxxx 2) 等待第一声结束 3) 插入通行证:xxxx 4)等待短高音结束 5) 按 1 直到听到特定的声音。 这里的音调
当对方在通话中按 1,2,3.....9 时,是否可以在 android 中获取 DTMF 音调?如果是,怎么办? 最佳答案 查看此 http://code.google.com/p/dtmf-dec
我目前正在研究汽车安全系统.... 我需要通过输入到外部数字电路的电话耳机产生 DTMF 音调。是否有任何 API 可以执行此操作?任何人都可以帮助.... 提前致谢... 最佳答案 我得到了答案..
我想在 php 中生成一个正弦波。但是构建我的 wav 我需要以字节为单位给出值。我不知道该怎么做: 这是我的代码: $freqOfTone = 440; $sampleRate = 44100; $
我正在尝试在 linphone 的 SIP 调用期间发送一系列 DTMF 音调,为 iPhone 编译,以便在我设置的本地交换机上进行一些调用管理。我从代码中看到各个数字发送 DTMF(线路上没有音频
我正在尝试从电话线上检测来电显示信息。收到的来电显示信息采用 DTMF 音调(而非 FSK)。我怎样才能检测到这个 DTMF 音调?电话和传真调制解调器可以吗?电话和传真调制解调器能够检测 FSK 信
这就是我所拥有的。它生成 5 秒 Au file具有 440 Hz 正弦波,灵感来自 this question . -- file: tone.hs import qualified Data.By
我有一个 double 组,这是对数组应用 FFT 的结果,其中包含我添加了 1000Hz 音调的 Wav 音频文件的音频数据。 我通过“数值食谱”中定义的 DREALFT 获得了这个数组。(我必须使
Tone.BufferSource:缓冲区未设置或未加载。此错误发生在 try/catch block 中。它只会在我不断或有时随机触发更新功能时发生。发生此错误时,我的音频会暂时关闭。 我的代码背后
我正在 iphone 上开发一个应用程序,我需要一种方法来检测通过麦克风传入的声音的音调。 (即 A#、G、C♭ 等)我以为我会使用 AVAudio,但我真的不知道,而且我在文档中找不到任何内容。 有
我是一名优秀的程序员,十分优秀!