AudioClip 的频率和音调关系 - Unity3D

2024-02-27

我正在尝试仅使用 6 个音频剪辑来重新创建吉他的完整音域。

我在想有一种方法可以设置音频剪辑的频率,但audio.Frequency仅返回基于压缩格式的音频频率,而不是实际的音调。

我知道我可以阅读 GetSpectrumData,但该解决方案相当复杂,需要一些傅里叶变换分析或类似的东西。

影响音调,很容易改变音调,这样我就可以上下移动,但有没有办法弄清楚要使用哪些步骤。

void Update () 
{
    CheckAudio(KeyCode.Q, 1.0f);
    CheckAudio(KeyCode.W, 1.1f);
    CheckAudio(KeyCode.E, 1.2f);
    CheckAudio(KeyCode.R, 1.3f);
    CheckAudio(KeyCode.T, 1.4f);
}

void CheckAudio(KeyCode key, float pitch)
{
    if (Input.GetKeyDown (key)) 
    {
        audio.pitch = pitch;
        audio.Play ();
    }
}

我听得出来,听起来不太对劲。

知道初始音调 E4 329.63Hz,音调为 1,是否有任何影响音调的方程式,我会得到下一个键 F4 349.23Hz(或足够接近)?

还必须考虑到 Unity AudioSource 将音高限制在 -3/3 范围内(我认为这超出了需要)。

编辑:添加一些个人研究。看起来音高 1 是初始音符,设置为 2 会使相同的调高一个八度。

由于半音阶(钢琴上的所有黑白音符)是 12 个键,我认为每个音阶使用 1/12 就可以了。

听起来很接近,但我觉得不太正确。这是新代码:

[SerializeField] private AudioSource audio;
float step = 1f/12f;
KeyCode[]keys = new KeyCode[]{
    KeyCode.Q, KeyCode.W,KeyCode.E,KeyCode.R,KeyCode.T,
    KeyCode.Y, KeyCode.U, KeyCode.I, KeyCode.O, KeyCode.P,
    KeyCode.A, KeyCode.S, KeyCode.D
};

void Update () 
{
    float f = 0.0f;
    foreach (KeyCode key in keys) 
    {
        CheckAudio(key, f);
        f += 1f;
    }
}

void CheckAudio(KeyCode key, float pitch)
{
    if (Input.GetKeyDown (key)) 
    {
        audio.pitch = 1f + pitch * step;
        audio.Play ();
    }
}

你正在尝试做的将会not只需更改即可很好地工作pitch的音频。通过改变音调,你会遇到其他问题例如声音结束太快或需要更长的时间来完成,声音也不会好。

The first解决方案是制作一个插件(合成器) in C++从 Unity 读取音频文件并更改频率。它还应该执行其他操作来解决速度问题。这非常复杂,除非您是一位具有出色数学技能的音频工程师。在移动设备上尝试这一点则完全不同。音频过滤器读取 http://docs.unity3d.com/ScriptReference/MonoBehaviour.OnAudioFilterRead.html如果您决定使用此方法,则应该使用该函数。

The second受到推崇的解决方案是制作一个音频文件每个吉他键然后将它们放入数组中audioClip。这解决了every其他问题。下侧是你将会有更多文件.

EDIT:

如果你不关心它是否完美,你可以使用下面这个好人的东西internet http://answers.unity3d.com/questions/141771/whats-a-good-way-to-do-dynamically-generated-music.html.

