tonal
tonal
是一个音乐理论库。它包含用于操作音乐的音调元素(音符、音程、和弦、音阶、调式、调性)的函数。它处理的是抽象概念(而非实际的音乐或声音)。
tonal
使用 Typescript 实现,并作为一系列 Javascript npm 包发布。
它采用函数式编程风格:所有函数都是纯函数,没有数据变异,实体由数据结构而非对象表示。
示例
import { Chord, Interval, Note, Scale } from "tonal";
Note.midi("C4"); // => 60
Note.freq("a4"); // => 440
Note.accidentals("c#2"); // => '#'
Note.transpose("C4", "5P"); // => "G4"
Interval.semitones("5P"); // => 7
Interval.distance("C4", "G4"); // => "5P"
// 音阶
Scale.get("C major").notes; // => ["C", "D", "E", "F", "G", "A", "B"];
[1, 3, 5, 7].map(Scale.degrees("C major")); // => ["C", "E", "G", "B"]
Chord.get("Cmaj7").name; // => "C major seventh"
// 和弦转位
const triad = Chord.degrees("Cm");
[1, 2, 3].map(triad); // => ["C", "Eb", "G"];
[2, 3, 1].map(triad); // => ["Eb", "G", "C"];
[3, 1, 2].map(triad); // => ["G", "C", "Eb"];
安装
一次性安装所有包:
npm install --save tonal
你可以在这里阅读更新日志。
使用
Tonal 同时兼容 ES5 和 ES6 模块,以及浏览器环境。
ES6 import
:
import { Note, Scale } from "tonal";
ES5 require
:
const { Note, Scale } = require("tonal");
浏览器
你可以直接在 HTML 中使用 jsdelivr CDN 的浏览器版本:
<script src="https://cdn.jsdelivr.net/npm/tonal/browser/tonal.min.js"></script>
<script>
console.log(Tonal.Key.minorKey("Ab"));
</script>
或者,你也可以从仓库获取压缩后的浏览器就绪版本。
包大小
tonal
包含所有已发布的模块。
尽管最终的打包文件很小,但你可以通过单独安装模块并只导入所需的函数来进一步减小包的大小。
注意,单独的模块名称前缀为 @tonaljs/
。例如:
npm i @tonaljs/note
import { transpose } from "@tonaljs/note";
transpose("A4", "P5");
文档
通常,你只需要安装 tonal
包(之前称为 @tonaljs/tonal
)。
API 文档位于每个模块的 README.md 文件中 👇
音符和音程
- @tonaljs/note:音符操作(简化、移调)
- @tonaljs/midi:MIDI 数字转换
- @tonaljs/interval:音程操作(添加、简化、倒置)
- @tonaljs/abc-notation:解析 ABC 记谱法音符
音阶和和弦
- @tonaljs/scale:音阶
- @tonaljs/scale-type:音阶字典
- @tonaljs/chord:和弦
- @tonaljs/chord-type:和弦字典
- @tonaljs/chord-detect:从音符检测和弦
- @tonaljs/pcset:音高类集。比较音符组
声部编配
- @tonaljs/voicing:和弦的音型和声部进行
- @tonaljs/voice-leading:音型之间过渡的声部进行逻辑
- @tonaljs/voicing-dictionary:和弦音型集合
调性、和弦进行
- @tonaljs/key:大小调,其音阶和和弦
- @tonaljs/mode:希腊调式字典(伊奥尼亚、多利亚等)
- @tonaljs/progression:和弦进行
- @tonaljs/roman-numeral:解析罗马数字符号
时值、节奏
- @tonaljs/rhythm-pattern:生成和操作节奏型
- @tonaljs/time-signature:解析拍号
- @tonaljs/duration-value:音符时值
实用工具
- @tonaljs/core:核心函数(音符、音程、移调和距离)
- @tonaljs/collection:处理集合的实用函数(范围、随机排序、排列)
- @tonaljs/range:创建音符范围
贡献
阅读贡献文档。要贡献,请提交PR并确保:
- 如果是音乐理论方面的更改(如音阶名称),请提供可靠的参考链接。
- 如果是新功能,请添加文档:预期会对受影响模块的README进行修改。
- 添加测试:预期会对受影响模块的test.ts文件进行修改。
- 所有测试都通过
灵感来源
本库从其他音乐理论库获得灵感:
- Teoria: https://github.com/saebekassebil/teoria
- Impro-Visor: https://www.cs.hmc.edu/~keller/jazz/improvisor/
- MusicKit: https://github.com/benzguo/MusicKit
- Music21: http://web.mit.edu/music21/doc/index.html
- Sharp11: https://github.com/jsrmath/sharp11
- python-mingus: https://github.com/bspaans/python-mingus
使用Tonal的项目
展示使用Tonal的项目:
- Solfej 作者:Shayan Javadi
- EarBeater 作者:Morten Vestergaard
- Sonid(Play Store,App Store)作者:martijnmichel
- Songcraft 作者:Gabe G'Sell
- React Guitar 作者:4lejandrito
- Fretty.app 作者:tfeldmann
- Chordify 作者:ashleymays
- Chordal 作者:kad1kad
- muted.io 作者:thisisseb
- Midi Sandbox 作者:jdlee022
- music, eternal 作者:kousun12
- Chromatone.center 作者:davay42
- Super Oscillator 作者:lukehorvat
感谢各位!
通过编辑此文件来添加您的项目