Lua 音符转换为数字

我需要使用 Lua 将一些表示和弦的音符输入转换为其根音符 0 上方的数字。

    所以从midi数据中我们得到 C13 和弦的音符
    输入:C、E、G、A#、D、F、A
    由于根音符 0 是 C,因此我们从 C 音符开始,
    在下面我们有钢琴键盘的 2 个八度,每个八度有 12 个音符,和弦在其中被演奏
    0C 1C# 2D 3D# 4E 5F 6F# 7G 8G# 9A 10A# 11B 12C 13C# 14D 15D# 16E 17F 18F# 19G 20G# 21A 22A# 23B
    所以 C 是根音符 0
    D、F、A 是在下一个八度上演奏的
    结果:04710141721

    所以如果我们有 D 和弦
    输入:D、F#、A
    D 是根音符 0
    所有音符都在第一个八度上演奏
    0D 1D# 2E 3F 4F# 5G 6G# 7A 8A# 9B 10C 11C# 12D 13D# 14E 15F 16F# 17G 18G# 19A 20A# 21B 22C 23C#
    结果:047

    G#m7#9 和弦
    输入:G#、B、D#、F#、B
    0G# 1A 2A# 3B 4C 5C# 6D 7D# 8E 9F 10F# 11G 12G# 13A 14A# 15B 16C 17C# 18D 19D# 20E 21F 22F# 23G
    结果:0371015
点赞
用户1442917
用户1442917
可能会有这样的解决方法:

local function notes2nums(input) local map = {A = 9, ["A#"] = 10, B = 11, C = 0, ["C#"] = 1, D = 2, ["D#"] = 3, E = 4, F = 5, ["F#"] = 6, G = 7, ["G#"] = 8} local base, prev return (input:gsub("([^,]+)", function(note) local num = map[note] or error(("Unexpected note value '%s'"):format(note)) base = base or num num = num - base if prev and num < prev then num = num + 12 end prev = num return tostring(num) end)) end print(notes2nums("D,F#,A")) print(notes2nums("C,E,G,A#,D,F,A")) print(notes2nums("G#,B,D#,F#,B"))


输出结果为:

0,4,7 0,4,7,10,14,17,21 0,3,7,10,15

```

2018-07-13 05:42:10