在Java中交替播放2个不同的频率

2023-12-24

我是 Java 声音的新手。我想在指定的时间内循环播放 2 个不同的频率,每个频率 1 秒。 例如,如果我有 2 个频率 440hz 和 16000hz,时间周期为 10 秒,那么每个“偶数”秒播放 440hz,每个“奇数”秒播放 16000hz,即各交替播放 5 秒。

我通过一些示例学到了一些东西,并且还制作了一个程序,该程序在用户指​​定的频率下运行一段时间,该时间也是用户在这些示例的帮助下给出的。

如果有人能帮助我解决这个问题,我将非常感激。 谢谢。

我还附上了该单频代码以供参考。

  import java.nio.ByteBuffer;
  import java.util.Scanner;
  import javax.sound.sampled.*;

  public class Audio {

   public static void main(String[] args) throws InterruptedException, LineUnavailableException {
    final int SAMPLING_RATE = 44100;            // Audio sampling rate
    final int SAMPLE_SIZE = 2;                  // Audio sample size in bytes

    Scanner in = new Scanner(System.in);
    int time = in.nextInt();                      //Time specified by user in seconds
    SourceDataLine line;
    double fFreq = in.nextInt();                         // Frequency of sine wave in hz

    //Position through the sine wave as a percentage (i.e. 0 to 1 is 0 to 2*PI)
    double fCyclePosition = 0;

    //Open up audio output, using 44100hz sampling rate, 16 bit samples, mono, and big 
    // endian byte ordering
    AudioFormat format = new AudioFormat(SAMPLING_RATE, 16, 1, true, true);
    DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);

    if (!AudioSystem.isLineSupported(info)) {
        System.out.println("Line matching " + info + " is not supported.");
        throw new LineUnavailableException();
    }

    line = (SourceDataLine) AudioSystem.getLine(info);
    line.open(format);
    line.start();

    // Make our buffer size match audio system's buffer
    ByteBuffer cBuf = ByteBuffer.allocate(line.getBufferSize());

    int ctSamplesTotal = SAMPLING_RATE * time;         // Output for roughly user specified time in seconds

    //On each pass main loop fills the available free space in the audio buffer
    //Main loop creates audio samples for sine wave, runs until we tell the thread to exit
    //Each sample is spaced 1/SAMPLING_RATE apart in time
    while (ctSamplesTotal > 0) {
        double fCycleInc = fFreq / SAMPLING_RATE;  // Fraction of cycle between samples

        cBuf.clear();                            // Discard samples from previous pass

        // Figure out how many samples we can add
        int ctSamplesThisPass = line.available() / SAMPLE_SIZE;
        for (int i = 0; i < ctSamplesThisPass; i++) {
            cBuf.putShort((short) (Short.MAX_VALUE * Math.sin(2 * Math.PI * fCyclePosition)));

            fCyclePosition += fCycleInc;
            if (fCyclePosition > 1) {
                fCyclePosition -= 1;
            }
        }

        //Write sine samples to the line buffer.  If the audio buffer is full, this will 
        // block until there is room (we never write more samples than buffer will hold)
        line.write(cBuf.array(), 0, cBuf.position());
        ctSamplesTotal -= ctSamplesThisPass;     // Update total number of samples written 

        //Wait until the buffer is at least half empty  before we add more
        while (line.getBufferSize() / 2 < line.available()) {
            Thread.sleep(1);
        }
    }

    //Done playing the whole waveform, now wait until the queued samples finish 
    //playing, then clean up and exit
    line.drain();
    line.close();
}

}


你最好的选择可能是创造Clip https://docs.oracle.com/javase/8/docs/api/javax/sound/sampled/Clip.html如下面的示例代码所示。 也就是说,MHz 范围通常是听不到的 - 看起来您的问题中有一个拼写错误。如果没有拼写错误,您将遇到以下问题奈奎斯特先生 https://en.wikipedia.org/wiki/Nyquist_frequency.

另一个提示:没有人使用匈牙利表示法 https://en.wikipedia.org/wiki/Hungarian_notation在爪哇。

