/*
 * Copyright (c) 2009 by Oleg Trifonov <otrifonow@gmail.com>
 *
 * This file is free software; you can redistribute it and/or modify
 * it under the terms of either the GNU General Public License version 2
 * or the GNU Lesser General Public License version 2.1, both as
 * published by the Free Software Foundation.
 */


#ifndef _MELODY_H_
#define _MELODY_H_

#include <string>
#include "trStream.h"

class Melody {
public:
	enum MelodyFormat {
		FormatMotorolaC3xx			// телефоны Motorola C3xx (Melody Player for Motorola)
	};
	
	// выводит на экран таблицу частот нот
	static void PrintNotesTable();

	// компилирует мелодию из строки melody в поток out
	static int CompileMelody(const std::string& melody, TrStream &out, MelodyFormat format);

	// выводит на экран массив данных мелодии из потока скомпилированного результата
	static void PrintCompiledMelody(TrStream &data);

	// названия нот
	static const std::string names[];
private:
	// компилирует мелодию в формате Motorola
	static int CompileMelodyMotorolaC3xx(const std::string& melody, TrStream &out);

	// возвращает код ноты (для компилируемой бинарности)
	// если такой ноты не существует, возвращает -1
	static int GetNoteCode(char note, UInt8 octav=0);

	// получить код длительности или -1, если длительность неверна
	// temp - темп мелодии, если надо ее замедлить, то больше 1
	static int GetDurationCode(int duration, int temp = 1);
};


#endif // _MELODY_H_