当前位置: 首页 > 面试题库 >

初学者数字合成器

秦飞航
2023-03-14
问题内容

我正在研究用Java编写音频合成器,并且想知道是否有人对编写这样的程序有任何建议或良好的资源。我正在寻找有关生成原始声波,如何将其输出为可用形式(通过扬声器播放)以及有关该主题的一般理论的信息。多谢你们。


问题答案:
  1. 这个问题基本上是关于将函数映射到数字数组。支持一流功能的语言在这里非常有用。

  2. 请访问 http://www.harmony-central.com/Computer/Programming和 http://www.developer.com/java/other/article.php/3071021了解一些与Java相关的信息。

  3. 如果您不了解编码声音数据的基本概念,请阅读http://en.wikipedia.org/wiki/Sampling_rate

  4. 规范的WAVE格式非常简单,请参见http://www.lightlink.com/tjweber/StripWav/Canon.html。标头(前44个字节)+ wave数据。您不需要任何库即可实现该功能。

在C / C ++中,相应的数据结构如下所示:

typedef struct _WAVstruct
{
    char headertag[4];
    unsigned int remnantlength;
    char fileid[4];

    char fmtchunktag[4];
    unsigned int fmtlength;
    unsigned short fmttag;
    unsigned short channels;
    unsigned int samplerate;
    unsigned int bypse;
    unsigned short ba;
    unsigned short bipsa;

    char datatag[4];
    unsigned int datalength;

    void* data; //<--- that's where the raw sound-data goes
}* WAVstruct;

我不确定Java。我想您必须将“结构”替换为“类”,将“ void *数据”替换为“ char []数据”或“ short []数据”或“ int
[]数据”,这对应于每位的位数样本,如字段bipsa中所定义。

要在其中填充数据,可以在C / C ++中使用类似的方法:

int data2WAVstruct(unsigned short channels, unsigned short bipsa, unsigned int samplerate, unsigned int datalength, void* data, WAVstruct result)
{
    result->headertag[0] = 'R';
    result->headertag[1] = 'I';
    result->headertag[2] = 'F';
    result->headertag[3] = 'F';
    result->remnantlength = 44 + datalength - 8;
    result->fileid[0] = 'W';
    result->fileid[1] = 'A';
    result->fileid[2] = 'V';
    result->fileid[3] = 'E';

    result->fmtchunktag[0] = 'f';
    result->fmtchunktag[1] = 'm'; 
    result->fmtchunktag[2] = 't';
    result->fmtchunktag[3] = ' ';
    result->fmtlength = 0x00000010;
    result->fmttag = 1;
    result->channels = channels;
    result->samplerate = samplerate;
    result->bipsa = bipsa;
    result->ba = channels*bipsa / 8;
    result->bypse = samplerate*result->ba;

    result->datatag[0] = 'd';
    result->datatag[1] = 'a';
    result->datatag[2] = 't';
    result->datatag[3] = 'a';
    result->datalength = datalength;

    result->data = data; // <--- that's were the data comes in

    return 0; // an error code, not implemented, yet ...; in Java: return result
}

同样,我不确定Java,但是如果将空指针转换为与比特率相对应的数组,则转换应该很简单。

然后,只需将整个结构写入文件即可获得可播放的wave文件。



 类似资料:
  • 嗨,我真的不确定从哪里开始,但我只是想学习ajax和php,但不确定我在这里错过了什么。 和我的文件... 只是想知道如何在php文件中获得要受影响的值,然后返回并更新?

  • 本教程的主要内容是介绍如何使用 jMonkeyEngine 进行游戏开发,旨在帮助初学者快速理解 jMonkeyEngine 中的核心概念。由于作者本人水品有限,文中难以避免出现谬误,如您在阅读过程中发现有不对的地方,请告知本人,我会尽快修正。 jME3 官方网站: 官网: http://jmonkeyengine.org/ 论坛: https://hub.jmonkeyengine.org Gi

  • 主要内容:PyCharm,Eclipse+PyDev,Visual Studio Code,Microsoft Visual Studio百度搜索“ Python IDE”会发现支持 Python 编程的 IDE 有很多,那么对于零基础的初学者,应该使用哪款 IDE 呢? 我个人推荐初学者使用 Python 自带的 IDLE。因为 IDLE 的使用方法很简单,非常适合初学者入门。本教程中使用的也是 Python 自带的 IDLE。 当然,除了 IDLE,还有很多其他的 IDE 供大家选择,这里列

  • 主要内容:Windows 下如何选择 IDE?,Linux 下如何选择 IDE?,Mac OS 下如何选择 IDE?这里我们把“编译器”和“IDE(集成开发环境)”当做一个概念,不再加以区分。 C语言的集成开发环境有很多种,尤其是 Windows 下,多如牛毛,初学者往往不知道该如何选择,本节我们就针对 Windows、Linux 和 Mac OS 三大平台进行讲解。 Windows 下如何选择 IDE? Windows 下的 IDE 多如牛毛,常见的有以下几种。 1) Visual Studi

  • 下周我有一个学校项目要做,我正试图找到解决这个问题的方法。问题是开发一个程序,将用户输入的分数相加,直到输入-1。 输入将总是成对和正数 只能使用:int、for、while、if、scanner(因此没有中断或数组) 最好使用GCD,因为需要打印减少的分数和 所以我的问题是: 在用户使用扫描仪键入-1之前,我可以使用同时循环吗? 是否可以使用“同时”让用户输入“无限”(我知道在java中没有这样

  • 本文向大家介绍JavaScript初学者必看“new”,包括了JavaScript初学者必看“new”的使用技巧和注意事项,需要的朋友参考一下 译者按: 本文简单的介绍了new, 更多的是介绍原型(prototype),值得一读。 原文:JavaScript For Beginners: the ‘new' operator 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本