Музыкальные примечания Lua к номерам

Вот версия, адаптированная из приведенной выше пары ответов, которая производит результаты в порядке, указанном в OP, и возвращает строки вместо массивов:

function *cartesianProduct(...arrays) {
  if (!arrays.length) yield [];
  else {
    const [tail, ...head] = arrays.reverse();
    const beginning = cartesianProduct(...head.reverse());
    for (let b of beginning) for (let t of tail) yield b + t;
  }
}

const first = ['a', 'b', 'c', 'd'];
const second = ['e'];
const third =  ['f', 'g', 'h', 'i', 'j'];
console.log([...cartesianProduct(first, second, third)])
1
задан LuaStart 13 July 2018 в 04:31
поделиться

1 ответ

Что-то вроде этого может работать:

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
0
ответ дан Paul Kulchenko 17 August 2018 в 13:41
поделиться
  • 1
    Если я помещаю свою строку в печать (notes2nums (chordnotes)), я получаю lua: пытаюсь выполнить арифметику по значению nil (local 'num') num = num - base – LuaStart 13 July 2018 в 20:37
  • 2
    Ваша строка, вероятно, включает пробелы или что-то, что не соответствует содержимому таблицы map. Добавьте print(note) после строки 4, чтобы увидеть значение в переменной note, которую он пытается найти. – Paul Kulchenko 13 July 2018 в 21:09
  • 3
    Обновлен ответ, чтобы поднять ошибку. – Paul Kulchenko 13 July 2018 в 21:11
  • 4
    К сожалению, моя вина была в кавычках, спасибо. – LuaStart 13 July 2018 в 21:29