import javax.sound.sampled.*;
import java.nio.ByteBuffer;
import java.nio.ShortBuffer;

public class AlternatingTones {

    public static void main(final String[] args) throws LineUnavailableException, InterruptedException {

        final Clip clip0 = createOneSecondClip(440f);
        final Clip clip1 = createOneSecondClip(16000f);

        clip0.addLineListener(event -> {
            if (event.getType() == LineEvent.Type.STOP) {
                clip1.setFramePosition(0);
                clip1.start();
            }
        });
        clip1.addLineListener(event -> {
            if (event.getType() == LineEvent.Type.STOP) {
                clip0.setFramePosition(0);
                clip0.start();
            }
        });
        clip0.start();

        // prevent JVM from exiting
        Thread.sleep(10000000);
    }

    private static Clip createOneSecondClip(final float frequency) throws LineUnavailableException {
        final Clip clip = AudioSystem.getClip();
        final AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 44100f, 16, 1, 2, 44100, true);
        final ByteBuffer buffer = ByteBuffer.allocate(44100 * format.getFrameSize());
        final ShortBuffer shortBuffer = buffer.asShortBuffer();
        final float cycleInc = frequency / format.getFrameRate();
        float cyclePosition = 0f;
        while (shortBuffer.hasRemaining()) {
            shortBuffer.put((short) (Short.MAX_VALUE * Math.sin(2 * Math.PI * cyclePosition)));
            cyclePosition += cycleInc;
            if (cyclePosition > 1) {
                cyclePosition -= 1;
            }
        }
        clip.open(format, buffer.array(), 0, buffer.capacity());
        return clip;
    }
}    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Java中交替播放2个不同的频率 的相关文章

  • 在 Java 8 中将对象追加到列表并返回结果?

    有没有一种方法可以将对象附加到列表并以功能性非命令方式在一行中返回结果 如果原始列表也不应该被改变 你会怎么做 Java 8 是允许的 我已经知道如何将两个列表连接到一行中 Source https stackoverflow com a
  • 我该如何解决? KnapSack - 值完全相同,但每个对象都有三个权重

    我在解决我的练习时遇到问题 我读到了动态规划和算法 我认为我的练习是 特定背包问题 我用暴力法解决了它 但我无法用动态规划解决它 我有一艘重300吨的船 背包 有些晶体本身含有 3 种物质 X Y Z 每种物质都有重量 并且所有晶体都具有相
  • 使用 Nginx 时缺少 HTTP 状态代码名称

    我正在使用 Nginx 将所有 HTTP 请求重定向到 HTTPS 在我的 Spring Boot 应用程序中 这是我正在使用的 nginx 配置 通过它我可以将所有请求重定向到 Https 但是当我这样做时 我得到了状态码返回正确 但没有
  • IntelliJ Ultimate 在 Play 2.3 (Java) 项目测试中找不到路由

    虽然我的测试运行得很好 但 IntelliJ 抱怨它找不到路由对象 并且代码自动完成无法工作 我已经查看了所有文档 这应该可以工作 这是 IntelliJ 的报告内容 关于我的项目配置可能有什么问题有什么想法吗 这很可能与以下事实有关 ro
  • 术语“引用”的起源,如“通过引用传递”

    Java C 语言律师喜欢说他们的语言按值传递引用 这意味着 引用 是调用函数时复制的对象指针 同时 在 C 中 以及 Perl 和 PHP 中更动态的形式 引用是其他名称 或动态情况下的运行时值 的别名 我对这里的词源感兴趣 参考 一词的
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • Javascript 制作音频 blob

    我正在测试 html 音频标签 我想制作音频 blob url 就像 youtube 或 vimeo 那样 并将其添加到 src 开始播放音频 我一直在测试new Blob and URL createObjectURL 但我不知道如何使用
  • Java 相当于 Perl 的 s/// 运算符?

    我有一些代码正在从 Perl 转换为 Java 它大量使用了正则表达式 包括s 操作员 我已经使用 Perl 很长时间了 但仍然习惯 Java 的做事方式 特别是 字符串似乎更难使用 有谁知道或有一个完全实现的Java函数s 这样它就可以处
  • IntSummaryStatistics的summaryStatistics方法

    为什么空 IntStream 上的 summaryStatistics 方法返回整数的最大和最小值作为流中存在的最大和最小 int 值 IntStream intStream IntStream of IntSummaryStatistic
  • 如何使 ScheduledExecutorService 在计划任务取消时自动终止

    我正在使用一个ScheduledExecutorService如果网络连接已打开超过几个小时 则关闭该连接 然而 在大多数情况下 网络连接在超时之前就关闭了 所以我取消了ScheduledFuture 在这种情况下 我还希望执行程序服务终止
  • 将 RequestBody json 转换为对象 - Spring Boot

    我是 java 开发的初学者 但之前有 PHP 和 Python 等编程语言的经验 对于如何进行 Spring Boot 的开发几乎没有什么困惑 我正在开发一个rest API 它有以下请求 key value key1 value1 pl
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • java.lang.ClassCastException: [B 无法转换为 java.lang.String

    我编写了一个带有字段 LoginId 和密码的实体类 我使用 AES ENCRYPT 加密密码并将其存储在数据库中 我只想检索已解密的密码 所以 我使用 AES DECRYPT 使用本机查询是在 OPen JPA 2 0 中 我写的查询是
  • 当通过 Map.put(K, V) 添加值时,是否必须通过 Map.get(K) 返回相同的实例?

    假设您有以下代码 Map
  • Java XML 解析器添加不必要的 xmlns 和 xml:space 属性

    我在 Windows 10 上使用 Java 11 AdoptOpenJDK 11 0 5 2019 10 15 我正在解析一些旧版 XHTML 1 1 文件 这些文件采用以下一般形式
  • Eclipse 在单独的窗口中打开代码

    我正在 eclipse 中编程 在两个显示器设置上运行 在其中一台显示器上 我只获得了项目资源管理器和编辑器作为自定义透视图 而在另一台显示器上 我获得了其他工具 例如控制台 调试 任务 变量 断点等 例如 当我单击任务视图中的任务时 这将
  • 删除Java中重载的方法

    有2个重载方法 这些方法中的每一个都将一种类型的列表转换为不同类型的列表 但第一种方法使用比较器 class SomeClass public static
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 在没有 ODBC 的情况下从 Java 操作 Access 数据库

    我想从我的 Java 项目操作 Microsoft Access 数据库 accdb 或 mdb 文件 我不想使用 Microsoft 的 JDBC ODBC Bridge 和 Access ODBC 驱动程序 因为 JDBC ODBC 桥

随机推荐

  • 包含字符串文字的文档测试

    我有一个单元测试 我想为一个将 XML 作为字符串的函数编写 这是一个文档测试 我希望 XML 与测试一致 由于 XML 是多行的 我在文档测试中尝试了字符串文字 但没有成功 这是简化的测试代码 def test gt gt gt conf
  • Excel VBA 合并/组合具有相同名称的列

    我的项目工作存在类似于下面描述的问题 My dataset is like this What I want is like this LAST COLUMN 我拥有的是许多同名的列 例如 Is paid Job 我想要的是创建一个新列 T
  • 数据库不存在错误

    当我进行数据库备份时 出现数据库不存在的错误 但我可以正常附加数据库 并且其他进程 例如数据插入和更新 工作正常 但是当我进行数据库备份时 出现以下错误 我显示了错误屏幕截图和备份按钮代码 string cnstr Data Source
  • PHP 服务器发送事件连接不会关闭?

    我已经实施了一个服务器发送事件 https developer mozilla org en US docs Web API Server sent events with 事件源 https developer mozilla org e
  • 从函数返回包含单个项目的元组

    刚刚在 Python 中遇到了一点奇怪的地方 我想我应该记录它在这里将其写为一个问题 以防其他人试图使用与我相同的徒劳搜索词来找到答案 看起来元组解包可以做到这一点 因此如果您希望迭代返回值 则无法返回长度为 1 的元组 虽然看起来外表是骗
  • 添加 spring-data-jpa 架构引用后 Spring 配置 xml 无效

    启动 spring 上下文时出现以下异常 java lang Exception java lang IllegalStateException ContainerBase addChild start org apache catalin
  • 错误:(参数类型“String?”无法分配给参数类型“String”,因为“String?”可以为空,而“String”则不能。)在Flutter中

    我是 flutter 的新手 在传递字符串时遇到错误 并到处查找 最后将其添加到 StackOverflow 中 错误是 Error The argument type String can t be assigned to the par
  • Node js函数返回[object Object]而不是字符串值

    我对 java 脚本和 Node js 很陌生 我试图从 MySQL DB 获取一个值 返回值是 object Object 而不是字符串 我在网上没有找到任何答案 这是什么问题 我希望这里有人能提供帮助 行值为 object Object
  • MKAnnotationView 的子类

    我想知道是否有人知道 MKAnnotationView 类的任何子类 在苹果文档中 他们说一个例子是 MKPinAnnotationView 所以我想知道是否还有其他预先创建的子类 例如用于跟踪设备当前位置的子类 如果有人有关于创建我自己的
  • 如何反序列化 C# 对象中的嵌套 xml

    我正在使用 silverlight 来实现 xml 的反序列化 如下所示 字符串 xmlString
  • 在 Activity 开始之前访问 Activity

    我正在使用 Instrumentation TestCase 类来对活动中的某些内容进行单元测试 在启动此活动之前 我需要能够检查 SharedPreferences 的内容并编辑它们 我无法使用 setUp 方法创建 Activity 并
  • 如何在 Lucene 中存储多种不同类型的文档

    我有一个现有的 Lucene 存储 其中包含数百万个文档 每个文档都代表一个实体的元数据 我有几个 Id 字段 Id1 Id2 Id5 每个文档可以有零个或多个该字段的值 一次只能由这些 Id 之一查询该索引 我已经独立地对这些字段建立了索
  • UIButton 渐变不起作用

    我从教程中找到了这段代码并尝试使用它 CAGradientLayer btnGradient CAGradientLayer layer btnGradient frame button bounds btnGradient colors
  • 将 Func 作为属性参数传递以保护 MVC 路由

    我正在尝试保护满足一组条件的一组用户的 MVC 路由 由于 MVC 似乎大量使用属性 而 Steven Sanderson 在他的专业 MVC 书中使用了一个属性来实现安全可扩展性 因此我开始沿着这条路线走下去 但我想根据我所应用的操作来根
  • PHP 的 mcrypt_decrypt() 需要什么?

    我有一个使用 mcrypt decrypt 函数的脚本 但出现以下错误 致命错误 调用未定义的函数 mcrypt decrypt 我需要包含哪些模块 库才能使用此功能 或者还有其他原因导致我收到错误吗 Thanks sudo apt get
  • 工具提示使用标题属性而不使用js?

    我正在寻找另一个制作工具提示的解决方案很长时间title 属性上 hover选择 我希望找到一种使用方法title 属性并更改我的content 动态属性 webkit font smoothing antialiased font fam
  • 纯 bash 中的字符串规范化

    字符 E xcc x81 和 xc3 x89 有不同的代码点 它们看起来相同 但在测试匹配时结果是否定的 不过 Python 可以对它们进行标准化 unicodedata normalize NFC E decode utf 8 unico
  • 保存在 Models.py 之前对 ManyToManyField 进行验证

    我有以下型号 class Application models Model users models ManyToManyField User through Permission folder models ForeignKey Fold
  • ActiveAdmin - 使用带有过滤器的范围

    在我的 ActiveAdmin 模型中 我有一个自定义范围来显示已删除的记录和几个用于按特定列搜索记录的过滤器 单独使用过滤器或组合在一起使用过滤器可以按预期工作 使用范围可以按预期工作 问题在于 使用范围似乎会覆盖所有过滤器 并且在选择范
  • 在Java中交替播放2个不同的频率

    我是 Java 声音的新手 我想在指定的时间内循环播放 2 个不同的频率 每个频率 1 秒 例如 如果我有 2 个频率 440hz 和 16000hz 时间周期为 10 秒 那么每个 偶数 秒播放 440hz 每个 奇数 秒播放 16000