\chapter{Návrh metody pro transkripci hudby}\label{navrh_metody}

V této kapitole popíšu navrženou metodu pro transkripci hudby. Zabýval jsem se především detekcí not, ale návrh obsahuje i jednoduchou detekci rytmu.
\section{Detekce not}

Navržená metoda vychází z Fourierovy transformace s logaritmickým frekvenčním rozlišením a z konstantní Q transformace, které jsou popsané v kapitole (\ref{metody_transkripce}). \\

V metodě budu počítat pouze frekvence, které odpovídají půltónům hudební stupnice podle zadaného rozsahu. Na každou oktávu připadá dvanáct půltónů, takže vztah pro výpočet k-té frekvence bude následující:

\begin{equation}
f_k = (\sqrt[12]{2})^k * f_{min}
\end{equation} 
\\
kde $f_{min}$ je minimální analyzovaná frekvence a $k = 0, 1,....k_{max}$ a $k_{max}$ určím dle (\ref{kmax}).

\begin{equation}
k_{max} = \frac{log(\frac{f_{max}}{f_{min}})}{12*log(2)} \label{kmax} 
\end{equation} 
\\
Kde $f_{max}$ je maximální analyzovaná frekvence. Index $k_{max}$ zaokrouhluju vždy na celé číslo.\\

Dále si určím délku okna N, které představuje možnou časovou změnu frekvence. Tuto změnu, kdy může dojít ke změně frekvence, jsem stanovil na 100 milisekund. Přepočet na počet vzorků v této časové změně provádím dle vzorce (\ref{N}). 

\begin{equation}
N = 0,1 * f_s \label{N}
\end{equation} 
\\
Kde $f_s$ je vzorkovací frekvence. Přes celou délku tohoto okna N provádím diskrétní Fourierovu transformaci, která vypadá následovně:

\begin{equation}
X[k,\frac{n}{N}] = \sum_{j=n}^{n+N} W_k(j)x(j)a_k(j) \label{CQT}
\end{equation}
\\
kde $k = 0, 1,..., k_{max}$ a indexuje jednotlivé frekvence půltónů a $n = 0, N, 2N, 3N....n_{max}$ a $n_{max}$ odpovídá počtu časových intervalů $N_{max}$, který vypočítám podle vzorce (\ref{Nmax}), vynásobeným délkou okna $N$. Počet časových intervalů $N_{max}$ zaokrouhluji na celá čísla dolů.   

\begin{equation}
N_{max} = \frac{S}{N} \label{Nmax}
\end{equation}   
\\
Kde S je počet vzorků v celé skladbě. Dále $x(j)$ ze vzorce (\ref{CQT}) představuje vstupní signál skladby a $a_k(j)$ je funkce, která obsahuje součet sinových a kosinových vln se zvolenou frekvencí. Funkce $a_k(j)$ je definována jako:

\begin{equation}
a_k(n) = W(j)e^{-j2\pi n\frac{f_k}{f_s}}
\end{equation}
\\
kde $W(j)$ je funkce datového okna. Ve svém návrhu metody jsem zvolil okno pravoúhlé, ale můžeme zvolit i jiné okno, například Hannovo či Blackmanovo. \\

Následně si z matice X vypočítám matici Y tak, že každý řádek matice X vynásobím funkcí $a_k(n)$ nasledovně: 

\begin{equation}
Y[k,n+q] = X[k,n]a_k(q)
\end{equation}
\\
kde $k = 0, 1, 2,....., k_{max}$, $n = 0, N, 2N,....., n_{max}$ a $q = n, n+1, n+2,....., n+N$. Z této matice vyberu všechna čísla větší než dvacet procent maximálního čísla obsaženého v matici Y a označím ho jako možnou notu v analyzované skladbě. Jméno a přibližný začátek noty zjistím podle toho, ve kterém indexu se dané číslo nacházi. Frekvence nižších not jsou blíže u sebe a proto většinou zasahují do okolních frekvencí. Když zahraji v akordu dva půltóny vedle sebe, tak akord bude znít falešně a s největší pravděpodobností tento interval v akordu nebude. V případě, že algoritmus detekuje dva půltóny vedle sebe, vyberu ten, který se jeví jako pravděpodobnější, tedy který má větší číslo v matici Y.  

\section{Detekce rytmu}\label{rytmus}

Detekci rytmu provádím ze vstupního signálu tak, že zjistím, v jakém čase se projeví velká změna amplitudy signálu. Při této změně amplitudy vstupního signálu dochází i k zahrání nového tónu. Příklad vstupního signálu je na obrázku (\ref{vstup_signal}).\\

\begin{figure}[!h]
  \begin{center}
	\includegraphics[scale = 0.5]{obrazky/signal3}
  \end{center}
  \caption{Příklad vstupního signálu}\label{vstup_signal}
\end{figure}

Z nástupu tónů či akordů určím jednoduše i jejich délku tak, že akord nebo tón bude končit v momentě nástupu dalšího tónu. Z algoritmu pro detekci not mám u každého tónu i informaci přibližně v jakém čase či vzorku se tón vyskytuje. Následně všechny tóny, co se vyskytují v jednom časovém intervalu, budou jeden akord.\\

V algoritmu pro detekci not, kvůli jednoduššímu řešení a pro přehlednost notového zaznámu, rozlišuji mezi třemi typy délky noty a to celou, půlovou a čtvrťovou. Nejdřív si najdu nejdelší časový interval akordu nebo noty ve skladbě a tomu přiřadím notu celou. Ostatní délky not zjistím tak, že interval noty celé bude podobně dlouhý jako ten nejdelší. Interval noty půlové bude dvakrát menší a interval noty čtvrťové bude čtyřikrát menší. Počítám, že interval se může lišit zhruba o 100 milisekund oproti poměru vůči nejdelšímu intervalu skladby. 