-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathabout.html
128 lines (121 loc) · 7.01 KB
/
about.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--
Design by Free CSS Templates
http://www.freecsstemplates.org
Released for free under a Creative Commons Attribution 2.5 License
Name : BlackPolish
Description: A two-column, fixed-width design with dark color scheme.
Version : 1.0
Released : 20121026
-->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="keywords" content="" />
<meta name="description" content="" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Date My Music</title>
<link href='http://fonts.googleapis.com/css?family=Oswald:400,300' rel='stylesheet' type='text/css' />
<link href='http://fonts.googleapis.com/css?family=Abel|Satisfy' rel='stylesheet' type='text/css' />
</head>
<body onselectstart="return false;">
<link rel="stylesheet" type="text/css" href="style.css" media="screen" />
<div id="wrapper">
<div id="header-wrapper">
<div id="header" class="container">
<div id="logo">
<h1><a href="#">Date My Music</a></h1>
</div>
<div id="menu">
<ul>
<li><a href="index.html">Homepage</a></li>
<li class="current_page_item"><a href="about.html">About</a></li>
<li><a href="http://github.com/lemonzi/DateMyMusic">Code</a></li>
<li><a href="http://lemonzi.wordpress.com">Contact</a></li>
</ul>
</div>
</div>
</div>
<!-- end #header -->
<div id="page">
<div class="post">
<h2 class="title"><a href="#">About</a></h2>
<div class="entry">
<p>Do you like improvisations? I once attended a concert in my conservatory by some professors. It wasn't a regular concert, because they were professors of Improvisation. They started playing a Fugue out of a couple of notes somebody sang. Then, a Minuet followed. It was truly amazing.
Now I wonder, would it be possible to automatically extract some metadata from improvisations that could help us understand what happens there? The answer is yes.
Thanks to Peachnote's API and datasets, it is possible to query given chord sequences or melodies in a very huge dataset built by optically recognizing online, publicly availabe sheet music. From this, one can get back in which year, or in which musical works this motifs appear the most, using techniques from Natural Language Processing.
My approach is the following:
<ul>
<li>Take a MIDI polyphonic input from the musician</li>
<li>Try to figure out what chords are being played, given a bunch of notes</li>
<li>Train a lingustic model that summarizes how the musician plays in terms of chord progression and melodic turns</li>
<li>Query the database and check the model against all possible matches to determine what style is the musician closest to</li>
</ul>
All this runs in realtime, and it's pure client-side code :)</p>
</div>
</div>
</div>
<!-- end #page -->
<div id="featured-content">
<div id="column1">
<p><img src="images/midi1.jpg" width="300" height="150" alt="" /></p>
<h2>MIDI input</h2>
<p>The MIDI data is fed to the browser through a Java applet, using a library called MidiBridge. This library fetches data from any MIDI device from the computer, so it's possible to analyze existing MIDI files by playing them back, work with MIDI keyboards or even recognize live music using an audio to MIDI converter.</p>
</div>
<div id="column1">
<p><img src="images/chord.jpg" width="300" height="150" alt="" /></p>
<h2>Chord segmentation</h2>
<p>To segment chords and notes, I've decided to aggregate all notes that are pressed on the keyboard until there is none pressed, and then release all of them together. This makes sense, because it's impossible to press all notes from a chord at the very same time, and in music there are usually short empty intervals in between note or chord changes. Its drawback is that if the musician is playing legato it's very likely that the notes will get mixed together.</p>
</div>
<div id="column2">
<h2>Model building</h2>
<p><img src="images/complex.jpg" width="300" height="150" alt="" /></p>
<p>The model that the Peachnote database uses and that I've adopted for representing the musician style relies on N-gram statistics. It stores all combinations of successive events (notes or chords) that have been played, but instead of recording them separately -which would take an enormous amount of memory- only stores the histogram of it. Every time a new chord comes in, the model is updated and a popularity chart is revised, which always holds the most popular sequences to avoid continuously searching the entire space.</p>
</div>
<div id="column2">
<h2>Corpus caching</h2>
<p><img src="images/complex.jpg" width="300" height="150" alt="" /></p>
<p>To avoid making many queries to the API for each chord that comes in, all queried sequences are stored in a local database, even if they go out of the top chart. There is an associative list that stores a collection of N-gram statistical models, very similar to the one from the musician, indexed by the item we want to identify -in the demo, historical year-. Inside this model there is the histogram, that holds information about all sequences related to the item. A list with all indexed patterns is also maintained to know when to skip the queries.</p>
</div>
<div id="column3">
<h2>Scoring system</h2>
<p><img src="images/img08.jpg" width="300" height="150" alt="" /></p>
<p>Whenever the top chart from the musician model changes, all patterns on it are matched against the models of all the available items. The metric is still to be defined.</p>
</div>
</div>
</div>
<div id="footer-content-wrapper">
<div id="footer-content">
<div id="fbox1">
<h2>API's and libraries</h2>
<ul class="style1">
<li class="first"><a href="http://peachnote.com">Peachnote.com</a></li>
<li><a href="https://github.com/abudaan/midibridge">MidiBridge</a></li>
</ul>
</div>
<div id="fbox2">
<h2>Tools</h2>
<ul class="style1">
<li class="first"><a href="#">Brackets</a></li>
<li><a href="http://github.com">Github</a></li>
<li><a href="http://google.com/chrome">Google Chrome</a></li>
<li><a href="http://docs.python.org/2/library/simplehttpserver.html">Python's SimpleHTTPServer</a></li>
</ul>
</div>
<!--<div id="fbox3">
<h2>Maecenas luctus lectus</h2>
<ul class="style1">
<li class="first"><a href="#">Maecenas luctus lectus at sapien</a></li>
<li><a href="#">Etiam rhoncus volutpat erat</a></li>
<li><a href="#">Etiam posuere augue sit amet nisl</a></li>
<li><a href="#">Mauris vulputate dolor sit amet nibh</a></li>
<li><a href="#">Etiam posuere augue sit amet nisl</a></li>
</ul>
</div>-->
</div>
</div>
<div id="footer">
<p>Copyright (c) 2012 Sitename.com. All rights reserved. Images by <a href="http://fotogrph.com/">Fotogrph</a>. Design by <a href="http://www.freecsstemplates.org">FCT</a>.</p>
</div>
<!-- end #footer -->
</body>
</html>