void playSound(){
     float transpose = -4; 
     float note = -1; 
     if (Input.GetKeyDown("a")) note = 0;  // C
     if (Input.GetKeyDown("s")) note = 2;  // D
     if (Input.GetKeyDown("d")) note = 4;  // E
     if (Input.GetKeyDown("f")) note = 5;  // F
     if (Input.GetKeyDown("g")) note = 7;  // G
     if (Input.GetKeyDown("h")) note = 9;  // A
     if (Input.GetKeyDown("j")) note = 11; // B
     if (Input.GetKeyDown("k")) note = 12; // C
     if (Input.GetKeyDown("l")) note = 14; // D

     if (note>=0){ // if some key pressed...
         audio.pitch =  Mathf.Pow(2, (note+transpose)/12.0);
         audio.Play();
}

编辑:对于那些对 Mathf.Pow 方程的使用和工作原理感兴趣的人,请阅读以下内容:https://en.wikipedia.org/wiki/Twelfth_root_of_two https://en.wikipedia.org/wiki/Twelfth_root_of_two

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AudioClip 的频率和音调关系 - Unity3D 的相关文章

随机推荐

  • PHP for 循环与带范围的 foreach [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 其中哪一个对于性能和可读性更好 fo
  • 如何在 Chrome 中使选择元素透明?

    请看这个例子 select width 172px height 22px padding 2px 7px border none background url http imgur com MJyZM png 0 0 no repeat
  • 是什么导致了这个 bash 语法错误?

    该命令在命令行上运行良好 if g std c 11 main cpp then a out fi 但是当我尝试将它作为函数添加到我的 bashrc 时 它失败了 function cgo if g std c 11 1 then a ou
  • 调整 ConfusionMatrixDisplay 的大小 (Scikit Learn)

    如何设置Scikit Learn Confusion Matrix绘制的图形大小 import numpy as np from sklearn metrics import ConfusionMatrixDisplay confusion
  • Windows Server 2016 EC2可以挂载EFS吗?

    我是 AWS 新手 我看到过很多明确的答案 说 Windows 和 AWS EFS 不能相互协作 Windows Server 2016 仍然如此吗 Amazon 现在支持完全托管的本机 Microsoft Windows 文件系统 请查看
  • Material UI 表 - 使用 Span 的等宽列?

    我正在尝试利用TableMaterial UI 中的组件用于构建数据表 但是 我正在努力为我的数据表制作等宽的列 目前我正在尝试这样的事情
  • 如何在 Hibernate 4 中禁用临时表重新创建?

    每次我连接到数据库时 Hibernate 4 都会创建临时表 Hibernate create table HT 有没有办法只创建一次 有一天 我也在寻找相同的东西 但没有成功 但我发现非常好的文章 http in relation to
  • 如何将外部文件作为类似于代码块的 Sphinx 文档包含在内?

    如何将外部文件作为类似于代码块的 Sphinx 文档包含在内 我怎样才能让它设置语法颜色的样式 在这里找到它 https www sphinx doc org en master usage restructivetext directiv
  • 从 GitHub 加载 Maven 依赖项 [重复]

    这个问题在这里已经有答案了 如何从 GitHub 存储库添加 Java 库 该库使用 Maven 作为构建系统 作为我的 Maven 项目的依赖项 我可以在不下载和编译库的情况下做到这一点吗 现在您可以使用以下命令从 GitHub 存储库导
  • 使用 sox splice 淡入淡出一组音频文件

    我可以使用 SoX 连接和交叉淡入淡出两个音频文件 如下所示 sox file1 wav file2 wav outfile wav splice q soxi D file1 wav 0 5 其中 soxi 替换是获取 file1 的持续
  • 如何根据整数变量的值动态创建许多标签和文本框?

    当我们知道 n 的值时 例如单击 显示 按钮后 有什么方法可以动态创建和显示带有 n 个相应文本框的 n 个标签 如果有任何事情让您不明白我的问题 请告诉我 谢谢你 我正在使用 VS C Express 2010 Windows 窗体 我将
  • MSXML2.XMLHTTP 请求验证在 ASP Classic 中输入的 URL

    预先感谢您收到的任何帮助 我想让我们的客户端在文本字段中输入 URL 然后检查该 URL 是否存在并有效 我想检查 3 种可能的结果 状态 200 正常 状态 500 服务器错误 或者状态为 404 未找到页面 在 ASP classic
  • 如何修改此指令,以便一旦输入可见,除非单击 x,否则它不会被隐藏?

    http plnkr co edit fXo21LnphHZ3qWnuEMFt p preview http plnkr co edit fXo21LnphHZ3qWnuEMFt p preview 现在 如果您单击输入之外的任何位置 则
  • 在没有主机访问权限的情况下更改 DotNetNuke 中的

    我需要更改 DotNetNuke 网站的标题 我有管理员访问权限 但没有主机访问权限 我还可以通过FTP访问网站的文件目录 我可以更改索引页的标题吗 如果您正在谈论在 文档部分 您可以在页面设置中逐页进行设置 从全局角度来看 没有真正的方法
  • 检查在执行单元测试期间是否附加了调试器

    如果调试器附加到当前测试执行 是否有方法检查 JUnit 代码 在 NET C 中我知道这是可能的Debugger IsAttached 用例是在附加调试器时更改或完全禁用测试超时 因为如果您只有大约 15 秒 定义的超时 来调试测试 这会
  • 在 Java 中通过 CrossOrigin 注解或在 Spring-Config XML 中使用 Spring 属性

    我在Spring中使用CrossOrigin注释 现在我想将属性作为值注入到注释中 我无法让这个工作 现在我像这样访问我的财产 Value settings cors origin String cors origin 我想将此属性注入到
  • Bitbucket符号(箭头)含义

    箭头是什么意思 我对 git 或 bitbucket 并不陌生 但我认为我可能在最初的提交中搞砸了一些事情 我需要帮助来解决这个问题 我的本地存储库中的文件夹不是空的 而是将其拉到该文件夹 所在的另一个位置 是链接吗 不在我的本地仓库上 该
  • Angular NgRx - 继续轮询仅第一次调用的服务的效果

    我有一个应用程序 我刚刚添加了 NgRX 我希望使用效果来打开和关闭轮询 示例大纲 我跟着这个帖子 https bbonczek github io jekyll update 2018 03 01 polling with ngrx ht
  • Clickonce部署到多个环境

    我有一个 WPF 应用程序 想通过 ClickOnce 部署给我们的用户 我们有四种环境 系统测试 用户测试 并行生产和生产 每个都需要一个不同的配置文件 其中包含服务器名称和特定于环境的其他内容 因此它们不能全部使用相同的代码库 大部分代
  • AudioClip 的频率和音调关系 - Unity3D

    我正在尝试仅使用 6 个音频剪辑来重新创建吉他的完整音域 我在想有一种方法可以设置音频剪辑的频率 但audio Frequency仅返回基于压缩格式的音频频率 而不是实际的音调 我知道我可以阅读 GetSpectrumData 但该解决方案