Незаконченная реализация {{Тональность}}.
local p = {} -- p stands for package
p.note_to_number = {
['до'] = 0,
['до-диез'] = 1,
['ре-бемоль'] = 1,
['ре'] = 2,
['ре-диез'] = 3,
['ми-бемоль'] = 3,
['ми'] = 4,
['фа'] = 5,
['фа-диез'] = 6,
['соль-бемоль'] = 6,
['соль'] = 7,
['соль-диез'] = 8,
['ля-бемоль'] = 8,
['ля'] = 9,
['ля-диез'] = 10,
['си-бемоль'] = 10,
['си'] = 11,
['до-бемоль'] = 11
}
p.sharp_note = {
[0] = 'до',
[1] = 'до-диез',
[2] = 'ре',
[3] = 'ре-диез',
[4] = 'ми',
[5] = 'фа',
[6] = 'фа-диез',
[7] = 'соль',
[8] = 'соль-диез',
[9] = 'ля',
[10] = 'ля-диез',
[11] = 'си'
}
p.flat_note = {
[0] = 'до',
[1] = 'ре-бемоль',
[2] = 'ре',
[3] = 'ми-бемоль',
[4] = 'ми',
[5] = 'фа',
[6] = 'соль-бемоль',
[7] = 'соль',
[8] = 'ля-бемоль',
[9] = 'ля',
[10] = 'си-бемоль',
[11] = 'си'
}
p.enharmonic = {
['до-диез'] = 'ре-бемоль',
['ре-бемоль'] = 'до-диез',
['ре-диез'] = 'ми-бемоль',
['ми-бемоль'] = 'ре-диез',
['фа-диез'] = 'соль-бемоль',
['соль-бемоль'] = 'фа-диез',
['соль-диез'] = 'ля-бемоль',
['ля-бемоль'] = 'соль-диез',
['ля-диез'] = 'си-бемоль',
['си-бемоль'] = 'ля-диез',
['до-бемоль'] = 'си'
}
p.international_note = {
['до'] = 'C',
['до-диез'] = 'C♯',
['ля'] = 'A',
['ля-бемоль'] = 'A♭',
['ля-диез'] = 'A♯',
['ми'] = 'E',
['ми-бемоль'] = 'E♭',
['ре'] = 'D',
['ре-бемоль'] = 'D♭',
['ре-диез'] = 'D♯',
['си'] = 'B',
['си-бемоль'] = 'B♭',
['соль'] = 'G',
['соль-бемоль'] = 'G♭',
['соль-диез'] = 'G♯',
['фа'] = 'F',
['фа-диез'] = 'F♯',
}
p.ABC_note = {
['до'] = 'C',
['до-диез'] = 'C\'',
['ля'] = 'A',
['ля-бемоль'] = 'A,',
['ля-диез'] = 'A\'',
['ми'] = 'E',
['ми-бемоль'] = 'E,',
['ре'] = 'D',
['ре-бемоль'] = 'D,',
['ре-диез'] = 'D\'',
['си'] = 'B',
['си-бемоль'] = 'B,',
['соль'] = 'G',
['соль-бемоль'] = 'G,',
['соль-диез'] = 'G\'',
['фа'] = 'F',
['фа-диез'] = 'F\'',
}
function p.format_tonality(note, type)
return '[[' .. note .. ' ' .. type .. '|' .. p.international_note[note] .. ' / ' .. note .. ' ' .. type .. ']]'
end
function p.get_style_table (note, default)
if #note == 1 then
return default
else
if note:sub(2, 2) == 'b' then
return p.flat_note
else
return p.sharp_note
end
end
end
function p.relative_note(note, type)
return p.get_style_table(note, type == 'мажор' and p.sharp_note or p.flat_note)
[math.fmod(p.note_to_number[note] + (type == 'мажор' and 9 or 3), 12)]
end
function p.dominant_note(note, type, gamma, sub)
return ((gamma == 'диезная' or gamma == 'нейтральная') and p.sharp_note or (gamma == 'бемольная' and p.flat_note or ERROR))
[math.fmod(p.note_to_number[note] + (sub and 5 or 7), 12)]
end
function p.main(frame)
local parts = mw.text.split(mw.title.getCurrentTitle().text, ' ')
local note = mw.ustring.lower(parts[1])
local type = parts[2]
local gamma = frame:getParent().args['гамма']
return frame:expandTemplate{
title = 'Карточка',
args = {
['имя'] = 'Тональность',
['вверху'] = p.format_tonality(note, type),
['стиль_вверху'] = 'background:#fdeaa8;',
['стиль_заголовков'] = 'background:#fdeaa8;',
['стиль_меток'] = 'width:9em;',
['метка1'] = '[[Параллельные тональности|Параллельная тональность]]',
['текст1'] = p.format_tonality(p.relative_note(note, type), type == 'мажор' and 'минор' or 'мажор'),
['метка2'] = 'Соответствует',
['текст2'] = p.format_tonality(note, type == 'мажор' and 'минор' or 'мажор'),
['метка3'] = '[[Доминанта (теория музыки)|Доминанта]]',
['текст3'] = p.format_tonality(p.dominant_note(note, type, gamma, false), type),
['метка4'] = '[[Субдоминанта]]',
['текст4'] = p.format_tonality(p.dominant_note(note, type, gamma, true), type),
['заголовок5'] = 'Гамма',
['текст6'] = 'B♭, C, D, E♭, F, G, A', -- TODO
['текст7'] = frame:extensionTag('score',
'K:Bb\r\nB, C D E F G A B | B A G F E D C B, |',
{
vorbis = '1',
lang = 'ABC'
})
}
}
end
return p