musicmouse/espmusicmouse/host_driver/C5S2_ChordRec_Templates.ipynb

675 lines
146 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div>\n",
"<a href=\"http://www.music-processing.de/\"><img style=\"float:left;\" src=\"../data/FMP_Teaser_Cover.png\" width=40% alt=\"FMP\"></a>\n",
"<a href=\"https://www.audiolabs-erlangen.de\"><img src=\"../data/Logo_AudioLabs_Long.png\" width=59% style=\"float: right;\" alt=\"AudioLabs\"></a>\n",
"</div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div>\n",
"<a href=\"../C5/C5.html\"><img src=\"../data/C5_nav.png\" width=\"100\" style=\"float:right;\" alt=\"C5\"></a>\n",
"<h1>Template-Based Chord Recognition</h1> \n",
"</div>\n",
"\n",
"<br/>\n",
"\n",
"<p>\n",
"Following Section 5.2 of <a href=\"http://www.music-processing.de/\">[Müller, FMP, Springer 2015]</a>, we introduce in this notebook a basic approach for chord recognition using chord templates. For a discussion of the importance of various algorithmic components of such a system, we refer to the following two studies:\n",
"\n",
"<ul>\n",
" \n",
"<li><span style=\"color:black\">\n",
"Taemin Cho, Juan Pablo Bello: <strong>On the Relative Importance of Individual Components of Chord Recognition Systems.</strong> IEEE/ACM Transactions on Audio, Speech, and Language Processing, 22 (2014), pp. 466&ndash;492. \n",
"<br> \n",
"<a type=\"button\" class=\"btn btn-default btn-xs\" target=\"_blank\" href=\"../data/bibtex/FMP_bibtex_ChoB14_Chord_IEEE-TASLP.txt\"> Bibtex </a>\n",
"</span></li>\n",
"\n",
"<li><span style=\"color:black\">\n",
"Nanzhu Jiang, Peter Grosche, Verena Konz, Meinard Müller: <strong>Analyzing Chroma Feature Types for Automated Chord Recognition.</strong> Proceedings of the AES Conference on Semantic Audio, Ilmenau, Germany, 2011. \n",
"<br> \n",
"<a type=\"button\" class=\"btn btn-default btn-xs\" target=\"_blank\" href=\"../data/bibtex/FMP_bibtex_JiangGKM11_Chord_AES.txt\"> Bibtex </a>\n",
"</span></li>\n",
"\n",
"</ul> \n",
"</p> "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction\n",
"\n",
"In music, **harmony** refers to the simultaneous sound of different notes that form a cohesive entity in the mind of the listener. The main constituent components of harmony, at least in the Western music tradition, are [**chords**](../C5/C5S1_Chords.html), which are musical constructs\n",
"that typically consist of three or more notes. Harmony analysis may be thought of as the study of the construction, interaction, and progression of chords. In this notebook, we discuss a subproblem of harmonic analysis referred to as **chord recognition**, where we consider only a small number of the most important chords as occurring in Western music. Furthermore, we assume that the piece of music is given in the form of an **audio recording**. The resulting chord recognition task consists in splitting up the recording into **segments** and assigning a **chord label** to each segment. The segmentation specifies the start and end time of a chord, and the chord label specifies which chord is played during this time period. A typical chord recognition system consists of **two main steps**. \n",
"\n",
"* In the first step, the given audio recording is cut into frames, and each frame is transformed into an appropriate **feature vector**. Most recognition systems rely on [**chroma-based audio features**](../C3/C3S1_SpecLogFreq-Chromagram.html), which correlate to the underlying tonal information contained in the audio signal. \n",
"* In the second step, **pattern matching** techniques are used to map each feature vector to a set of predefined **chord models**. The best fit determines the chord label assigned to the given frame. \n",
"\n",
"To improve the chord recognition results, additional enhancement techniques are applied either before the pattern matching step (referred to as [**prefiltering**](../C5/C5S3_ChordRec_HMM.html)) or after/within the pattern matching step \n",
"(referred to as [**postfiltering**](../C5/C5S3_ChordRec_HMM.html)). In this notebook, we introduce a first chord recognition procedure that employs a simple template-based matching strategy.\n",
"\n",
"<img src=\"../data/C5/FMP_C5_F13.png\" width=\"500px\" align=\"middle\" alt=\"FMP_C5_F13\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Beatles Example\n",
"\n",
"In the following example, the chord recognition task is illustrated by the first measures of the Beatles song \"Let It Be.\" The figure shows a score representation, the recording's waveform, a [chromagram](../C3/C3S1_SpecLogFreq-Chromagram.html), as well as chord annotations generated in a manual process. \n",
"\n",
"<img src=\"../data/C5/FMP_C5_F01.png\" width=\"400px\" align=\"left\" alt=\"FMP_C5_F01\">\n",
"\n",
"<br clear=\"all\" />\n",
"\n",
"<audio style=\"width: 400px;\" src=\"../data/C5/FMP_C5_F01_Beatles_LetItBe-mm1-4_Original.mp3\" type=\"audio/mpeg\" controls=\"controls\"></audio>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Chroma-Based Feature Representation\n",
"\n",
"Given an audio recording of a piece of music, the first step is to transform the recording into a sequence $X=(x_1,x_2,\\ldots,x_N)$ of feature vectors $x_n\\in\\mathcal{F}$, $n\\in[1:N]$, where $\\mathcal{F}$ denotes a suitable feature space. As mentioned above, nearly all traditional chord recognition procedures rely on some type of [**chroma-based feature representation**](../C3/C3S1_SpecLogFreq-Chromagram.html). This is because chroma-based features capture a signal's short-time tonal content, which is closely correlated to the harmonic progression of the underlying piece. Assuming the [equal-tempered scale](../C1/C1S1_MusicalNotesPitches.html), the chroma values correspond to the set $\\{\\mathrm{C},\\mathrm{C}^\\sharp,\\mathrm{D},\\ldots,\\mathrm{B}\\}$, which we identify with the set $[0:11]$. A chroma feature can then be expressed as a $12$-dimensional vector \n",
"\n",
"$$\n",
"x=(x(0),x(1),\\ldots,x(11))^\\top\\in\\mathcal{F}=\\mathbb{R}^{12}\n",
"$$ \n",
"\n",
"As we also discuss in other FMP notebooks (e.g., in the context of [music synchronization](../C3/C3S1_SpecLogFreq-Chromagram.html) or [content-based music retrieval](../C7/C7S2_CENS.html)), there are many different ways of computing chroma features. Furthermore, their properties can be adjusted by applying suitable postprocessing steps such as [logarithmic compression](../C3/C3S1_LogCompression.html), [normalization](../C3/C3S1_FeatureNormalization.html), or [smoothing](../C3/C3S1_FeatureSmoothing.html). To give some example, we compute in the following code cell three different chroma variants: \n",
"\n",
"* STFT-based chroma features (`librosa.feature.chroma_stft`). \n",
"* Filter-bank decomposition using IIR elliptic filters (`librosa.iirt`), logarithmic compression, and chroma binning.\n",
"* CQT-based chroma features (`librosa.feature.chroma_cqt`)\n",
"\n",
"For each variant, we use the same window length (`N=4096`) and hop size (`H=2048`). Furthermore, in each variant, we normalize the chroma vectors with respect to the [Euclidean norm](../C3/C3S1_FeatureNormalization.html) ($\\ell^2$-norm). In the following figure, the resulting chromagrams are visually superimposed with the manually generated chord annotations (in color). "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/martin/code/musicmouse/espmusicmouse/venv/lib/python3.8/site-packages/librosa/core/audio.py:165: UserWarning: PySoundFile failed. Trying audioread instead.\n",
" warnings.warn(\"PySoundFile failed. Trying audioread instead.\")\n",
"/home/martin/code/musicmouse/espmusicmouse/venv/lib/python3.8/site-packages/librosa/core/audio.py:165: UserWarning: PySoundFile failed. Trying audioread instead.\n",
" warnings.warn(\"PySoundFile failed. Trying audioread instead.\")\n",
"/home/martin/code/musicmouse/espmusicmouse/venv/lib/python3.8/site-packages/librosa/core/audio.py:165: UserWarning: PySoundFile failed. Trying audioread instead.\n",
" warnings.warn(\"PySoundFile failed. Trying audioread instead.\")\n"
]
},
{
"data": {
"image/png": "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736XPn36NBrKtX7oV7O8KvWuaD1NZxyBN9yNTFIfkruRNe0ZNRU4LX1+PPBga+e/7SO1ta03RnzrW98quuwrX/lKm6+/0UYbMX78+IbHj370o0bLx40bx9Zbb90wXX+P6I997GNtvnZ30atXr2b3xq60pp0M+/Xr12wcdh+BW9511v0guqty3Y3sJmALSfOBbwHNLjVrauONN253mUaOHNnubcvtvPPOa3X5jjvuyDHHHNPisr322qvVeqo/QuuIbbbZhrPOOosf/ehHHHnkkYwaNarDr5k3W221FWPGjKl0MUrWk3ru7rPPPpUugnWBDTfcsNJFqGqdcg48Iu6NiB0j4hMRcXE670cRMTV9/mFEnBARO0TEPhGxoM2CFRxNfPWrXy2pPMcccwxHHHFEaR+iiu29994MGzas2fwsR1hnn312p5RBEvvuu2+PPKrLeuevYrK0hFjH1NbWsu2221a6GNbJdtppp0oXoapVVSe2QoU/mgMHDsy8XW1tLb169crNdcqS+Jd/+Zc21zvyyCMBGnUsy9KRbMstt2x/4dpw6KGHdtlrdyed0RJSyEclzW266absvffelS5G2ey5556VLkJZ9KRWpPao2gDfYIMNGDRoEKeffjoA//zP/1x03X322YfTTjuN/fffn6OOOqphfuFR/KGHHspJJ1Xf2DGS2Gqrrdpcb+utt2b8+PGNLu0aMGBAo3UOO+ywhuejR4+mLWeccUYJJW1u8OCmVwv2TD/84Q8bTRf2S/jCF74AtL2z9f/+3//L/H7f+MY3Sihdz9CnTx8233zzShejbNy5y6CKAxySW2LWd2LYfvvtG+ZvscUWjZqUjzrqKIYNG8bhhx/eKLQvvPBCxowZwwknnMBnPvMZdt55Z0466SQ23XTTsn2GrDbYYIPM6x599NGcdNJJDR3Jzj33XAYNGsRee+3VsE6WfgAdbXIcMmRIh7bPm8985jPN5p111ln06tWrIYA32WQTNt5444YWpPrgbusc+u677565HKU06Xd0Jy1Pit0xrjsq/D20nqtqbyfakpNOOolly5ax//77A8k9snv37l10/Zqamma9h3feeWdmz57d6Faam266KWeccQY//elPu6LYraoP7s0337zZuL9f+tKXWtym6f3Ot9hiC8455xwg6RRXU1Oe/9ZSdjq6g/32269hyNKNNtqI9957r6GH/m677cby5csbOlOde+65jf4/i/2fbLbZZg3f567Qv3//LnvtarPZZptVughmZdWhI3BJm0uaJumF9N8BRdZbJ+nJ9NF88O2Mdt5550Y/dn369Gk1wIupP1IdMmQI559/Pt/85jfZdNNNm12aU3iusauai+s7hR100EFAcs66/pKuoUOHtrZpizbZZJNm50jrm3GtYwrr9Zvf/CY/+MEPGqYlceCBB9KvXz8guYpihx12aPM1v/GNbzTbISu06667dqDEPfcc4re//e3M6w4fPpzzzjuPE044odH81u4HkMVnP/vZRtObbLJJh16v3vHHH98pr9OaU045pcvfwzquo03oFwAPRMQI4AGKXx72QUR8Kn20fXK2i9Vfgr7RRhs1C7vCIfvOPPPMhudbbrklxx57bMP00KFDueCCNq+GK2qXXXbh8MMPbzR91llnZerQVqrC86/1R4iVHmf+85//fKPppucvjzvuuJKb6I899tiil9w11bT/QDHFfsR79+7drp3HUnW0NaW1z3nccce1um3TUyxN/8+qWdPm9KadWgs7dw4dOpRNNtmk1Z2lQw45pNF0bW1tm6cn+vfv3yhszzvvvGbjLLRHOYYVLaXjsFVORwN8DHBL+vwW4LgOvl5ZjBgxgtra2hZ/kArPoRc2P+6yyy4NR+69e/fmS1/6UrsvqTrzzDM58cQTmzWdbr311l12xFRTU8MWW2zBUUcdxfjx4xsNztIZmjZfNu102HSHoekANV/4whc47bTTuPDCCxk/fjx77rlnps59hWpqahr1A9hxxx35+te/3uK65557bkmv3RmGDx8OJGFywQUX8L3vfa/NbTr6fWht+6aB1XRn4Ytf/GLD8x/96EfU1tYyfvx4/vmf/5ljjjmGH/3oRyVf5nPcccc16mBZbICcESNGZO7Y1/RIt6mvf/3rjS4r/dznPteoF3eWMaWGDh3a8P8Hyc7Mtttu2+olrptsskmzgUhK+f/cc889W+zL0vR3p7WWuqz9XL7zne80mi61n9A555zTaBt3cC2Pjgb4VhHxWvr8daDYL26/9CYlMyQdV+zFCm9msnTp0g4WrbjevXvz+c9/vs1OL4V/KPXNoaecckqHewFXovPX9773vZKvpy/FV7/6VS644AL69evH8ccfz/bbb9+oGbO1Pfrvfe97fPzjH2fYsGGNOmg1raexY8c2O1I/8MADG57X1NQgibFjxzbMa+kIdMMNN6RXr14NOwqQHGkXC/vOssUWyf17tt56a/r27ZupD0HTH/zCqyw64qSTTmr2/ieffHKj6cLvf2E5tt9+e/bee28kNft/bWncgcJWjK233pqRI0c2dMIaOXJkiztT//iP/8juu+/O1772NTbffHOOPfbYhn4eTX3uc58r9jGBj74D559/Pqeddhqf/exnG4Vxa78DP/zhDznllFMYPnx4w6mOwlMjAwcObGga33LLLTnhhBM444wz2GqrrRgxYkSrrTSttWicfPLJDTs7hxxyCIMGDeKHP/wh3/jGN5r1a9hrr70a/taajsZ3zDHHMH78+Davgih8zfYMojVo0CC+8Y1vMHLkSMaNG9dwStC6Vpvtc5LuB1o6XPt+4UREhKRiu7LbRcRiSdsDD0p6KiJebLpSREwCJgHU1tZWZKjVAw88kNtvv71hura2lr/97W8NP2Cf+MQnGq3/ne98h4hoNJ74hRdeyD333MOcOXOQRERw+OGHM23atJJ6G3emrj4XWlNTQ01NTaMbaxT+MLbWFJwlyHbddVd22mkndtppJyZMmNAw/5BDDmH69OlAtiMpaHwu+7jjjmtoSs7arN5ehx12GB/72MeK/pgeeuihPPDAAw3TZ511Fn/9618bpk8//fQOXTlQf8RfWN+FY+G3p9l0t91249FHHwWSv50tt9ySr3zlK9xwww2tbnfyySfz6quvFv089VdYbL755nzta19rmL/HHnswZ86coq87bNgwFi9ObsVw0EEHNRqvf8MNN2y4eqWwGbq1u+716tWr4W++PhybhuRhhx3G//zP/7Dnnns2tGrUnwqrqanhmGOOaRT6G2ywATvuuCN77703Tz75JIsXL+awww7jgAMOaPhuF7aQHXjggQ07qi111Nt0000bhkQupnC773znO/zkJz8p+vlb2kns1asX69evb/G163dgJDVqXTnzzDO56aabGqbPOecclixZwpIlSxr+Zq1j2gzwiDis2DJJb0jaJiJek7QNsKTIayxO/10g6WFgJNAswKvBjjvuyLHHHsuIESOAZC+5tT3llnr59unTh6OPPpptt92W/v37c8cdd7Dnnnt2aW/janXCCSfwzjvvAEmT4MKFCzn11FMzbVt4qWDhOczPf/7z3HPPPUW322677dhiiy2anbes19qYAoX+8R//sdm8Y489ljVr1mTavqm+ffu2erS4//77s/HGG7PHHns07HDtsccezJ49G+j4uNAt7SgV7mRtsskmnHjiidx5552ZTzHUH1HPnj27YSettYFr6j9XTU1N0fBuadTBeocddlijAG96Tvm0005reH7wwQdz8MEHF32tH/zgB6xYsaLREeduu+3G008/3eqOdtMdxd12260hlFvSdICZwlMnX/7ylxstu+CCC3jzzTczdXjr27cvq1atarW+6u2///4NV1DU/2bV1NTw/e9/v9m69YH+D//wD8ycORNI/ubuvvvuFl+72HDQhS1oH//4xxk0aBCDBg1ik002aRbgZ511Ftdff32jeR4et20dvd6o/iYll6T//l/TFdKe6SsjYpWkgcABwGUdfN8uVXgeNavDDjuM+++/v2G6b9++DX+4He3NmmeF51nb6jTV1GabbdZi3Q0aNAj46Nzf1ltvzeuvv95wBN2vX7+iATR8+PBWfxwPPvhgHn74YaDlwTLa893IqlevXs1G2Cr3zRx22WWXkr+vRx11FP3792ffffdtmLfJJpvwzjvvNHQWGzt2LE899VTD/10x559/fknXuXekZal3797NTskccsghPP300y2O6rbDDjswcuTIZjsFkth5553bXY5Cffv2zXz+uJROtB/72Mc4/vjjG66SyPJ/XNhKMWDAAE499VT69+/PLbfcwhFHHFHSYDKF9Vm/0zhs2DCGDh3KZz/7WTbYYAMGDx7c0HoC2VvUerKOBvglwJ2SzgReAU4EkFQL/EtEfBnYBbhe0nqSc+6XRMS8Dr5v1TnggAMaBbh1nfojiPofunHjxrF8+fKiI3H9y7/8C2+//XamDlcHHXRQQ4BXA0l897vfLdp8mcUOO+zQ6o/hOeecU/T1999//zZ7wm+wwQbNhtX9zGc+w7333ttwFFZ/+qOYwYMHs2zZsjaHie3qu+BtvvnmrV55kGWEw2r1yU9+stXlZ5xxBh988EHD9J577snUqR9d9Vvfb+D888/P/J5Dhw5l4cKFzUaQHDduHFtuuWWjPgJf/vKXG50eK+zfYi1Tte7l1NbWRl1dXaWLUZL6L19POuJet24dEdGuy53efvtt1qxZ0+ZRWUtef/11Bg0a1CWXcvXE/8fO9v7773PjjTfyT//0T11ySZL/j8pj6dKlTJs2jRNPPLFdf+Nr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\n",
"text/plain": [
"<Figure size 504x576 with 10 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import os\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"import librosa\n",
"\n",
"import sys\n",
"import libfmp.b\n",
"import libfmp.c3\n",
"import libfmp.c4\n",
"%matplotlib inline\n",
"\n",
"test_file = \"/home/martin/Music/deemix Music/Simone Sommerland - Ki-Ka-Kinderturnen.mp3\"\n",
"\n",
"def compute_chromagram_from_filename(fn_wav, Fs=22050, N=4096, H=2048, gamma=None, version='STFT', norm='2'):\n",
" \"\"\"Compute chromagram for WAV file specified by filename\n",
"\n",
" Notebook: C5/C5S2_ChordRec_Templates.ipynb\n",
"\n",
" Args:\n",
" fn_wav (str): Filenname of WAV\n",
" Fs (scalar): Sampling rate (Default value = 22050)\n",
" N (int): Window size (Default value = 4096)\n",
" H (int): Hop size (Default value = 2048)\n",
" gamma (float): Constant for logarithmic compression (Default value = None)\n",
" version (str): Technique used for front-end decomposition ('STFT', 'IIS', 'CQT') (Default value = 'STFT')\n",
" norm (str): If not 'None', chroma vectors are normalized by norm as specified ('1', '2', 'max')\n",
" (Default value = '2')\n",
"\n",
" Returns:\n",
" X (np.ndarray): Chromagram\n",
" Fs_X (scalar): Feature reate of chromagram\n",
" x (np.ndarray): Audio signal\n",
" Fs (scalar): Sampling rate of audio signal\n",
" x_dur (float): Duration (seconds) of audio signal\n",
" \"\"\"\n",
" x, Fs = librosa.load(fn_wav, sr=Fs)\n",
" x_harmonic, y_percussive = librosa.effects.hpss(x) \n",
" x = x_harmonic\n",
" x_dur = x.shape[0] / Fs\n",
" if version == 'STFT':\n",
" # Compute chroma features with STFT\n",
" X = librosa.stft(x, n_fft=N, hop_length=H, pad_mode='constant', center=True)\n",
" if gamma is not None:\n",
" X = np.log(1 + gamma * np.abs(X) ** 2)\n",
" else:\n",
" X = np.abs(X) ** 2\n",
" X = librosa.feature.chroma_stft(S=X, sr=Fs, tuning=0, norm=None, hop_length=H, n_fft=N)\n",
" if version == 'CQT':\n",
" # Compute chroma features with CQT decomposition\n",
" X = librosa.feature.chroma_cqt(y=x, sr=Fs, hop_length=H, norm=None)\n",
" if version == 'IIR':\n",
" # Compute chroma features with filter bank (using IIR elliptic filter)\n",
" X = librosa.iirt(y=x, sr=Fs, win_length=N, hop_length=H, center=True, tuning=0.0)\n",
" if gamma is not None:\n",
" X = np.log(1.0 + gamma * X)\n",
" X = librosa.feature.chroma_cqt(C=X, bins_per_octave=12, n_octaves=7,\n",
" fmin=librosa.midi_to_hz(24), norm=None)\n",
" if norm is not None:\n",
" X = libfmp.c3.normalize_feature_sequence(X, norm='2')\n",
" Fs_X = Fs / H\n",
" return X, Fs_X, x, Fs, x_dur\n",
"\n",
"def plot_chromagram_annotation(ax, X, Fs_X, ann, color_ann, x_dur, cmap='gray_r', title=''):\n",
" \"\"\"Plot chromagram and annotation\n",
"\n",
" Notebook: C5/C5S2_ChordRec_Templates.ipynb\n",
"\n",
" Args:\n",
" ax: Axes handle\n",
" X: Feature representation\n",
" Fs_X: Feature rate\n",
" ann: Annotations\n",
" color_ann: Color for annotations\n",
" x_dur: Duration of feature representation\n",
" cmap: Color map for imshow (Default value = 'gray_r')\n",
" title: Title for figure (Default value = '')\n",
" \"\"\"\n",
" libfmp.b.plot_chromagram(X, Fs=Fs_X, ax=ax,\n",
" chroma_yticks=[0, 4, 7, 11], clim=[0, 1], cmap=cmap,\n",
" title=title, ylabel='Chroma', colorbar=True)\n",
" libfmp.b.plot_segments_overlay(ann, ax=ax[0], time_max=x_dur,\n",
" print_labels=False, colors=color_ann, alpha=0.1)\n",
"\n",
"# Compute chroma features\n",
"fn_wav = test_file # os.path.join('..', 'data', 'C5', 'FMP_C5_F01_Beatles_LetItBe-mm1-4_Original.wav')\n",
"N = 4096 * 32\n",
"H = 2048 * 32\n",
"X_STFT, Fs_X, x, Fs, x_dur = compute_chromagram_from_filename(fn_wav, N=N, H=H, gamma=0.1, version='STFT')\n",
"X_IIR, Fs_X, x, Fs, x_dur = compute_chromagram_from_filename(fn_wav, N=N, H=H, gamma=100, version='IIR')\n",
"X_CQT, Fs_X, x, Fs, x_dur = compute_chromagram_from_filename(fn_wav, N=N, H=H, version='CQT')\n",
"\n",
"# Annotations\n",
"fn_ann = test_file #os.path.join('..', 'data', 'C5', 'FMP_C5_F01_Beatles_LetItBe-mm1-4_Original_Chords_simplified.csv')\n",
"#ann, _ = libfmp.c4.read_structure_annotation(fn_ann)\n",
"color_ann = {'N': [1, 1, 1, 1], 'C': [1, 0.5, 0, 1], 'G': [0, 1, 0, 1], \n",
" 'Am': [1, 0, 0, 1], 'F': [0, 0, 1, 1]}\n",
"\n",
"# Plot\n",
"cmap = libfmp.b.compressed_gray_cmap(alpha=1, reverse=False)\n",
"fig, ax = plt.subplots(5, 2, gridspec_kw={'width_ratios': [1, 0.03], \n",
" 'height_ratios': [1, 2, 2, 2, 0.5]}, figsize=(7, 8))\n",
"libfmp.b.plot_signal(x, Fs, ax=ax[0,0], title='Waveform of audio signal')\n",
"#libfmp.b.plot_segments_overlay(ann, ax=ax[0,0], time_max=x_dur,\n",
"# print_labels=False, colors=color_ann, alpha=0.1)\n",
"ax[0,1].axis('off')\n",
"\n",
"#title = 'STFT-based chromagram (feature rate = %0.1f Hz, N = %d)'%(Fs_X, X_STFT.shape[1])\n",
"#plot_chromagram_annotation([ax[1, 0], ax[1, 1]], X_STFT, Fs_X, ann, color_ann, x_dur, title=title)\n",
"\n",
"#title = 'IIR-based chromagram (feature rate = %0.1f Hz, N = %d)'%(Fs_X, X_IIR.shape[1])\n",
"#plot_chromagram_annotation([ax[2, 0], ax[2, 1]], X_IIR, Fs_X, ann, color_ann, x_dur, title=title)\n",
"\n",
"#title = 'CQT-based chromagram (feature rate = %0.1f Hz, N = %d)'%(Fs_X, X_CQT.shape[1])\n",
"#plot_chromagram_annotation([ax[3, 0], ax[3, 1]], X_CQT, Fs_X, ann, color_ann, x_dur, title=title)\n",
"\n",
"#libfmp.b.plot_segments(ann, ax=ax[4, 0], time_max=x_dur, time_label='Time (seconds)',\n",
"# colors=color_ann, alpha=0.3)\n",
"ax[4,1].axis('off')\n",
"plt.tight_layout()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Template-Based Pattern Matching\n",
"\n",
"Given the chroma sequence $X=(x_1,x_2,\\ldots,x_N)$ and a set $\\Lambda$ of possible chord labels, the objective of the next step is to map each chroma vector $x_n\\in\\mathbb{R}^{12}$ to a chord label $\\lambda_{n} \\in \\Lambda$, $n\\in[1:N]$. For example, one may consider the set\n",
"\n",
"\\begin{equation}\n",
" \\Lambda = \\{\\mathbf{C},\\mathbf{C}^\\sharp,\\ldots,\\mathbf{B},\\mathbf{Cm},\\mathbf{C^\\sharp m},\\ldots,\\mathbf{Bm}\\}\n",
"\\end{equation}\n",
"\n",
"consisting of the [twelve major and twelve minor triads](../C5/C5S1_Chords.html). In this case, each frame $n\\in[1:N]$ is assigned to a [major chord](../C5/C5S1_Chords.html) or a [minor chord](../C5/C5S1_Chords.html) specified by $\\lambda_{n}$. For the pattern matching step, we now introduce a simple template-based approach. The idea is to precompute a set \n",
"\n",
"$$\n",
"\\mathcal{T}\\subset\\mathcal{F}=\\mathbb{R}^{12}\n",
"$$ \n",
"\n",
"of templates denoted by $\\mathbf{t}_\\lambda\\in\\mathcal{T}$, $\\lambda\\in\\Lambda$. Intuitively, each template can be thought of as a prototypical chroma vector that represents a specific musical chord. Furthermore, we fix a similarity measure \n",
"\n",
"\\begin{equation}\n",
"s:\\mathcal{F}\\times\\mathcal{F}\\to \\mathbb{R}\n",
"\\end{equation}\n",
"\n",
"that allows for comparing different chroma vectors. Then, the template-based procedure consists in assigning the chord label that maximizes the similarity between the corresponding template and the given feature vector $x_n$:\n",
"\n",
"\\begin{equation}\n",
" \\lambda_{n} := \\underset{\\lambda \\in \\Lambda}{\\mathrm{argmax}}\n",
" \\,\\, s( \\mathbf{t}_\\lambda , x_n ).\n",
"\\end{equation}\n",
"\n",
"In this procedure, there are many design choices that crucially influence the performance of a chord recognizer. \n",
"\n",
"* Which chords should be considered in $\\mathcal{T}$? \n",
"* How are the chord templates defined? \n",
"* What is a suitable similarity measure to compare the feature vectors with the chord templates? \n",
"\n",
"To obtain a first simple chord recognition system, we make the following design choices. For the chord label set $\\Lambda$, we choose the twelve major and twelve minor triads. This choice, even though problematic from a musical point of view, is convenient and instructive. Considering chords up to enharmonic equivalence and up to octave shifts, each triad can be encoded by a three-element subset of $[0:11]$. For example, the $\\mathrm{C}$ major chord $\\mathbf{C}$ corresponds to the subset $\\{0,4,7\\}$. Each subset, in turn, can be identified with a binary twelve-dimensional chroma vector $x=(x(0),x(1),\\ldots,x(11))^\\top$, where $x(i)=1$ if and only if the chroma value $i\\in[0:11]$ is contained in the chord. For example, in the case of the $\\mathrm{C}$-major chord $\\mathbf{C}$, the resulting chroma vector is\n",
"\n",
"\\begin{equation}\n",
"\\label{eq:ChordReco:Template:Basic:ChromaVectC}\n",
" \\mathbf{t}_{\\mathbf{C}}{} := x =(1,0,0,0,1,0,0,1,0,0,0,0)^\\top.\n",
"\\end{equation}\n",
"\n",
"Using a chroma-based encoding, the twelve major chords and twelve minor chords can be obtained by [cyclically shifting](../C3/C3S1_TranspositionTuning.html) the binary vectors for the $\\mathrm{C}$-major and the $\\mathrm{C}$-minor triads, respectively. The result is illustrated by the following figure.\n",
"\n",
"<img src=\"../data/C5/FMP_C5_F06.png\" width=\"700px\" align=\"middle\" alt=\"FMP_C5_F06\">\n",
"\n",
"For comparing chroma features and chord templates, we use in the following a simple similarity measure using the inner product of normalized vectors:\n",
"\n",
"\\begin{equation}\n",
" s(x,y)= \\frac{\\langle x,y\\rangle}{\\|x\\|\\cdot\\|y\\|}\n",
"\\end{equation}\n",
"\n",
"for $x,y\\in\\mathcal{F}$ with $\\|x\\|\\not= 0$ and $\\|y\\|\\not= 0$. In the case $\\|x\\|=0$ or $\\|y\\|=0$, we set $s(x,y)=0$. Note that this measure always yields a value $s(x,y)\\in[-1,1]$. In the case that the vectors $x$ and $y$ only have positive entries, one has $s(x,y)\\in[0,1]$."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Implementation\n",
"\n",
"In the following code cell, we provide an implementation for the template-based chord recognition procedure described before. To obtain a better understanding of this procedure, we continue our Beatles example from above. The following steps are performed and visualized:\n",
"\n",
"* First, the audio recording is converted into a chroma representation. As an example, we use the STFT-variant as computed before. \n",
"\n",
"* Second, each chroma vector is compared with each of the $24$ binary chord templates, which yields $24$ similarity values per frame. These similarity values are visualized in the form of a **time&ndash;chord representation**.\n",
"\n",
"* Third, we select for each frame the chord label $\\lambda_{n}$ of the template that maximizes the similarity value over all $24$ chord templates. This yields our final chord recognition result, which is shown in the form of a **binary time&ndash;chord representation**.\n",
"\n",
"* Fourth, the manually generated chord annotations are visualized.\n",
"\n",
"In the following figure, all visualizations are superimposed with the manually generated chord annotations. \n",
"\n",
"<!--<img src=\"../data/C5/FMP_C5_F15.png\" width=\"400px\" align=\"middle\" alt=\"FMP_C5_F15\">-->"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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tcsQjVb2bBwB3ClpNPBUo1e+++678+1vfztXTJFEXnfffXfumJNOKjZWefHixbljiiSqe9e73pU75tprr80dUyTh3Pr163PHPPTQQ7ljoFhyqaOPPjp3zLx583LHTJ48OXfMPffckzumSMK5N7yhWBaFww47LHfMww8/nDtmw4YNuWPe8pa35I557LHHcsccemj+/+eKJKmDYsngxo0blzumyH/1a9eurb1QiSIJ/gYNKpZMvsh72m233XLH7LvvvrmWL5IwtBr3yKQiYkiF6a/eFErSOzIDggFOycZFxIX1rNPMzMy2nsfI5FdtQLCZmZl1MjdktpKkDwCnkFyGvRdwCdAPeC/JwN8TImJpq8pnZmbWnbXLGJmuUsqBmVsYZO+oOBF4B3AIcBGwOiIOAu4C3teCcpqZmfUIvkVBPpVOLU2LiBXACkkvA79Kp88Gthgpmk2It9NOOzWpqGZmZt1bqxsneXSVHplKskPXN2Veb6JMIywiroyIyRExedttt+2M8pmZmXVL7pExMzOzttUuY2S6bUNm/fr1PP/887liHnzwwdzbeemll3LHvPjii7ljAO67777cMQceeGDumO222y53TJEDvkiOmyI5QIrkpIBi+6l///65Y4rkailyrD799NO5Y15++eXcMWvWrMkdA/COd7wjd8ymTZtyx+T9XoBi+UaKHAtFclkVre8ix/fAgQNzxxT5juzXr1/umCL7qEhuFyhW50uX5r825dFHH821fNHvukra5dRSl2jIlMsLExFXA1dnXo+tNM/MzMwap9Wni/JoeUNG0kaSwbsdpkTExa0qj5mZmblHJg8nwzMzM+ti2mWMTJctpaT5kr6e5paZIelgSbdKekLSR1tdPjMzs+7MVy3Vb2DJfZa+HhHXp8+fjogDJV1KMibmcGAA8CBwRemKsnlkdthhh2aW2czMrNtqdeMkj67QkKl2amlq+nc2MCSTHG+tpGERsSy7cERcCVwJMG7cuGhSec3MzLq9dmnIdNlTS6lsArzS5HhdoRFmZmbWLfXq1SvXox6SjpP0iKTHJX2hzPzdJE2TdJ+kBySdULOcBd6bmZmZdWN5x8fU03sjqTdwOXA8MAE4Q9KEksX+Gbghva/i6cD3aq23K/RqlI6RuSUitmil5dW3b1922WWXXDFvfvObc2/n17/+de6YJUuW5I6BYsmbiiSQ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\n",
"text/plain": [
"<Figure size 576x720 with 8 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def get_chord_labels(ext_minor='m', nonchord=False):\n",
" \"\"\"Generate chord labels for major and minor triads (and possibly nonchord label)\n",
"\n",
" Notebook: C5/C5S2_ChordRec_Templates.ipynb\n",
"\n",
" Args:\n",
" ext_minor (str): Extension for minor chords (Default value = 'm')\n",
" nonchord (bool): If \"True\" then add nonchord label (Default value = False)\n",
"\n",
" Returns:\n",
" chord_labels (list): List of chord labels\n",
" \"\"\"\n",
" chroma_labels = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']\n",
" chord_labels_maj = chroma_labels\n",
" chord_labels_min = [s + ext_minor for s in chroma_labels]\n",
" chord_labels = chord_labels_maj + chord_labels_min\n",
" if nonchord is True:\n",
" chord_labels = chord_labels + ['N']\n",
" return chord_labels\n",
"\n",
"def generate_chord_templates(nonchord=False):\n",
" \"\"\"Generate chord templates of major and minor triads (and possibly nonchord)\n",
"\n",
" Notebook: C5/C5S2_ChordRec_Templates.ipynb\n",
"\n",
" Args:\n",
" nonchord (bool): If \"True\" then add nonchord template (Default value = False)\n",
"\n",
" Returns:\n",
" chord_templates (np.ndarray): Matrix containing chord_templates as columns\n",
" \"\"\"\n",
" template_cmaj = np.array([1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0]).T\n",
" template_cmin = np.array([1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0]).T\n",
" \n",
" num_chord = 24\n",
" if nonchord:\n",
" num_chord = 25\n",
" chord_templates = np.ones((12, num_chord))\n",
" for shift in range(12):\n",
" chord_templates[:, shift] = np.roll(template_cmaj, shift)\n",
" chord_templates[:, shift+12] = np.roll(template_cmin, shift)\n",
" return chord_templates\n",
"\n",
"def chord_recognition_template(X, norm_sim='1', nonchord=False):\n",
" \"\"\"Conducts template-based chord recognition\n",
" with major and minor triads (and possibly nonchord)\n",
"\n",
" Notebook: C5/C5S2_ChordRec_Templates.ipynb\n",
"\n",
" Args:\n",
" X (np.ndarray): Chromagram\n",
" norm_sim (str): Specifies norm used for normalizing chord similarity matrix (Default value = '1')\n",
" nonchord (bool): If \"True\" then add nonchord template (Default value = False)\n",
"\n",
" Returns:\n",
" chord_sim (np.ndarray): Chord similarity matrix\n",
" chord_max (np.ndarray): Binarized chord similarity matrix only containing maximizing chord\n",
" \"\"\"\n",
" chord_templates = generate_chord_templates(nonchord=nonchord)\n",
" X_norm = libfmp.c3.normalize_feature_sequence(X, norm='2')\n",
" chord_templates_norm = libfmp.c3.normalize_feature_sequence(chord_templates, norm='2')\n",
" chord_sim = np.matmul(chord_templates_norm.T, X_norm)\n",
" if norm_sim is not None:\n",
" chord_sim = libfmp.c3.normalize_feature_sequence(chord_sim, norm=norm_sim)\n",
" # chord_max = (chord_sim == chord_sim.max(axis=0)).astype(int)\n",
" chord_max_index = np.argmax(chord_sim, axis=0)\n",
" chord_max = np.zeros(chord_sim.shape).astype(np.int32)\n",
" for n in range(chord_sim.shape[1]):\n",
" chord_max[chord_max_index[n], n] = 1\n",
"\n",
" return chord_sim, chord_max\n",
"\n",
"# Chord recognition\n",
"X = X_STFT\n",
"chord_sim, chord_max = chord_recognition_template(X, norm_sim='max')\n",
"chord_labels = get_chord_labels(nonchord=False)\n",
"\n",
"# Plot\n",
"cmap = libfmp.b.compressed_gray_cmap(alpha=1, reverse=False)\n",
"fig, ax = plt.subplots(4, 2, gridspec_kw={'width_ratios': [1, 0.03], \n",
" 'height_ratios': [1.5, 3, 3, 0.3]}, figsize=(8, 10))\n",
"libfmp.b.plot_chromagram(X, ax=[ax[0,0], ax[0,1]], Fs=Fs_X, clim=[0, 1], xlabel='',\n",
" title='STFT-based chromagram (feature rate = %0.1f Hz)' % (Fs_X))\n",
"#libfmp.b.plot_segments_overlay(ann, ax=ax[0,0], time_max=x_dur,\n",
"# print_labels=False, colors=color_ann, alpha=0.1)\n",
"\n",
"libfmp.b.plot_matrix(chord_sim, ax=[ax[1, 0], ax[1, 1]], Fs=Fs_X, \n",
" title='Timechord representation of chord similarity matrix',\n",
" ylabel='Chord', xlabel='')\n",
"ax[1, 0].set_yticks(np.arange( len(chord_labels) ))\n",
"ax[1, 0].set_yticklabels(chord_labels)\n",
"#libfmp.b.plot_segments_overlay(ann, ax=ax[1, 0], time_max=x_dur,\n",
"# print_labels=False, colors=color_ann, alpha=0.1)\n",
"\n",
"libfmp.b.plot_matrix(chord_max, ax=[ax[2, 0], ax[2, 1]], Fs=Fs_X, \n",
" title='Timechord representation of chord recognition result',\n",
" ylabel='Chord', xlabel='')\n",
"ax[2, 0].set_yticks(np.arange( len(chord_labels) ))\n",
"ax[2, 0].set_yticklabels(chord_labels)\n",
"ax[2, 0].grid()\n",
"#libfmp.b.plot_segments_overlay(ann, ax=ax[2, 0], time_max=x_dur,\n",
"# print_labels=False, colors=color_ann, alpha=0.1)\n",
"\n",
"#libfmp.b.plot_segments(ann, ax=ax[3, 0], time_max=x_dur, time_label='Time (seconds)',\n",
"# colors=color_ann, alpha=0.3)\n",
"ax[3, 1].axis('off')\n",
"plt.tight_layout()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"total = np.sum(chord_max, axis=1)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(24, 34)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chord_max.shape"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.1414141414141414"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"14 / (60+39)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[(0, 'A#'),\n",
" (0, 'A#m'),\n",
" (0, 'Am'),\n",
" (0, 'Bm'),\n",
" (0, 'C'),\n",
" (0, 'C#'),\n",
" (0, 'Cm'),\n",
" (0, 'D#'),\n",
" (0, 'D#m'),\n",
" (0, 'Dm'),\n",
" (0, 'Em'),\n",
" (0, 'F'),\n",
" (0, 'Fm'),\n",
" (0, 'G#'),\n",
" (1, 'F#'),\n",
" (1, 'G'),\n",
" (1, 'Gm'),\n",
" (3, 'B'),\n",
" (3, 'D'),\n",
" (3, 'E'),\n",
" (4, 'C#m'),\n",
" (4, 'G#m'),\n",
" (5, 'F#m'),\n",
" (9, 'A')]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sorted([(e2, e1) for e1, e2 in zip(chord_labels, total)])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The chord similarity values shown in the form of a timechord representation indicate for each chroma vector a kind of likelihood for the $24$ possible chords. For example, this visualization shows that the chroma vectors at the beginning of the Beatles song are most similar to the template for the $\\mathrm{C}$ major chord $\\mathbf{C}$. Furthermore, there is also a higher degree of similarity to the templates for $\\mathbf{C}$, $\\mathbf{Em}$, and $\\mathbf{Am}$. Comparing the final chord recognition results with the reference annotation, one can observe that the results obtained from the automated procedure agree with the reference labels for most of the frames. We continue with our discussion of the results in the [FMP notebook on chord recognition evaluation](../C5/C5S2_ChordRec_Eval.html), where we also consider further examples.\n",
"\n",
"We close our Beatles example by looking at the similarity-maximizing chord templates for each frame. This yields a time&dash;chroma representation, which can be compared with the original input chromagram. In a way, the sequence of chord templates may be thought of as a musically informed quantization of the input chroma representation."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x360 with 6 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"chord_templates = generate_chord_templates() \n",
"X_chord = np.matmul(chord_templates, chord_max)\n",
"\n",
"# Plot\n",
"fig, ax = plt.subplots(3, 2, gridspec_kw={'width_ratios': [1, 0.03], \n",
" 'height_ratios': [1, 1, 0.2]}, figsize=(8, 5))\n",
"\n",
"libfmp.b.plot_chromagram(X, ax=[ax[0, 0], ax[0, 1]], Fs=Fs_X, clim=[0, 1], xlabel='',\n",
" title='STFT-based chromagram (feature rate = %0.1f Hz)' % (Fs_X))\n",
"#libfmp.b.plot_segments_overlay(ann, ax=ax[0, 0], time_max=x_dur,\n",
"# print_labels=False, colors=color_ann, alpha=0.1)\n",
"\n",
"libfmp.b.plot_chromagram(X_chord, ax=[ax[1, 0], ax[1, 1]], Fs=Fs_X, clim=[0, 1], xlabel='',\n",
" title='Binary templates of the chord recognition result')\n",
"#libfmp.b.plot_segments_overlay(ann, ax=ax[1, 0], time_max=x_dur,\n",
"# print_labels=False, colors=color_ann, alpha=0.1)\n",
"\n",
"#libfmp.b.plot_segments(ann, ax=ax[2, 0], time_max=x_dur, time_label='Time (seconds)',\n",
"# colors=color_ann, alpha=0.3)\n",
"ax[2,1].axis('off')\n",
"plt.tight_layout()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Further Notes\n",
"\n",
"In this notebook, we have studied the problem of chord recognition with the objective of automatically extracting chord labels from a given music recording. Only considering the $24$ major and minor triads in a simplistic scenario, we introduced a first template-based matching procedure that compares chroma features of the music recording with prototypical chroma templates of the triads. Already with this simple baseline approach, there are many design choices that have a substantial influence on the final chord recognition results. \n",
"\n",
"* In this notebook, we have used **idealized binary chord templates** that indicate the presence or absence of notes in the given chord. For real music recordings, however, the presence of [harmonics](../C1/C1S3_HarmonicSeries.html) and other sound components leads to chroma features where the energy is spread over the chroma bands in a more unstructured, non-binary fashion. This motivates the usage of **chord templates with harmonics**, where the chroma patterns also account for the harmonics of the chord notes.\n",
"\n",
"* Instead of explicitly modeling the harmonics, a conceptually different approach is to **learn** chroma patterns from labeled training data. The input of such a **supervised learning** procedure consists of pairs of a chroma vector and a corresponding chord label. A simple way is then to derive chord templates by suitably averaging chroma vectors that are labeled with the same chord. \n",
"\n",
"* Taking the average templates is a simple way to adapt a template-based chord recognizer to given training data. More involved approaches are often based on statistical models that capture not only the **averages** but also the **variances** in the training data. In such approaches, the templates are replaced by chord models that are specified by, e.g., **Gaussian distributions** given in terms of a mean vector and a covariance matrix. The similarity of a given chroma vector to a chord model is then expressed by a Gaussian probability value and the assigned label is determined by the probability-maximizing chord model. The discussion of such statistical approaches is beyond the scope of these notebooks, and we refer the reader to the overview article by Cho and Bello.\n",
"\n",
"* Besides refining and adapting the chord templates, another general strategy is to modify and enhance the chroma features extracted from the audio recordings to be analyzed. We have already seen at the beginning of this notebook that there are many **chroma variants** with quite different properties. The chroma type used has a strong influence on the chord recognition results, as has been demonstrated by Jiang et al. in their article on **Analyzing Chroma Feature Types for Automated Chord Recognition**.\n",
"\n",
"Some of these components and more elaborate procedures for automated chord recognition are discussed in the subsequent notebooks.\n",
"\n",
"* In the [FMP notebook on chord recognition evaluation](../C5/C5S2_ChordRec_Eval.html), we introduce some evaluation measures and discuss further phenomena and examples.\n",
"* In the [FMP notebook on HMM-based chord recognition](../C5/C5S3_ChordRec_HMM.html), we discuss a chord recognition procedure that applies a context-aware postfiltering technique.\n",
"* In the [FMP notebook on the Beatles collection](../C5/C5S3_ChordRec_Beatles.html), we present a case study that indicates the relevance of various chord recognition components. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class=\"alert\" style=\"background-color:#F5F5F5; border-color:#C8C8C8\">\n",
"<strong>Acknowledgment:</strong> This notebook was created by <a href=\"https://www.audiolabs-erlangen.de/fau/professor/mueller\">Meinard Müller</a> and <a href=\"https://www.audiolabs-erlangen.de/fau/assistant/weiss\">Christof Weiß</a>.\n",
"</div> "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<table style=\"border:none\">\n",
"<tr style=\"border:none\">\n",
" <td style=\"min-width:50px; border:none\" bgcolor=\"white\"><a href=\"../C0/C0.html\"><img src=\"../data/C0_nav.png\" style=\"height:50px\" alt=\"C0\"></a></td>\n",
" <td style=\"min-width:50px; border:none\" bgcolor=\"white\"><a href=\"../C1/C1.html\"><img src=\"../data/C1_nav.png\" style=\"height:50px\" alt=\"C1\"></a></td>\n",
" <td style=\"min-width:50px; border:none\" bgcolor=\"white\"><a href=\"../C2/C2.html\"><img src=\"../data/C2_nav.png\" style=\"height:50px\" alt=\"C2\"></a></td>\n",
" <td style=\"min-width:50px; border:none\" bgcolor=\"white\"><a href=\"../C3/C3.html\"><img src=\"../data/C3_nav.png\" style=\"height:50px\" alt=\"C3\"></a></td>\n",
" <td style=\"min-width:50px; border:none\" bgcolor=\"white\"><a href=\"../C4/C4.html\"><img src=\"../data/C4_nav.png\" style=\"height:50px\" alt=\"C4\"></a></td>\n",
" <td style=\"min-width:50px; border:none\" bgcolor=\"white\"><a href=\"../C5/C5.html\"><img src=\"../data/C5_nav.png\" style=\"height:50px\" alt=\"C5\"></a></td>\n",
" <td style=\"min-width:50px; border:none\" bgcolor=\"white\"><a href=\"../C6/C6.html\"><img src=\"../data/C6_nav.png\" style=\"height:50px\" alt=\"C6\"></a></td>\n",
" <td style=\"min-width:50px; border:none\" bgcolor=\"white\"><a href=\"../C7/C7.html\"><img src=\"../data/C7_nav.png\" style=\"height:50px\" alt=\"C7\"></a></td>\n",
" <td style=\"min-width:50px; border:none\" bgcolor=\"white\"><a href=\"../C8/C8.html\"><img src=\"../data/C8_nav.png\" style=\"height:50px\" alt=\"C8\"></a></td>\n",
"</tr>\n",
"</table>"
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}