Модуль:Песочница/Wikisaurus/Тональность

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация

Незаконченная реализация {{Тональность}}.

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