math - 声音频率到八度和键号
问题描述
给定波的频率,确定从 0 到 7 的八度音阶和调号,其中 0 是 C,6 是 B,C# 是 7,A# 是 11。
您可以使用一系列 if 语句来解决它,但必须有更好的方法来解决它。我的项目使用的语言是 Clojure,但我猜任何解决方案都可以轻松移植到任何语言。
解决方案
以下假设您使用的是缓和半音阶。音符具有对数频率刻度。每增加一个八度音程,频率就会乘以 2。在一个八度范围内,音符 C、C#、D、D#、E、F、F#、G、G#、A、A#、B 有十二个等比例的音阶,编号从 0 到 11。
要从频率中获取八度数和音符数:
- 将频率的对数以 2 为底。
- 减去中间 C 的频率的对数。
- 整数部分为八度数;
- (正)余数乘以十二,就是音符编号。这将不准确。
低于中间 C 的音符有一个负八度数。
推荐阅读
- android - 点击 SearchView 如何影响 RecyclerView?
- hibernate - Hibernate envers 获取已删除的行数据
- sql - 语法错误 - 第 0 行,第 122 列:错误:预期的字符串结尾,得到 'ON'
- php - Php Carbon:每周一和周二,每两周一次
- javascript - 如何使用递归转置 m*n 矩阵?
- git - 在 bitbucket/git 中,“xx commits behind proto. Sync Now”有什么作用?
- excel - 简单模式匹配宏中的 Excel-VBA 编译/语法错误
- javascript - 如何修复“位置 0 的 JSON 中的意外令牌 <”?
- android - 安迪模拟器上的查尔斯代理问题(失败:SSLHandshake:不支持的curveId:29)
- c - 语言 C、TCP 服务器和客户端