Dear Jos — I missed some of this chain. You and I are working on similar things.
Here are several things that I think might help you: 1) There is a good training setting on the Bach chorales at https://archive.ics.uci.edu/ml/datasets/Bach+Choral+Harmony <https://archive.ics.uci.edu/ml/datasets/Bach+Choral+Harmony>. They’ve got the chord and the notes, which I think was mostly what you seem to be after at the moment. The way they represent temporal information is a little confused. It can be sorted out with some work or it may not be a problem for you. (BTW, if you download their zip, the “.data” file is a “.csv” file and the “.names” file is a “.txt” file.) 2) You spoke below about “distance” between two notes: how C4 and C5 are “close” but C4 B4 are “far”, how C4 and G5 are closer than C4 and F#4. I think you are reaching for the concept of “consonance” which has a long history and a lot of different approaches. The simplest approach is "classical consonance", which is something they teach to first semester music theory students. Here is a short presentation of it: http://rsif.royalsocietypublishing.org/content/5/29/1429 <http://rsif.royalsocietypublishing.org/content/5/29/1429> The most accurate approach (in my opinion) is based on neural synchronization. See http://rsif.royalsocietypublishing.org/content/5/29/1429 <http://rsif.royalsocietypublishing.org/content/5/29/1429>. On 2015-10-08 15:14, Marek Otahal wrote: > On Oct 11, 2015, at 1:18 PM, Jos Theelen <[email protected]> wrote: > > Putting a chord as a sequence of notes is a possibility, but I will first try > to see a chord as one object. In that case the system hopefully learns, which > sequence of chords sounds good and which sounds bad. > > If I understand it correctly, setting learning false means that the TM will > not change. So I could do the following, when I want to find the chords for a > given melody: > > 1) Put a lot of Bach's note-chord combinations in the TM for learning; > 2) set learning false and try a note-chord combination, with a fixed note > (the note from the melody) and a random chord; > 3) look at the anomaly-value of that combination; > 4) is that value low (no anomaly), accept that note-chord combination, add it > to the TM with learning true and restart (2) with the next note of the melody; > 5) is that value high (an anomaly), try a new note-chord combination with > learning false; > > greetings: Jos Theelen > > On 2015-10-10 14:26, cogmission (David Ray) wrote: >> Hi Jos, >> >> I can fill the Temporal Memory with a lot of nice sounding >> note-chord combinations from Bachs chorals. But then I have to find >> a new chord with a given note. How do I do that? >> >> >> What about entering each chord as a sequence of notes. Then "resetting" >> after each chord - entering each note of the chord; resetting then >> entering in the next chord in a song? That way, it will predict a series >> of subsequent notes for each note entered. >> >> But remember, the HTM is not a "creative" entity, it predicts or >> generalizes. A "generalization" can be composed of elements not >> previously combined in a given way, but those individual elements (not >> the combination of them), will always be what it has seen before... AFAIK >> >> And what happens with the Temporal Memory when I do that? Does that >> trying somehow change the Temporal Memory? >> >> >> Once you enter the notes, turn off learning. >> >> On Sat, Oct 10, 2015 at 6:28 AM, Jos Theelen <[email protected] >> <mailto:[email protected]> >> <mailto:[email protected] <mailto:[email protected]>>> wrote: >> >> Yes, I have seen that video. >> >> I hope I can solve the problem before the enddate of the >> HTM-challenge. What I still don't understand is how to get a >> prediction of a chord, when the note is known. I can fill the >> Temporal Memory with a lot of nice sounding note-chord combinations >> from Bachs chorals. But then I have to find a new chord with a given >> note. How do I do that? >> >> Should I just try to put the combination of that note with a random >> chord in the Temporal Memory and look if it is an anomaly? And try >> that for all the possible chords? And pick the chord with the lowest >> anomaly-value? That could be a very slow solution. And what happens >> with the Temporal Memory when I do that? Does that trying somehow >> change the Temporal Memory? >> >> greetings: Jos Theelen >> >> >> On 2015-10-09 20:27, Matthew Taylor wrote: >> >> That is a very interesting problem. I hope you've seen this video >> about music theory with Charlie Gillingham? >> >> https://www.youtube.com/watch?v=tGfDjwSORaw >> <https://www.youtube.com/watch?v=tGfDjwSORaw> >> --------- >> Matt Taylor >> OS Community Flag-Bearer >> Numenta >> >> >> On Fri, Oct 9, 2015 at 11:21 AM, Jos Theelen <[email protected] >> <mailto:[email protected]> >> <mailto:[email protected] <mailto:[email protected]>>> wrote: >> >> That probably means, they used a scalarencoder. But their >> problem was >> different than mine. They had to remember the notes and to >> learn which note >> came after which other note. For me the combination of >> melody and chords >> have to sound "nice". Somehow a system has too learn or >> remember that. >> >> greetings: Jos Theelen >> >> >> On 2015-10-09 17:19, Matthew Taylor wrote: >> >> >> They actually didn't create a NoteEncoder (the codebase >> was much less >> extensible 2.5 years ago). They wrote a preprocessing >> script that >> turned the MIDI song file into a scalar input stream. I >> don't remember the >> details, and their codebase is lost now. But I do >> remember that they >> needed to remove the "rests" from the input. >> >> --------- >> Matt Taylor >> OS Community Flag-Bearer >> Numenta >> >> >> On Fri, Oct 9, 2015 at 3:15 AM, Jos Theelen <[email protected] >> <mailto:[email protected]> >> <mailto:[email protected] <mailto:[email protected]>>> wrote: >> >> >> Yes, I know it and looked at it. I wondered how they >> made a NoteEncoder, >> I >> am still struggling with that. Nupic says that notes >> that are "close" to >> each other should have the most overlapping bits. >> But what is "close" in >> music? >> >> 1) a scalarencoder, where the number of the note is >> encoded. In this case >> "close" means almost the same frequency. >> 2) 2 scalarencoders, one for the note and a >> different one for the octave. >> This because a note sounds almost the same as that >> same note an octave >> lower >> or an octave higher. >> 3) a typical noteencoder and a scalarencoder for the >> octave. The >> noteencoder >> should take the notes in the following cyclical order: >> C,G,D,A,E,.....Es,Bes,F,C, each a quint apart. In >> this case notes that >> are >> close together sound better together. C-G sounds >> better together than >> C-Cis >> >> Probably I should make all 3 encoders, just to test. >> >> greetings: Jos Theelen >> >> On 2015-10-08 15:14, Marek Otahal wrote: >> >> >> >> Hi Jos, >> >> On Thu, Oct 8, 2015 at 3:06 PM, Jos Theelen >> <[email protected] <mailto:[email protected]> >> <mailto:[email protected] <mailto:[email protected]> >> <mailto:[email protected] <mailto:[email protected]>>>> wrote: >> >> I am working on a model, that reads >> melodies and chords from >> midifiles, mainly chorales from JS Bach. >> When the model is given a >> new melody without chords, it should find >> the chords, that sound >> correct, conform what it learned from the >> midifiles. >> >> Nice, I love classical music and music related >> examples :) >> You probably know, but just in case: check out >> nupic.audio project and a >> former hackathon submission that composed song >> on trained MIDI music. >> >> >> greetings: Jos Theelen >> >> No virus found in this message. >> Checked by AVG - www.avg.com <http://www.avg.com/> >> <http://www.avg.com <http://www.avg.com/>> >> <http://www.avg.com <http://www.avg.com/>> >> Version: 2015.0.6140 / Virus Database: >> 4435/10780 - Release Date: >> 10/08/15 >> >> >> >> >> >> >> ----- >> No virus found in this message. >> Checked by AVG - www.avg.com <http://www.avg.com/> >> <http://www.avg.com <http://www.avg.com/>> >> Version: 2015.0.6140 / Virus Database: 4435/10783 - >> Release Date: 10/08/15 >> >> >> >> >> >> >> >> ----- >> No virus found in this message. >> Checked by AVG - www.avg.com <http://www.avg.com/> >> <http://www.avg.com <http://www.avg.com/>> >> Version: 2015.0.6140 / Virus Database: 4435/10790 - Release >> Date: 10/10/15 >> >> >> >> >> >> >> >> -- >> /With kind regards,/ >> David Ray >> Java Solutions Architect >> *Cortical.io <http://cortical.io/ <http://cortical.io/>>* >> Sponsor of: HTM.java <https://github.com/numenta/htm.java >> <https://github.com/numenta/htm.java>> >> [email protected] <mailto:[email protected]> <mailto:[email protected] >> <mailto:[email protected]>> >> http://cortical.io <http://cortical.io/> <http://cortical.io/ >> <http://cortical.io/>> >> >> No virus found in this message. >> Checked by AVG - www.avg.com <http://www.avg.com/> <http://www.avg.com >> <http://www.avg.com/>> >> Version: 2015.0.6140 / Virus Database: 4435/10790 - Release Date: 10/10/15
