首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用StdAudio编写在Java中播放和弦的方法?

如何使用StdAudio编写在Java中播放和弦的方法?
EN

Stack Overflow用户
提问于 2015-10-23 01:27:14
回答 1查看 207关注 0票数 0

我目前正在写一种演奏和弦的方法,但我遇到了一些麻烦。我能发出声音,但我所得到的只是片片白噪音。下面我列出了我的方法。

代码语言:javascript
运行
复制
    public static void playChord(double duration, double... frequencies) {
            final int sliceCount = (int) (StdAudio.SAMPLE_RATE * duration);
            final double[] slices = new double[sliceCount + 1];
            double freqTotal=0;
            for (int i = 0; i <= sliceCount; i++) {
                for (int j=0; j<frequencies.length;j++) {
                    frequencies[j] +=frequencies[j];
                    freqTotal=frequencies[j];
                }
                slices[i] = Math.sin(2 * Math.PI * i * freqTotal/StdAudio.SAMPLE_RATE);
            }
            StdAudio.play(slices);
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-23 04:38:23

这里有两个问题:

第一种情况是,你在你的频率阵列上踩着每一个样本上的frequencies[j] += frequencies[j]线。假设是frequencies[0] == 100。在生成第一个示例之前,它将更改为200。即使频率阵列的长度只有1,这也不会产生正弦波。

第二个问题是,合并多个频率的概念是错误的。假设频率阵列有两个元素100和200。如果第一个问题是固定的,你实际上将计算一个单一的正弦在300赫兹。这是因为您在错误的级别将它们相加在一起,所以您正在计算sin(2*pii(100+200)/2),即sin(2*pi*i*300/2)

相反,您需要这样做:

代码语言:javascript
运行
复制
 for (int i = 0; i < sliceCount; i++)
 {
     for (int j = 0 ; j < frequencies.length; j++)
     {
         slices[i] += Math.sin(2*Math.PI*i*frequencies[i]/StdAudio.SAMPLE_RATE);
     }
     slices[i] /= frequencies.length; // renormalize to between -1 and 1
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33293445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档