Sorry; two truly terribly typos in my post. First, I meant say that https://archive.ics.uci.edu/ml/datasets/Bach+Choral+Harmony <https://archive.ics.uci.edu/ml/datasets/Bach+Choral+Harmony> is a good “training set” using the bach chorales, and second the link on classical consonance was suppose to be: http://www2.siba.fi/muste1/index.php?id=65&la=en <http://www2.siba.fi/muste1/index.php?id=65&la=en>
> On Oct 16, 2015, at 2:38 PM, CHARLES GILLINGHAM <[email protected]> wrote: > > 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] <mailto:[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]> >>> <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 >
