diff --git a/base.mid b/base.mid new file mode 100644 index 00000000..9717282a Binary files /dev/null and b/base.mid differ diff --git a/build.bat b/build.bat new file mode 100644 index 00000000..3a85cc91 --- /dev/null +++ b/build.bat @@ -0,0 +1 @@ +browserify main.js -o bundle.js diff --git a/bundle.js b/bundle.js new file mode 100644 index 00000000..176fca0b --- /dev/null +++ b/bundle.js @@ -0,0 +1,1047 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i { + var content = new Uint8Array(readerEvent.target.result); + var midiData = parseMidi(content); + console.log(midiData); + + var mergedTrack = []; + var originalOrder = 0; + for (var i=0; i b.startTime) { return 1; } + if(a.originalOrder < b.originalOrder) { return -1; } + if(a.originalOrder > b.originalOrder) { return 1; } + return 0; + }) + + document.getElementById("piano").checked = false; + document.getElementById("strings").checked = false; + document.getElementById("winds").checked = false; + document.getElementById("drums").checked = false; + document.getElementById("harp").checked = false; + document.getElementById("guitar").checked = false; + document.getElementById("bass").checked = false; + + var encoded = ""; + var currentInsts = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; + for (var i=0; i 0) { + var waitTime = timeLeftToWait > 128 ? 128 : timeLeftToWait; + var token = 3968 + waitTime - 1; + encoded += token + " "; + timeLeftToWait -= waitTime; + } + + if (event.type == "programChange") { + currentInsts[event.channel] = event.programNumber; + } + var currentInst = currentInsts[event.channel]; + var inst; + var baseNoteOn; + var baseNoteOff; + var checkboxID; + if ([40,41,44,45,48,49,50,51].indexOf(currentInst) > -1) { + inst = "violin"; + baseNoteOn = 14*128; + baseNoteOff = 15*128; + checkboxID = "strings"; + } else if ([42,43].indexOf(currentInst) > -1) { + inst = "cello"; + baseNoteOn = 16*128; + baseNoteOff = 17*128; + checkboxID = "strings"; + } else if ([32,33,34,35,36,37,38,39].indexOf(currentInst) > -1) { + inst = "bass"; + baseNoteOn = 18*128; + baseNoteOff = 19*128; + checkboxID = "bass"; + } else if ([24,25,26,27,28,29,30,31].indexOf(currentInst) > -1) { + inst = "guitar"; + baseNoteOn = 20*128; + baseNoteOff = 21*128; + checkboxID = "guitar"; + } else if ([72,73,74,75,76,77,78,79].indexOf(currentInst) > -1) { + inst = "flute"; + baseNoteOn = 22*128; + baseNoteOff = 23*128; + checkboxID = "winds"; + } else if ([64,65,66,67,68,69,70,71].indexOf(currentInst) > -1) { + inst = "clarinet"; + baseNoteOn = 24*128; + baseNoteOff = 25*128; + checkboxID = "winds"; + } else if ([56,57,58,59,60,61,62,63].indexOf(currentInst) > -1) { + inst = "trumpet"; + baseNoteOn = 26*128; + baseNoteOff = 27*128; + checkboxID = "winds"; + } else if ([46].indexOf(currentInst) > -1) { + inst = "harp"; + baseNoteOn = 28*128; + baseNoteOff = 29*128; + checkboxID = "harp"; + } else { + inst = "piano"; + baseNoteOn = 8*128; + baseNoteOff = 0*128; + checkboxID = "piano"; + } + + if (event.channel == 9) { + inst = "drum"; + baseNoteOn = 3840; + baseNoteOff = null; + checkboxID = "drums"; + } + if (event.type == "noteOff" || (event.type == "noteOn" && event.velocity==0)) { + if (baseNoteOff !== null) { + token = baseNoteOff + event.noteNumber; + encoded += token + " "; + } + } else if (event.type == "noteOn" && event.velocity > 0) { + token = baseNoteOn + event.noteNumber; + encoded += token + " "; + document.getElementById(checkboxID).checked = true; + } + } + + document.getElementById("inbox").value = encoded.trim(); + window.encodingToMidiFile(document.getElementById("inbox").value, "download_inbox"); + } +} + +var ding = new Audio('chord.wav'); +ding.volume = 0.1; + +window.extend = function() { + document.getElementById("button").disabled = true; + document.getElementById("loader-inner").style.animation = "progress 60s linear both"; + var genreList = ["chopin","mozart","rachmaninoff","ladygaga","country","disney","jazz","bach","beethoven","journey","thebeatles","video","broadway","franksinatra","bluegrass","tchaikovsky","liszt","everything","ragtime","andrehazes","cocciante","thecranberries","ligabue","metallica","traffic","philcollins","nineinchnails","thepretenders","sugarray","grandfunkrailroad","ron","ellington","fleetwoodmac","thebeachboys","kool & the gang","foreigner","tlc","scottjames","benfoldsfive","smashmouth","oasis","allsaints","donnasummer","weezer","bjork","mariahcarey","berte","cheaptrick","caroleking","thecars","gganderson","robertpalmer","zucchero","alicecooper","vanhalen","brucehornsby","coolio","jimmybuffett","lobo","badcompany","eminem","creedenceclearwaterrevival","deeppurple","shearinggeorge","robbiewilliams","dalla","ub40","lindaronstadt","sinatra","inxs","jonimitchell","michaeljackson","last","devo","shaniatwain","korn","brooksgarth","sweet","thewho","roxette","bowiedavid","beegees","renefroger","mina","estefangloria","mccartney","theventures","carboni","simplyred","santana","jewel","meatloaf","giorgia","nofx","rickymartin","thecure","thetemptations","tozzi","beck","eiffel65","jenniferlopez","reelbigfish","patsycline","richardcliff","styx","acdc","brucespringsteen","michaelgeorge","blondie","pinkfloyd","oldfieldmike","redhotchilipeppers","therollingstones","morandi","heart","robertaflack","pantera","alabama","jethrotull","hanson","mosch","ludwigvanbeethoven","dvorak","chrisrea","guns n' roses","duranduran","ericclapton","bettemidler","bwitched","gordonlightfoot","thegrassroots","chicago","whitezombie","michaelbolton","paulsimon","marillion","thepointersisters","theanimals","cher","haydn","aerosmith","supertramp","littleriverband","america","tonyorlando","tompetty","thecorrs","aliceinchains","kiss","prince","toto","vanmorrison","wagner","cashjohnny","annielennox","enya","thedoobiebrothers","thetragicallyhip","rush","laurapausini","stevemillerband","simonandgarfunkel","fiorellamannoia","olivianewton-john","carlysimon","elvispresley","vangelis","bobdylan","bbking","vengaboys","paoli","thehollies","alainsouchon","pooh","raf","fiorello","lionelrichie","jimihendrix","theeverlybrothers","limpbizkit","donhenley","georgeharrison","threedognight","johnmellencamp","carpenters","raycharles","basie","billyocean","scorpions","royorbison","whitneyhouston","ironmaiden","jovanotti","alanjackson","barrymanilow","hueylewis","kennyloggins","chopinfrederic","talkingheads","themonkees","rem","jeanmicheljarre","michelezarrillo","eurythmics","thedoors","guesswho","miller","thefourseasons","matiabazar","tompettyandtheheartbreakers","chickcorea","scottjoplin","amedeominghi","bryanadams","paulaabdul","rossivasco","billyjoel","daniele","claudedebussy","gilbert & sullivan","chakakhan","nirvana","garbage","andreabocelli","johnnyrivers","emerson, lake & palmer","theallmanbrothersband","zappa","boston","mango","barbrastreisand","willsmith","ozzyosbourne","janetjackson","antonellovenditti","u2","humperdinckengelbert","jamiroquai","zero","chuckberry","spicegirls","ledzeppelin","masini","thekinks","eagles","billyidol","alanismorissette","joecocker","jimcroce","bobmarley","blacksabbath","stonetemplepilots","silverchair","paulmccartney","blur","nek","greenday","thepolice","depechemode","rageagainstthemachine","madonna","rogerskenny","brooks & dunn","883","thedrifters","amygrant","herman","toriamos","eltonjohn","britneyspears","lennykravitz","celentano","ringostarr","neildiamond","aqua","oscarpeterson","joejackson","moby","collinsphil","leosayer","takethat","electriclightorchestra","pearljam","marcanthony","borodin","petshopboys","stevienicks","hollybuddy","turnertina","annaoxa","zztop","sting","themoodyblues","ruggeri","creed","claudebolling","renzoarbore","erasure","elviscostello","airsupply","tinaturner","leali","petergabriel","nodoubt","bread","huey lewis & the news","brandy","level42","radiohead","georgebenson","wonderstevie","thesmashingpumpkins","cyndilauper","rodstewart","bush","ramazzotti","bobseger","theshadows","gershwin","cream","biagioantonacci","steviewonder","nomadi","direstraits","davidbowie","amostori","thealanparsonsproject","johnlennon","crosbystillsnashandyoung","battiato","kansas","clementi","richielionel","yes","brassensgeorges","steelydan","jacksonmichael","buddyholly","earthwindandfire","natkingcole","therascals","bonjovi","alanparsons","backstreetboys","glencampbell","howardcarpendale","thesupremes","villagepeople","blink-182","jacksonbrowne","sade","lynyrdskynyrd","foofighters","2unlimited","battisti","hall & oates","stansfieldlisa","genesis","boyzone","theoffspring","tomjones","davematthewsband","johnelton","neilyoung","dionnewarwick","aceofbase","marilynmanson","taylorjames","rkelly","grandi","sublime","edvardgrieg","tool","bachjohannsebastian","patbenatar","celinedion","queen","soundgarden","abba","drdre","defleppard","dominofats","realmccoy","natalieimbruglia","hole","spinners","arethafranklin","reospeedwagon","indian","movie","scottish","irish","african","taylorswift","shakira","blues","latin","katyperry","world","kpop","africandrum","michaelbuble","rihanna","gospel","beyonce","chinese","arabic","adele","kellyclarkson","theeagles","handel","rachmaninov","schumann","christmas","dance","punk","natl_anthem","brahms","rap","ravel","burgmueller","other","schubert","granados","albeniz","mendelssohn","debussy","grieg","moszkowski","godowsky","folk","mussorgsky","kids","balakirev","hymns","verdi","hummel","deleted","delibes","saint-saens","puccini","satie","offenbach","widor","songs","stravinsky","vivaldi","gurlitt","alkan","weber","strauss","traditional","rossini","mahler","soler","sousa","telemann","busoni","scarlatti","stamitz","classical","jstrauss2","gabrieli","nielsen","purcell","donizetti","kuhlau","gounod","gibbons","weiss","faure","holst","spohr","monteverdi","reger","bizet","elgar","czerny","sullivan","shostakovich","franck","rubinstein","albrechtsberger","paganini","diabelli","gottschalk","wieniawski","lully","morley","sibelius","scriabin","heller","thalberg","dowland","carulli","pachelbel","sor","marcello","ketterer","rimsky-korsakov","ascher","bruckner","janequin","anonymous","kreutzer","sanz","joplin","susato","giuliani","lassus","palestrina","smetana","berlioz","couperin","gomolka","daquin","herz","campion","walthew","pergolesi","reicha","polak","holborne","hassler","corelli","cato","azzaiolo","anerio","gastoldi","goudimel","dussek","prez","cimarosa","byrd","praetorius","rameau","khachaturian","machaut","gade","perosi","gorzanis","smith","haberbier","carr","marais","glazunov","guerrero","cabanilles","losy","roman","hasse","sammartini","blow","zipoli","duvernoy","aguado","cherubini","victoria","field","andersen","poulenc","d'aragona","lemire","krakowa","maier","rimini","encina","banchieri","best","galilei","warhorse","gypsy","soundtrack","encore","roblaidlow","nationalanthems","benjyshelton","ongcmu","crosbystillsnashyoung","smashingpumpkins","aaaaaaaaaaa","alanismorrisette","animenz","onedirection","nintendo","disneythemes","gunsnroses","rollingstones","juliancasablancas","abdelmoinealfa","berckmansdeoliveira","moviethemes","beachboys","davemathews","videogamethemes","moabberckmansdeoliveira","unknown","cameronleesimpson","johannsebastianbach","thecarpenters","elo","nightwish","blink182","emersonlakeandpalmer","tvthemes"]; + var genre = document.getElementById("genre").value; + if (genre == "") { + genre = genreList[Math.floor(Math.random()*genreList.length)]; + } + fetch("https://musenet.openai.com/sample", { + "method": "POST", + "headers": { + "Content-Type": "application/json" + }, + "body": JSON.stringify({ + "genre": genre, + "instrument":{ + "piano": document.getElementById("piano").checked, + "strings": document.getElementById("strings").checked, + "winds": document.getElementById("winds").checked, + "drums": document.getElementById("drums").checked, + "harp": document.getElementById("harp").checked, + "guitar": document.getElementById("guitar").checked, + "bass": document.getElementById("bass").checked + }, + "encoding":document.getElementById("inbox").value, + "temperature":parseFloat(document.getElementById("temperature").value), + "truncation":parseFloat(document.getElementById("truncation").value), + "generationLength":parseFloat(document.getElementById("generationLength").value), + "audioFormat": document.getElementById("format").value + }) + }).then(res => res.json()).then(function (response) { + window.oldDuration = Math.min(document.getElementById('sound1').duration, + document.getElementById('sound2').duration, + document.getElementById('sound3').duration, + document.getElementById('sound4').duration); + window.oldDuration -= 5; + if (isNaN(oldDuration) || !isFinite(oldDuration) || oldDuration < 0) { + oldDuration = 0; + } + //need to convert from dataURI to blob to avoid firefox issue + var format = "audio/mp3"; + var audioKey = "audioFile"; + if (response.completions[0].oggFile) { + format = "audio/ogg"; + audioKey = "oggFile"; + } + document.getElementById('sound1').src=URL.createObjectURL(new Blob([convertDataURIToBinary("data:"+format+";base64,"+response.completions[0][audioKey].substring(2,response.completions[0][audioKey].length-1))], {type : format})); + document.getElementById('sound2').src=URL.createObjectURL(new Blob([convertDataURIToBinary("data:"+format+";base64,"+response.completions[1][audioKey].substring(2,response.completions[1][audioKey].length-1))], {type : format})); + document.getElementById('sound3').src=URL.createObjectURL(new Blob([convertDataURIToBinary("data:"+format+";base64,"+response.completions[2][audioKey].substring(2,response.completions[2][audioKey].length-1))], {type : format})); + document.getElementById('sound4').src=URL.createObjectURL(new Blob([convertDataURIToBinary("data:"+format+";base64,"+response.completions[3][audioKey].substring(2,response.completions[3][audioKey].length-1))], {type : format})); + document.getElementById("outbox1").value = response.completions[0].encoding; + document.getElementById("outbox2").value = response.completions[1].encoding; + document.getElementById("outbox3").value = response.completions[2].encoding; + document.getElementById("outbox4").value = response.completions[3].encoding; + window.encodingToMidiFile(response.completions[0].encoding, "download_outbox1"); + window.encodingToMidiFile(response.completions[1].encoding, "download_outbox2"); + window.encodingToMidiFile(response.completions[2].encoding, "download_outbox3"); + window.encodingToMidiFile(response.completions[3].encoding, "download_outbox4"); + document.getElementById('sound1').currentTime = oldDuration; + document.getElementById('sound2').currentTime = oldDuration; + document.getElementById('sound3').currentTime = oldDuration; + document.getElementById('sound4').currentTime = oldDuration; + ding.play(); + document.getElementById("button").disabled = false; + document.getElementById("loader-inner").style.animation = "none"; + }).catch(error => { + ding.play(); + document.getElementById("button").disabled = false; + document.getElementById("loader-inner").style.animation = "none"; + alert(error); + }); +} + +function convertDataURIToBinary(dataURI) { + var BASE64_MARKER = ';base64,'; + var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length; + var base64 = dataURI.substring(base64Index); + var raw = window.atob(base64); + var rawLength = raw.length; + var array = new Uint8Array(new ArrayBuffer(rawLength)); + + for(i = 0; i < rawLength; i++) { + array[i] = raw.charCodeAt(i); + } + return array; +} + +window.oldDuration = 0; + +window.encodingToMidiFile = function(encoding, outlink) { + var midiData = { + header: { + "format": 1, + "numTracks": 10, + "ticksPerBeat": 48 + }, + tracks: [[{"deltaTime":0,"channel":0,"type":"programChange","programNumber":0}], + [{"deltaTime":0,"channel":1,"type":"programChange","programNumber":40}], + [{"deltaTime":0,"channel":2,"type":"programChange","programNumber":42}], + [{"deltaTime":0,"channel":3,"type":"programChange","programNumber":32}], + [{"deltaTime":0,"channel":4,"type":"programChange","programNumber":24}], + [{"deltaTime":0,"channel":5,"type":"programChange","programNumber":73}], + [{"deltaTime":0,"channel":6,"type":"programChange","programNumber":71}], + [{"deltaTime":0,"channel":7,"type":"programChange","programNumber":56}], + [{"deltaTime":0,"channel":8,"type":"programChange","programNumber":46}], + [{"deltaTime":0,"channel":9,"type":"programChange","programNumber":0}]] + }; + + var tokens = encoding.trim().split(" "); + + var deltaTimes = [0,0,0,0,0,0,0,0,0,0]; + var usedDrumNotes = new Set(); + for (var i=0; i 0 ? "noteOn" : "noteOff", + "noteNumber": parsedToken.pitch, + "velocity": parsedToken.volume + }); + if (parsedToken.instrument == "drum") { + usedDrumNotes.add(parsedToken.pitch); + } + deltaTimes[trackIndex] = 0; + } else if (parsedToken.type == "wait") { + for (var j=0; j<10; j++) { + deltaTimes[j] += parsedToken.delay; + } + } + } + for (let pitch of usedDrumNotes) { + midiData.tracks[9].push({ + "deltaTime": deltaTimes[9], + "channel": 9, + "type": "noteOff", + "noteNumber": pitch, + "velocity": 0 + }); + deltaTimes[9] = 0; + } + + for (var i=0; i track.length > 2); + + console.log(midiData); + + var midiBlob = new Blob([new Uint8Array(writeMidi(midiData))], {type: "audio/midi"}); + document.getElementById(outlink).href = URL.createObjectURL(midiBlob); + document.getElementById(outlink).target = "_blank"; +} +window.encodingToMidiFile(document.getElementById("inbox").value, "download_inbox"); +window.encodingToMidiFile(document.getElementById("outbox1").value, "download_outbox1"); +window.encodingToMidiFile(document.getElementById("outbox2").value, "download_outbox2"); +window.encodingToMidiFile(document.getElementById("outbox3").value, "download_outbox3"); +window.encodingToMidiFile(document.getElementById("outbox4").value, "download_outbox4"); + +function parseToken(token) { + token = +token; + if (token >= 0 && token < 3840) { + var pitch = token % 128; + var inst_vol_index = token >> 7; + var instrument = ["piano","piano","piano","piano","piano","piano","piano","piano","piano","piano","piano","piano","piano","piano", + "violin","violin","cello","cello","bass","bass","guitar","guitar", + "flute","flute","clarinet","clarinet","trumpet","trumpet","harp","harp"][inst_vol_index]; + var volume = [0,24,32,40,48,56,64,72,80,88,96,104,112,120,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0][inst_vol_index]; + return {"type":"note","pitch":pitch,"instrument":instrument,"volume":volume}; + } else if (token >= 3840 && token < 3968) { + var pitch = token % 128; + return {"type":"note","pitch":pitch,"instrument":"drum","volume":80}; + } else if (token >= 3968 && token < 4096) { + var delay = (token % 128) + 1; + return {"type":"wait","delay":delay} + } else if (token == 4096) { + return {"type":"start"} + } else { + return {"type":"invalid"} + } + +} +},{"midi-file":2}],2:[function(require,module,exports){ +exports.parseMidi = require('./lib/midi-parser') +exports.writeMidi = require('./lib/midi-writer') + +},{"./lib/midi-parser":3,"./lib/midi-writer":4}],3:[function(require,module,exports){ +// data can be any array-like object. It just needs to support .length, .slice, and an element getter [] + +function parseMidi(data) { + var p = new Parser(data) + + var headerChunk = p.readChunk() + if (headerChunk.id != 'MThd') + throw "Bad MIDI file. Expected 'MHdr', got: '" + headerChunk.id + "'" + var header = parseHeader(headerChunk.data) + + var tracks = [] + for (var i=0; !p.eof() && i < header.numTracks; i++) { + var trackChunk = p.readChunk() + if (trackChunk.id != 'MTrk') + throw "Bad MIDI file. Expected 'MTrk', got: '" + trackChunk.id + "'" + var track = parseTrack(trackChunk.data) + tracks.push(track) + } + + return { + header: header, + tracks: tracks + } +} + + +function parseHeader(data) { + var p = new Parser(data) + + var format = p.readUInt16() + var numTracks = p.readUInt16() + + var result = { + format: format, + numTracks: numTracks + } + + var timeDivision = p.readUInt16() + if (timeDivision & 0x8000) { + result.framesPerSecond = 0x100 - (timeDivision >> 8) + result.ticksPerFrame = timeDivision & 0xFF + } else { + result.ticksPerBeat = timeDivision + } + + return result +} + +function parseTrack(data) { + var p = new Parser(data) + + var events = [] + while (!p.eof()) { + var event = readEvent() + events.push(event) + } + + return events + + var lastEventTypeByte = null + + function readEvent() { + var event = {} + event.deltaTime = p.readVarInt() + + var eventTypeByte = p.readUInt8() + + if ((eventTypeByte & 0xf0) === 0xf0) { + // system / meta event + if (eventTypeByte === 0xff) { + // meta event + event.meta = true + var metatypeByte = p.readUInt8() + var length = p.readVarInt() + switch (metatypeByte) { + case 0x00: + event.type = 'sequenceNumber' + if (length !== 2) throw "Expected length for sequenceNumber event is 2, got " + length + event.number = stream.readUInt16() + return event + case 0x01: + event.type = 'text' + event.text = p.readString(length) + return event + case 0x02: + event.type = 'copyrightNotice' + event.text = p.readString(length) + return event + case 0x03: + event.type = 'trackName' + event.text = p.readString(length) + return event + case 0x04: + event.type = 'instrumentName' + event.text = p.readString(length) + return event + case 0x05: + event.type = 'lyrics' + event.text = p.readString(length) + return event + case 0x06: + event.type = 'marker' + event.text = p.readString(length) + return event + case 0x07: + event.type = 'cuePoint' + event.text = p.readString(length) + return event + case 0x20: + event.type = 'channelPrefix' + if (length != 1) throw "Expected length for channelPrefix event is 1, got " + length + event.channel = p.readUInt8() + return event + case 0x21: + event.type = 'portPrefix' + if (length != 1) throw "Expected length for portPrefix event is 1, got " + length + event.port = p.readUInt8() + return event + case 0x2f: + event.type = 'endOfTrack' + if (length != 0) throw "Expected length for endOfTrack event is 0, got " + length + return event + case 0x51: + event.type = 'setTempo'; + if (length != 3) throw "Expected length for setTempo event is 3, got " + length + event.microsecondsPerBeat = p.readUInt24() + return event + case 0x54: + event.type = 'smpteOffset'; + if (length != 5) throw "Expected length for smpteOffset event is 5, got " + length + var hourByte = p.readUInt8() + var FRAME_RATES = { 0x00: 24, 0x20: 25, 0x40: 29, 0x60: 30 } + event.frameRate = FRAME_RATES[hourByte & 0x60] + event.hour = hourByte & 0x1f + event.min = p.readUInt8() + event.sec = p.readUInt8() + event.frame = p.readUInt8() + event.subFrame = p.readUInt8() + return event + case 0x58: + event.type = 'timeSignature' + if (length != 4) throw "Expected length for timeSignature event is 4, got " + length + event.numerator = p.readUInt8() + event.denominator = (1 << p.readUInt8()) + event.metronome = p.readUInt8() + event.thirtyseconds = p.readUInt8() + return event + case 0x59: + event.type = 'keySignature' + if (length != 2) throw "Expected length for keySignature event is 2, got " + length + event.key = p.readInt8() + event.scale = p.readUInt8() + return event + case 0x7f: + event.type = 'sequencerSpecific' + event.data = p.readBytes(length) + return event + default: + event.type = 'unknownMeta' + event.data = p.readBytes(length) + event.metatypeByte = metatypeByte + return event + } + } else if (eventTypeByte == 0xf0) { + event.type = 'sysEx' + var length = p.readVarInt() + event.data = p.readBytes(length) + return event + } else if (eventTypeByte == 0xf7) { + event.type = 'endSysEx' + var length = p.readVarInt() + event.data = p.readBytes(length) + return event + } else { + throw "Unrecognised MIDI event type byte: " + eventTypeByte + } + } else { + // channel event + var param1 + if ((eventTypeByte & 0x80) === 0) { + // running status - reuse lastEventTypeByte as the event type. + // eventTypeByte is actually the first parameter + if (lastEventTypeByte === null) + throw "Running status byte encountered before status byte" + param1 = eventTypeByte + eventTypeByte = lastEventTypeByte + event.running = true + } else { + param1 = p.readUInt8() + lastEventTypeByte = eventTypeByte + } + var eventType = eventTypeByte >> 4 + event.channel = eventTypeByte & 0x0f + switch (eventType) { + case 0x08: + event.type = 'noteOff' + event.noteNumber = param1 + event.velocity = p.readUInt8() + return event + case 0x09: + var velocity = p.readUInt8() + event.type = velocity === 0 ? 'noteOff' : 'noteOn' + event.noteNumber = param1 + event.velocity = velocity + if (velocity === 0) event.byte9 = true + return event + case 0x0a: + event.type = 'noteAftertouch' + event.noteNumber = param1 + event.amount = p.readUInt8() + return event + case 0x0b: + event.type = 'controller' + event.controllerType = param1 + event.value = p.readUInt8() + return event + case 0x0c: + event.type = 'programChange' + event.programNumber = param1 + return event + case 0x0d: + event.type = 'channelAftertouch' + event.amount = param1 + return event + case 0x0e: + event.type = 'pitchBend' + event.value = (param1 + (p.readUInt8() << 7)) - 0x2000 + return event + default: + throw "Unrecognised MIDI event type: " + eventType + } + } + } +} + +function Parser(data) { + this.buffer = data + this.bufferLen = this.buffer.length + this.pos = 0 +} + +Parser.prototype.eof = function() { + return this.pos >= this.bufferLen +} + +Parser.prototype.readUInt8 = function() { + var result = this.buffer[this.pos] + this.pos += 1 + return result +} + +Parser.prototype.readInt8 = function() { + var u = this.readUInt8() + if (u & 0x80) + return u - 0x100 + else + return u +} + +Parser.prototype.readUInt16 = function() { + var b0 = this.readUInt8(), + b1 = this.readUInt8() + + return (b0 << 8) + b1 +} + +Parser.prototype.readInt16 = function() { + var u = this.readUInt16() + if (u & 0x8000) + return u - 0x10000 + else + return u +} + +Parser.prototype.readUInt24 = function() { + var b0 = this.readUInt8(), + b1 = this.readUInt8(), + b2 = this.readUInt8() + + return (b0 << 16) + (b1 << 8) + b2 +} + +Parser.prototype.readInt24 = function() { + var u = this.readUInt24() + if (u & 0x800000) + return u - 0x1000000 + else + return u +} + +Parser.prototype.readUInt32 = function() { + var b0 = this.readUInt8(), + b1 = this.readUInt8(), + b2 = this.readUInt8(), + b3 = this.readUInt8() + + return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3 +} + +Parser.prototype.readBytes = function(len) { + var bytes = this.buffer.slice(this.pos, this.pos + len) + this.pos += len + return bytes +} + +Parser.prototype.readString = function(len) { + var bytes = this.readBytes(len) + return String.fromCharCode.apply(null, bytes) +} + +Parser.prototype.readVarInt = function() { + var result = 0 + while (!this.eof()) { + var b = this.readUInt8() + if (b & 0x80) { + result += (b & 0x7f) + result <<= 7 + } else { + // b is last byte + return result + b + } + } + // premature eof + return result +} + +Parser.prototype.readChunk = function() { + var id = this.readString(4) + var length = this.readUInt32() + var data = this.readBytes(length) + return { + id: id, + length: length, + data: data + } +} + +module.exports = parseMidi + +},{}],4:[function(require,module,exports){ +// data should be the same type of format returned by parseMidi +// for maximum compatibililty, returns an array of byte values, suitable for conversion to Buffer, Uint8Array, etc. + +// opts: +// - running reuse previous eventTypeByte when possible, to compress file +// - useByte9ForNoteOff use 0x09 for noteOff when velocity is zero + +function writeMidi(data, opts) { + if (typeof data !== 'object') + throw 'Invalid MIDI data' + + opts = opts || {} + + var header = data.header || {} + var tracks = data.tracks || [] + var i, len = tracks.length + + var w = new Writer() + writeHeader(w, header, len) + + for (i=0; i < len; i++) { + writeTrack(w, tracks[i], opts) + } + + return w.buffer +} + +function writeHeader(w, header, numTracks) { + var format = header.format == null ? 1 : header.format + + var timeDivision = 128 + if (header.timeDivision) { + timeDivision = header.timeDivision + } else if (header.ticksPerFrame && header.framesPerSecond) { + timeDivision = (-(header.framesPerSecond & 0xFF) << 8) | (ticksPerFrame & 0xFF) + } else if (header.ticksPerBeat) { + timeDivision = header.ticksPerBeat & 0x7FFF + } + + var h = new Writer() + h.writeUInt16(format) + h.writeUInt16(numTracks) + h.writeUInt16(timeDivision) + + w.writeChunk('MThd', h.buffer) +} + +function writeTrack(w, track, opts) { + var t = new Writer() + var i, len = track.length + var eventTypeByte = null + for (i=0; i < len; i++) { + // Reuse last eventTypeByte when opts.running is set, or event.running is explicitly set on it. + // parseMidi will set event.running for each event, so that we can get an exact copy by default. + // Explicitly set opts.running to false, to override event.running and never reuse last eventTypeByte. + if (opts.running === false || !opts.running && !track[i].running) eventTypeByte = null + + eventTypeByte = writeEvent(t, track[i], eventTypeByte, opts.useByte9ForNoteOff) + } + w.writeChunk('MTrk', t.buffer) +} + +function writeEvent(w, event, lastEventTypeByte, useByte9ForNoteOff) { + var type = event.type + var deltaTime = event.deltaTime + var text = event.text || '' + var data = event.data || [] + var eventTypeByte = null + w.writeVarInt(deltaTime) + + switch (type) { + // meta events + case 'sequenceNumber': + w.writeUInt8(0xFF) + w.writeUInt8(0x00) + w.writeVarInt(2) + w.writeUInt16(event.number) + break; + + case 'text': + w.writeUInt8(0xFF) + w.writeUInt8(0x01) + w.writeVarInt(text.length) + w.writeString(text) + break; + + case 'copyrightNotice': + w.writeUInt8(0xFF) + w.writeUInt8(0x02) + w.writeVarInt(text.length) + w.writeString(text) + break; + + case 'trackName': + w.writeUInt8(0xFF) + w.writeUInt8(0x03) + w.writeVarInt(text.length) + w.writeString(text) + break; + + case 'instrumentName': + w.writeUInt8(0xFF) + w.writeUInt8(0x04) + w.writeVarInt(text.length) + w.writeString(text) + break; + + case 'lyrics': + w.writeUInt8(0xFF) + w.writeUInt8(0x05) + w.writeVarInt(text.length) + w.writeString(text) + break; + + case 'marker': + w.writeUInt8(0xFF) + w.writeUInt8(0x06) + w.writeVarInt(text.length) + w.writeString(text) + break; + + case 'cuePoint': + w.writeUInt8(0xFF) + w.writeUInt8(0x07) + w.writeVarInt(text.length) + w.writeString(text) + break; + + case 'channelPrefix': + w.writeUInt8(0xFF) + w.writeUInt8(0x20) + w.writeVarInt(1) + w.writeUInt8(event.channel) + break; + + case 'portPrefix': + w.writeUInt8(0xFF) + w.writeUInt8(0x21) + w.writeVarInt(1) + w.writeUInt8(event.port) + break; + + case 'endOfTrack': + w.writeUInt8(0xFF) + w.writeUInt8(0x2F) + w.writeVarInt(0) + break; + + case 'setTempo': + w.writeUInt8(0xFF) + w.writeUInt8(0x51) + w.writeVarInt(3) + w.writeUInt24(event.microsecondsPerBeat) + break; + + case 'smpteOffset': + w.writeUInt8(0xFF) + w.writeUInt8(0x54) + w.writeVarInt(5) + var FRAME_RATES = { 24: 0x00, 25: 0x20, 29: 0x40, 30: 0x60 } + var hourByte = (event.hour & 0x1F) | FRAME_RATES[event.frameRate] + w.writeUInt8(hourByte) + w.writeUInt8(event.min) + w.writeUInt8(event.sec) + w.writeUInt8(event.frame) + w.writeUInt8(event.subFrame) + break; + + case 'timeSignature': + w.writeUInt8(0xFF) + w.writeUInt8(0x58) + w.writeVarInt(4) + w.writeUInt8(event.numerator) + var denominator = Math.floor((Math.log(event.denominator) / Math.LN2)) & 0xFF + w.writeUInt8(denominator) + w.writeUInt8(event.metronome) + w.writeUInt8(event.thirtyseconds || 8) + break; + + case 'keySignature': + w.writeUInt8(0xFF) + w.writeUInt8(0x59) + w.writeVarInt(2) + w.writeInt8(event.key) + w.writeUInt8(event.scale) + break; + + case 'sequencerSpecific': + w.writeUInt8(0xFF) + w.writeUInt8(0x7F) + w.writeVarInt(data.length) + w.writeBytes(data) + break; + + case 'unknownMeta': + if (event.metatypeByte != null) { + w.writeUInt8(0xFF) + w.writeUInt8(event.metatypeByte) + w.writeVarInt(data.length) + w.writeBytes(data) + } + break; + + // system-exclusive + case 'sysEx': + w.writeUInt8(0xF0) + w.writeVarInt(data.length) + w.writeBytes(data) + break; + + case 'endSysEx': + w.writeUInt8(0xF7) + w.writeVarInt(data.length) + w.writeBytes(data) + break; + + // channel events + case 'noteOff': + // Use 0x90 when opts.useByte9ForNoteOff is set and velocity is zero, or when event.byte9 is explicitly set on it. + // parseMidi will set event.byte9 for each event, so that we can get an exact copy by default. + // Explicitly set opts.useByte9ForNoteOff to false, to override event.byte9 and always use 0x80 for noteOff events. + var noteByte = ((useByte9ForNoteOff !== false && event.byte9) || (useByte9ForNoteOff && event.velocity == 0)) ? 0x90 : 0x80 + + eventTypeByte = noteByte | event.channel + if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte) + w.writeUInt8(event.noteNumber) + w.writeUInt8(event.velocity) + break; + + case 'noteOn': + eventTypeByte = 0x90 | event.channel + if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte) + w.writeUInt8(event.noteNumber) + w.writeUInt8(event.velocity) + break; + + case 'noteAftertouch': + eventTypeByte = 0xA0 | event.channel + if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte) + w.writeUInt8(event.noteNumber) + w.writeUInt8(event.amount) + break; + + case 'controller': + eventTypeByte = 0xB0 | event.channel + if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte) + w.writeUInt8(event.controllerType) + w.writeUInt8(event.value) + break; + + case 'programChange': + eventTypeByte = 0xC0 | event.channel + if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte) + w.writeUInt8(event.programNumber) + break; + + case 'channelAftertouch': + eventTypeByte = 0xD0 | event.channel + if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte) + w.writeUInt8(event.amount) + break; + + case 'pitchBend': + eventTypeByte = 0xE0 | event.channel + if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte) + var value14 = 0x2000 + event.value + var lsb14 = (value14 & 0x7F) + var msb14 = (value14 >> 7) & 0x7F + w.writeUInt8(lsb14) + w.writeUInt8(msb14) + break; + + default: + throw 'Unrecognized event type: ' + type + } + return eventTypeByte +} + + +function Writer() { + this.buffer = [] +} + +Writer.prototype.writeUInt8 = function(v) { + this.buffer.push(v & 0xFF) +} +Writer.prototype.writeInt8 = Writer.prototype.writeUInt8 + +Writer.prototype.writeUInt16 = function(v) { + var b0 = (v >> 8) & 0xFF, + b1 = v & 0xFF + + this.writeUInt8(b0) + this.writeUInt8(b1) +} +Writer.prototype.writeInt16 = Writer.prototype.writeUInt16 + +Writer.prototype.writeUInt24 = function(v) { + var b0 = (v >> 16) & 0xFF, + b1 = (v >> 8) & 0xFF, + b2 = v & 0xFF + + this.writeUInt8(b0) + this.writeUInt8(b1) + this.writeUInt8(b2) +} +Writer.prototype.writeInt24 = Writer.prototype.writeUInt24 + +Writer.prototype.writeUInt32 = function(v) { + var b0 = (v >> 24) & 0xFF, + b1 = (v >> 16) & 0xFF, + b2 = (v >> 8) & 0xFF, + b3 = v & 0xFF + + this.writeUInt8(b0) + this.writeUInt8(b1) + this.writeUInt8(b2) + this.writeUInt8(b3) +} +Writer.prototype.writeInt32 = Writer.prototype.writeUInt32 + + +Writer.prototype.writeBytes = function(arr) { + this.buffer = this.buffer.concat(Array.prototype.slice.call(arr, 0)) +} + +Writer.prototype.writeString = function(str) { + var i, len = str.length, arr = [] + for (i=0; i < len; i++) { + arr.push(str.codePointAt(i)) + } + this.writeBytes(arr) +} + +Writer.prototype.writeVarInt = function(v) { + if (v < 0) throw "Cannot write negative variable-length integer" + + if (v <= 0x7F) { + this.writeUInt8(v) + } else { + var i = v + var bytes = [] + bytes.push(i & 0x7F) + i >>= 7 + while (i) { + var b = i & 0x7F | 0x80 + bytes.push(b) + i >>= 7 + } + this.writeBytes(bytes.reverse()) + } +} + +Writer.prototype.writeChunk = function(id, data) { + this.writeString(id) + this.writeUInt32(data.length) + this.writeBytes(data) +} + +module.exports = writeMidi + +},{}]},{},[1]); diff --git a/chord.wav b/chord.wav new file mode 100644 index 00000000..0193a116 Binary files /dev/null and b/chord.wav differ diff --git a/index.html b/index.html new file mode 100644 index 00000000..592f93c1 --- /dev/null +++ b/index.html @@ -0,0 +1,687 @@ + + + + Project Adam By AIX + + + +

+ + Import Midi - Export Midi - Base Midi | AIX Project Adam - Mendax Enterprises LLC + +

+

+ Genre: +   +   +   +   +   +   +   +   + Temperature:   + Truncation:   + Generation Length:   + Preview: +   +   + +

+

+ + + export midiexport midiexport midiexport midi + +

+ + + + diff --git a/main.js b/main.js new file mode 100644 index 00000000..aaaf4b24 --- /dev/null +++ b/main.js @@ -0,0 +1,339 @@ +var parseMidi = require('midi-file').parseMidi; +var writeMidi = require('midi-file').writeMidi; + +var inst_to_track = {"piano":0,"violin":1,"cello":2,"bass":3,"guitar":4,"flute":5,"clarinet":6,"trumpet":7,"harp":8,"drum":9}; + +window.copyup = function(elemid) { + document.getElementById("inbox").value = document.getElementById(elemid).value.trim(); + window.encodingToMidiFile(document.getElementById("inbox").value, "download_inbox"); +} + +window.importMidi = function() { + alert("For best results, assign different tracks to different instruments out of Piano, Violin, Cello, Bass, Guitar, Flute, Clarinet, Trumpet, Harp, and Drums.\n" + + "The base MIDI linked to the right is already set up with these tracks.\n"); + javascript:document.getElementById('file-input').click(); +} +window.importMidiFile = function(file) { + var reader = new FileReader(); + reader.readAsArrayBuffer(file); + window.file = file; + + reader.onload = readerEvent => { + var content = new Uint8Array(readerEvent.target.result); + var midiData = parseMidi(content); + console.log(midiData); + + var mergedTrack = []; + var originalOrder = 0; + for (var i=0; i b.startTime) { return 1; } + if(a.originalOrder < b.originalOrder) { return -1; } + if(a.originalOrder > b.originalOrder) { return 1; } + return 0; + }) + + document.getElementById("piano").checked = false; + document.getElementById("strings").checked = false; + document.getElementById("winds").checked = false; + document.getElementById("drums").checked = false; + document.getElementById("harp").checked = false; + document.getElementById("guitar").checked = false; + document.getElementById("bass").checked = false; + + var encoded = ""; + var currentInsts = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; + for (var i=0; i 0) { + var waitTime = timeLeftToWait > 128 ? 128 : timeLeftToWait; + var token = 3968 + waitTime - 1; + encoded += token + " "; + timeLeftToWait -= waitTime; + } + + if (event.type == "programChange") { + currentInsts[event.channel] = event.programNumber; + } + var currentInst = currentInsts[event.channel]; + var inst; + var baseNoteOn; + var baseNoteOff; + var checkboxID; + if ([40,41,44,45,48,49,50,51].indexOf(currentInst) > -1) { + inst = "violin"; + baseNoteOn = 14*128; + baseNoteOff = 15*128; + checkboxID = "strings"; + } else if ([42,43].indexOf(currentInst) > -1) { + inst = "cello"; + baseNoteOn = 16*128; + baseNoteOff = 17*128; + checkboxID = "strings"; + } else if ([32,33,34,35,36,37,38,39].indexOf(currentInst) > -1) { + inst = "bass"; + baseNoteOn = 18*128; + baseNoteOff = 19*128; + checkboxID = "bass"; + } else if ([24,25,26,27,28,29,30,31].indexOf(currentInst) > -1) { + inst = "guitar"; + baseNoteOn = 20*128; + baseNoteOff = 21*128; + checkboxID = "guitar"; + } else if ([72,73,74,75,76,77,78,79].indexOf(currentInst) > -1) { + inst = "flute"; + baseNoteOn = 22*128; + baseNoteOff = 23*128; + checkboxID = "winds"; + } else if ([64,65,66,67,68,69,70,71].indexOf(currentInst) > -1) { + inst = "clarinet"; + baseNoteOn = 24*128; + baseNoteOff = 25*128; + checkboxID = "winds"; + } else if ([56,57,58,59,60,61,62,63].indexOf(currentInst) > -1) { + inst = "trumpet"; + baseNoteOn = 26*128; + baseNoteOff = 27*128; + checkboxID = "winds"; + } else if ([46].indexOf(currentInst) > -1) { + inst = "harp"; + baseNoteOn = 28*128; + baseNoteOff = 29*128; + checkboxID = "harp"; + } else { + inst = "piano"; + baseNoteOn = 8*128; + baseNoteOff = 0*128; + checkboxID = "piano"; + } + + if (event.channel == 9) { + inst = "drum"; + baseNoteOn = 3840; + baseNoteOff = null; + checkboxID = "drums"; + } + if (event.type == "noteOff" || (event.type == "noteOn" && event.velocity==0)) { + if (baseNoteOff !== null) { + token = baseNoteOff + event.noteNumber; + encoded += token + " "; + } + } else if (event.type == "noteOn" && event.velocity > 0) { + token = baseNoteOn + event.noteNumber; + encoded += token + " "; + document.getElementById(checkboxID).checked = true; + } + } + + document.getElementById("inbox").value = encoded.trim(); + window.encodingToMidiFile(document.getElementById("inbox").value, "download_inbox"); + } +} + +var ding = new Audio('chord.wav'); +ding.volume = 0.1; + +window.extend = function() { + document.getElementById("button").disabled = true; + document.getElementById("loader-inner").style.animation = "progress 60s linear both"; + var genreList = ["chopin","mozart","rachmaninoff","ladygaga","country","disney","jazz","bach","beethoven","journey","thebeatles","video","broadway","franksinatra","bluegrass","tchaikovsky","liszt","everything","ragtime","andrehazes","cocciante","thecranberries","ligabue","metallica","traffic","philcollins","nineinchnails","thepretenders","sugarray","grandfunkrailroad","ron","ellington","fleetwoodmac","thebeachboys","kool & the gang","foreigner","tlc","scottjames","benfoldsfive","smashmouth","oasis","allsaints","donnasummer","weezer","bjork","mariahcarey","berte","cheaptrick","caroleking","thecars","gganderson","robertpalmer","zucchero","alicecooper","vanhalen","brucehornsby","coolio","jimmybuffett","lobo","badcompany","eminem","creedenceclearwaterrevival","deeppurple","shearinggeorge","robbiewilliams","dalla","ub40","lindaronstadt","sinatra","inxs","jonimitchell","michaeljackson","last","devo","shaniatwain","korn","brooksgarth","sweet","thewho","roxette","bowiedavid","beegees","renefroger","mina","estefangloria","mccartney","theventures","carboni","simplyred","santana","jewel","meatloaf","giorgia","nofx","rickymartin","thecure","thetemptations","tozzi","beck","eiffel65","jenniferlopez","reelbigfish","patsycline","richardcliff","styx","acdc","brucespringsteen","michaelgeorge","blondie","pinkfloyd","oldfieldmike","redhotchilipeppers","therollingstones","morandi","heart","robertaflack","pantera","alabama","jethrotull","hanson","mosch","ludwigvanbeethoven","dvorak","chrisrea","guns n' roses","duranduran","ericclapton","bettemidler","bwitched","gordonlightfoot","thegrassroots","chicago","whitezombie","michaelbolton","paulsimon","marillion","thepointersisters","theanimals","cher","haydn","aerosmith","supertramp","littleriverband","america","tonyorlando","tompetty","thecorrs","aliceinchains","kiss","prince","toto","vanmorrison","wagner","cashjohnny","annielennox","enya","thedoobiebrothers","thetragicallyhip","rush","laurapausini","stevemillerband","simonandgarfunkel","fiorellamannoia","olivianewton-john","carlysimon","elvispresley","vangelis","bobdylan","bbking","vengaboys","paoli","thehollies","alainsouchon","pooh","raf","fiorello","lionelrichie","jimihendrix","theeverlybrothers","limpbizkit","donhenley","georgeharrison","threedognight","johnmellencamp","carpenters","raycharles","basie","billyocean","scorpions","royorbison","whitneyhouston","ironmaiden","jovanotti","alanjackson","barrymanilow","hueylewis","kennyloggins","chopinfrederic","talkingheads","themonkees","rem","jeanmicheljarre","michelezarrillo","eurythmics","thedoors","guesswho","miller","thefourseasons","matiabazar","tompettyandtheheartbreakers","chickcorea","scottjoplin","amedeominghi","bryanadams","paulaabdul","rossivasco","billyjoel","daniele","claudedebussy","gilbert & sullivan","chakakhan","nirvana","garbage","andreabocelli","johnnyrivers","emerson, lake & palmer","theallmanbrothersband","zappa","boston","mango","barbrastreisand","willsmith","ozzyosbourne","janetjackson","antonellovenditti","u2","humperdinckengelbert","jamiroquai","zero","chuckberry","spicegirls","ledzeppelin","masini","thekinks","eagles","billyidol","alanismorissette","joecocker","jimcroce","bobmarley","blacksabbath","stonetemplepilots","silverchair","paulmccartney","blur","nek","greenday","thepolice","depechemode","rageagainstthemachine","madonna","rogerskenny","brooks & dunn","883","thedrifters","amygrant","herman","toriamos","eltonjohn","britneyspears","lennykravitz","celentano","ringostarr","neildiamond","aqua","oscarpeterson","joejackson","moby","collinsphil","leosayer","takethat","electriclightorchestra","pearljam","marcanthony","borodin","petshopboys","stevienicks","hollybuddy","turnertina","annaoxa","zztop","sting","themoodyblues","ruggeri","creed","claudebolling","renzoarbore","erasure","elviscostello","airsupply","tinaturner","leali","petergabriel","nodoubt","bread","huey lewis & the news","brandy","level42","radiohead","georgebenson","wonderstevie","thesmashingpumpkins","cyndilauper","rodstewart","bush","ramazzotti","bobseger","theshadows","gershwin","cream","biagioantonacci","steviewonder","nomadi","direstraits","davidbowie","amostori","thealanparsonsproject","johnlennon","crosbystillsnashandyoung","battiato","kansas","clementi","richielionel","yes","brassensgeorges","steelydan","jacksonmichael","buddyholly","earthwindandfire","natkingcole","therascals","bonjovi","alanparsons","backstreetboys","glencampbell","howardcarpendale","thesupremes","villagepeople","blink-182","jacksonbrowne","sade","lynyrdskynyrd","foofighters","2unlimited","battisti","hall & oates","stansfieldlisa","genesis","boyzone","theoffspring","tomjones","davematthewsband","johnelton","neilyoung","dionnewarwick","aceofbase","marilynmanson","taylorjames","rkelly","grandi","sublime","edvardgrieg","tool","bachjohannsebastian","patbenatar","celinedion","queen","soundgarden","abba","drdre","defleppard","dominofats","realmccoy","natalieimbruglia","hole","spinners","arethafranklin","reospeedwagon","indian","movie","scottish","irish","african","taylorswift","shakira","blues","latin","katyperry","world","kpop","africandrum","michaelbuble","rihanna","gospel","beyonce","chinese","arabic","adele","kellyclarkson","theeagles","handel","rachmaninov","schumann","christmas","dance","punk","natl_anthem","brahms","rap","ravel","burgmueller","other","schubert","granados","albeniz","mendelssohn","debussy","grieg","moszkowski","godowsky","folk","mussorgsky","kids","balakirev","hymns","verdi","hummel","deleted","delibes","saint-saens","puccini","satie","offenbach","widor","songs","stravinsky","vivaldi","gurlitt","alkan","weber","strauss","traditional","rossini","mahler","soler","sousa","telemann","busoni","scarlatti","stamitz","classical","jstrauss2","gabrieli","nielsen","purcell","donizetti","kuhlau","gounod","gibbons","weiss","faure","holst","spohr","monteverdi","reger","bizet","elgar","czerny","sullivan","shostakovich","franck","rubinstein","albrechtsberger","paganini","diabelli","gottschalk","wieniawski","lully","morley","sibelius","scriabin","heller","thalberg","dowland","carulli","pachelbel","sor","marcello","ketterer","rimsky-korsakov","ascher","bruckner","janequin","anonymous","kreutzer","sanz","joplin","susato","giuliani","lassus","palestrina","smetana","berlioz","couperin","gomolka","daquin","herz","campion","walthew","pergolesi","reicha","polak","holborne","hassler","corelli","cato","azzaiolo","anerio","gastoldi","goudimel","dussek","prez","cimarosa","byrd","praetorius","rameau","khachaturian","machaut","gade","perosi","gorzanis","smith","haberbier","carr","marais","glazunov","guerrero","cabanilles","losy","roman","hasse","sammartini","blow","zipoli","duvernoy","aguado","cherubini","victoria","field","andersen","poulenc","d'aragona","lemire","krakowa","maier","rimini","encina","banchieri","best","galilei","warhorse","gypsy","soundtrack","encore","roblaidlow","nationalanthems","benjyshelton","ongcmu","crosbystillsnashyoung","smashingpumpkins","aaaaaaaaaaa","alanismorrisette","animenz","onedirection","nintendo","disneythemes","gunsnroses","rollingstones","juliancasablancas","abdelmoinealfa","berckmansdeoliveira","moviethemes","beachboys","davemathews","videogamethemes","moabberckmansdeoliveira","unknown","cameronleesimpson","johannsebastianbach","thecarpenters","elo","nightwish","blink182","emersonlakeandpalmer","tvthemes"]; + var genre = document.getElementById("genre").value; + if (genre == "") { + genre = genreList[Math.floor(Math.random()*genreList.length)]; + } + fetch("https://musenet.openai.com/sample", { + "method": "POST", + "headers": { + "Content-Type": "application/json" + }, + "body": JSON.stringify({ + "genre": genre, + "instrument":{ + "piano": document.getElementById("piano").checked, + "strings": document.getElementById("strings").checked, + "winds": document.getElementById("winds").checked, + "drums": document.getElementById("drums").checked, + "harp": document.getElementById("harp").checked, + "guitar": document.getElementById("guitar").checked, + "bass": document.getElementById("bass").checked + }, + "encoding":document.getElementById("inbox").value, + "temperature":parseFloat(document.getElementById("temperature").value), + "truncation":parseFloat(document.getElementById("truncation").value), + "generationLength":parseFloat(document.getElementById("generationLength").value), + "audioFormat": document.getElementById("format").value + }) + }).then(res => res.json()).then(function (response) { + window.oldDuration = Math.min(document.getElementById('sound1').duration, + document.getElementById('sound2').duration, + document.getElementById('sound3').duration, + document.getElementById('sound4').duration); + window.oldDuration -= 5; + if (isNaN(oldDuration) || !isFinite(oldDuration) || oldDuration < 0) { + oldDuration = 0; + } + //need to convert from dataURI to blob to avoid firefox issue + var format = "audio/mp3"; + var audioKey = "audioFile"; + if (response.completions[0].oggFile) { + format = "audio/ogg"; + audioKey = "oggFile"; + } + document.getElementById('sound1').src=URL.createObjectURL(new Blob([convertDataURIToBinary("data:"+format+";base64,"+response.completions[0][audioKey].substring(2,response.completions[0][audioKey].length-1))], {type : format})); + document.getElementById('sound2').src=URL.createObjectURL(new Blob([convertDataURIToBinary("data:"+format+";base64,"+response.completions[1][audioKey].substring(2,response.completions[1][audioKey].length-1))], {type : format})); + document.getElementById('sound3').src=URL.createObjectURL(new Blob([convertDataURIToBinary("data:"+format+";base64,"+response.completions[2][audioKey].substring(2,response.completions[2][audioKey].length-1))], {type : format})); + document.getElementById('sound4').src=URL.createObjectURL(new Blob([convertDataURIToBinary("data:"+format+";base64,"+response.completions[3][audioKey].substring(2,response.completions[3][audioKey].length-1))], {type : format})); + document.getElementById("outbox1").value = response.completions[0].encoding; + document.getElementById("outbox2").value = response.completions[1].encoding; + document.getElementById("outbox3").value = response.completions[2].encoding; + document.getElementById("outbox4").value = response.completions[3].encoding; + window.encodingToMidiFile(response.completions[0].encoding, "download_outbox1"); + window.encodingToMidiFile(response.completions[1].encoding, "download_outbox2"); + window.encodingToMidiFile(response.completions[2].encoding, "download_outbox3"); + window.encodingToMidiFile(response.completions[3].encoding, "download_outbox4"); + document.getElementById('sound1').currentTime = oldDuration; + document.getElementById('sound2').currentTime = oldDuration; + document.getElementById('sound3').currentTime = oldDuration; + document.getElementById('sound4').currentTime = oldDuration; + ding.play(); + document.getElementById("button").disabled = false; + document.getElementById("loader-inner").style.animation = "none"; + }).catch(error => { + ding.play(); + document.getElementById("button").disabled = false; + document.getElementById("loader-inner").style.animation = "none"; + alert(error); + }); +} + +function convertDataURIToBinary(dataURI) { + var BASE64_MARKER = ';base64,'; + var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length; + var base64 = dataURI.substring(base64Index); + var raw = window.atob(base64); + var rawLength = raw.length; + var array = new Uint8Array(new ArrayBuffer(rawLength)); + + for(i = 0; i < rawLength; i++) { + array[i] = raw.charCodeAt(i); + } + return array; +} + +window.oldDuration = 0; + +window.encodingToMidiFile = function(encoding, outlink) { + var midiData = { + header: { + "format": 1, + "numTracks": 10, + "ticksPerBeat": 48 + }, + tracks: [[{"deltaTime":0,"channel":0,"type":"programChange","programNumber":0}], + [{"deltaTime":0,"channel":1,"type":"programChange","programNumber":40}], + [{"deltaTime":0,"channel":2,"type":"programChange","programNumber":42}], + [{"deltaTime":0,"channel":3,"type":"programChange","programNumber":32}], + [{"deltaTime":0,"channel":4,"type":"programChange","programNumber":24}], + [{"deltaTime":0,"channel":5,"type":"programChange","programNumber":73}], + [{"deltaTime":0,"channel":6,"type":"programChange","programNumber":71}], + [{"deltaTime":0,"channel":7,"type":"programChange","programNumber":56}], + [{"deltaTime":0,"channel":8,"type":"programChange","programNumber":46}], + [{"deltaTime":0,"channel":9,"type":"programChange","programNumber":0}]] + }; + + var tokens = encoding.trim().split(" "); + + var deltaTimes = [0,0,0,0,0,0,0,0,0,0]; + var usedDrumNotes = new Set(); + for (var i=0; i 0 ? "noteOn" : "noteOff", + "noteNumber": parsedToken.pitch, + "velocity": parsedToken.volume + }); + if (parsedToken.instrument == "drum") { + usedDrumNotes.add(parsedToken.pitch); + } + deltaTimes[trackIndex] = 0; + } else if (parsedToken.type == "wait") { + for (var j=0; j<10; j++) { + deltaTimes[j] += parsedToken.delay; + } + } + } + for (let pitch of usedDrumNotes) { + midiData.tracks[9].push({ + "deltaTime": deltaTimes[9], + "channel": 9, + "type": "noteOff", + "noteNumber": pitch, + "velocity": 0 + }); + deltaTimes[9] = 0; + } + + for (var i=0; i track.length > 2); + + console.log(midiData); + + var midiBlob = new Blob([new Uint8Array(writeMidi(midiData))], {type: "audio/midi"}); + document.getElementById(outlink).href = URL.createObjectURL(midiBlob); + document.getElementById(outlink).target = "_blank"; +} +window.encodingToMidiFile(document.getElementById("inbox").value, "download_inbox"); +window.encodingToMidiFile(document.getElementById("outbox1").value, "download_outbox1"); +window.encodingToMidiFile(document.getElementById("outbox2").value, "download_outbox2"); +window.encodingToMidiFile(document.getElementById("outbox3").value, "download_outbox3"); +window.encodingToMidiFile(document.getElementById("outbox4").value, "download_outbox4"); + +function parseToken(token) { + token = +token; + if (token >= 0 && token < 3840) { + var pitch = token % 128; + var inst_vol_index = token >> 7; + var instrument = ["piano","piano","piano","piano","piano","piano","piano","piano","piano","piano","piano","piano","piano","piano", + "violin","violin","cello","cello","bass","bass","guitar","guitar", + "flute","flute","clarinet","clarinet","trumpet","trumpet","harp","harp"][inst_vol_index]; + var volume = [0,24,32,40,48,56,64,72,80,88,96,104,112,120,80,0,80,0,80,0,80,0,80,0,80,0,80,0,80,0][inst_vol_index]; + return {"type":"note","pitch":pitch,"instrument":instrument,"volume":volume}; + } else if (token >= 3840 && token < 3968) { + var pitch = token % 128; + return {"type":"note","pitch":pitch,"instrument":"drum","volume":80}; + } else if (token >= 3968 && token < 4096) { + var delay = (token % 128) + 1; + return {"type":"wait","delay":delay} + } else if (token == 4096) { + return {"type":"start"} + } else { + return {"type":"invalid"} + } + +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..bcc2bab4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "midi-file": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/midi-file/-/midi-file-1.1.1.tgz", + "integrity": "sha512-HI6Y/kc9g1Af0OqMkTzI2AeGgPJMONgQcd/13gBf8C9BcUh7wa/AnXR1Fgl8SIuO7GJmFhSIACEWcwiAz2E2Pg==" + } + } +} diff --git a/tokens.txt b/tokens.txt new file mode 100644 index 00000000..0dc373f6 --- /dev/null +++ b/tokens.txt @@ -0,0 +1,768 @@ +4096 +4097 +4098 +4099 drums +4100 winds +4101 winds_drums +4102 harp +4103 harp_drums +4104 harp_winds +4105 harp_winds_drums +4106 guitar +4107 guitar_drums +4108 guitar_winds +4109 guitar_winds_drums +4110 guitar_harp +4111 guitar_harp_drums +4112 guitar_harp_winds +4113 guitar_harp_winds_drums +4114 bass +4115 bass_drums +4116 bass_winds +4117 bass_winds_drums +4118 bass_harp +4119 bass_harp_drums +4120 bass_harp_winds +4121 bass_harp_winds_drums +4122 bass_guitar +4123 bass_guitar_drums +4124 bass_guitar_winds +4125 bass_guitar_winds_drums +4126 bass_guitar_harp +4127 bass_guitar_harp_drums +4128 bass_guitar_harp_winds +4129 bass_guitar_harp_winds_drums +4130 strings +4131 strings_drums +4132 strings_winds +4133 strings_winds_drums +4134 strings_harp +4135 strings_harp_drums +4136 strings_harp_winds +4137 strings_harp_winds_drums +4138 strings_guitar +4139 strings_guitar_drums +4140 strings_guitar_winds +4141 strings_guitar_winds_drums +4142 strings_guitar_harp +4143 strings_guitar_harp_drums +4144 strings_guitar_harp_winds +4145 strings_guitar_harp_winds_drums +4146 strings_bass +4147 strings_bass_drums +4148 strings_bass_winds +4149 strings_bass_winds_drums +4150 strings_bass_harp +4151 strings_bass_harp_drums +4152 strings_bass_harp_winds +4153 strings_bass_harp_winds_drums +4154 strings_bass_guitar +4155 strings_bass_guitar_drums +4156 strings_bass_guitar_winds +4157 strings_bass_guitar_winds_drums +4158 strings_bass_guitar_harp +4159 strings_bass_guitar_harp_drums +4160 strings_bass_guitar_harp_winds +4161 strings_bass_guitar_harp_winds_drums +4162 piano +4163 piano_drums +4164 piano_winds +4165 piano_winds_drums +4166 piano_harp +4167 piano_harp_drums +4168 piano_harp_winds +4169 piano_harp_winds_drums +4170 piano_guitar +4171 piano_guitar_drums +4172 piano_guitar_winds +4173 piano_guitar_winds_drums +4174 piano_guitar_harp +4175 piano_guitar_harp_drums +4176 piano_guitar_harp_winds +4177 piano_guitar_harp_winds_drums +4178 piano_bass +4179 piano_bass_drums +4180 piano_bass_winds +4181 piano_bass_winds_drums +4182 piano_bass_harp +4183 piano_bass_harp_drums +4184 piano_bass_harp_winds +4185 piano_bass_harp_winds_drums +4186 piano_bass_guitar +4187 piano_bass_guitar_drums +4188 piano_bass_guitar_winds +4189 piano_bass_guitar_winds_drums +4190 piano_bass_guitar_harp +4191 piano_bass_guitar_harp_drums +4192 piano_bass_guitar_harp_winds +4193 piano_bass_guitar_harp_winds_drums +4194 piano_strings +4195 piano_strings_drums +4196 piano_strings_winds +4197 piano_strings_winds_drums +4198 piano_strings_harp +4199 piano_strings_harp_drums +4200 piano_strings_harp_winds +4201 piano_strings_harp_winds_drums +4202 piano_strings_guitar +4203 piano_strings_guitar_drums +4204 piano_strings_guitar_winds +4205 piano_strings_guitar_winds_drums +4206 piano_strings_guitar_harp +4207 piano_strings_guitar_harp_drums +4208 piano_strings_guitar_harp_winds +4209 piano_strings_guitar_harp_winds_drums +4210 piano_strings_bass +4211 piano_strings_bass_drums +4212 piano_strings_bass_winds +4213 piano_strings_bass_winds_drums +4214 piano_strings_bass_harp +4215 piano_strings_bass_harp_drums +4216 piano_strings_bass_harp_winds +4217 piano_strings_bass_harp_winds_drums +4218 piano_strings_bass_guitar +4219 piano_strings_bass_guitar_drums +4220 piano_strings_bass_guitar_winds +4221 piano_strings_bass_guitar_winds_drums +4222 piano_strings_bass_guitar_harp +4223 piano_strings_bass_guitar_harp_drums +4224 piano_strings_bass_guitar_harp_winds +4225 piano_strings_bass_guitar_harp_winds_drums +4226 chopin +4227 liszt +4228 everything +4229 broadway +4230 rachmaninoff +4231 ragtime +4232 andrehazes +4233 cocciante +4234 thecranberries +4235 ligabue +4236 metallica +4237 traffic +4238 philcollins +4239 nineinchnails +4240 thepretenders +4241 sugarray +4242 grandfunkrailroad +4243 ron +4244 ellington +4245 fleetwoodmac +4246 thebeachboys +4247 kool & the gang +4248 foreigner +4249 tlc +4250 scottjames +4251 benfoldsfive +4252 smashmouth +4253 oasis +4254 allsaints +4255 donnasummer +4256 weezer +4257 bjork +4258 mariahcarey +4259 berte +4260 cheaptrick +4261 caroleking +4262 thecars +4263 gganderson +4264 robertpalmer +4265 zucchero +4266 alicecooper +4267 vanhalen +4268 brucehornsby +4269 coolio +4270 jimmybuffett +4271 lobo +4272 badcompany +4273 eminem +4274 creedenceclearwaterrevival +4275 deeppurple +4276 shearinggeorge +4277 robbiewilliams +4278 dalla +4279 ub40 +4280 lindaronstadt +4281 sinatra +4282 inxs +4283 jonimitchell +4284 michaeljackson +4285 last +4286 devo +4287 shaniatwain +4288 korn +4289 brooksgarth +4290 sweet +4291 thewho +4292 roxette +4293 bowiedavid +4294 beegees +4295 renefroger +4296 mina +4297 estefangloria +4298 mccartney +4299 theventures +4300 carboni +4301 simplyred +4302 santana +4303 jewel +4304 meatloaf +4305 giorgia +4306 nofx +4307 rickymartin +4308 thecure +4309 thetemptations +4310 tozzi +4311 beck +4312 eiffel65 +4313 jenniferlopez +4314 reelbigfish +4315 patsycline +4316 richardcliff +4317 styx +4318 acdc +4319 brucespringsteen +4320 michaelgeorge +4321 blondie +4322 pinkfloyd +4323 oldfieldmike +4324 redhotchilipeppers +4325 therollingstones +4326 morandi +4327 heart +4328 robertaflack +4329 pantera +4330 alabama +4331 jethrotull +4332 hanson +4333 mosch +4334 ludwigvanbeethoven +4335 dvorak +4336 chrisrea +4337 guns n' roses +4338 duranduran +4339 ericclapton +4340 bettemidler +4341 bwitched +4342 gordonlightfoot +4343 thegrassroots +4344 chicago +4345 whitezombie +4346 michaelbolton +4347 paulsimon +4348 marillion +4349 thepointersisters +4350 theanimals +4351 cher +4352 haydn +4353 aerosmith +4354 supertramp +4355 littleriverband +4356 america +4357 tonyorlando +4358 tompetty +4359 thecorrs +4360 aliceinchains +4361 kiss +4362 prince +4363 toto +4364 vanmorrison +4365 wagner +4366 cashjohnny +4367 annielennox +4368 enya +4369 thedoobiebrothers +4370 thetragicallyhip +4371 rush +4372 laurapausini +4373 stevemillerband +4374 simonandgarfunkel +4375 fiorellamannoia +4376 olivianewton-john +4377 carlysimon +4378 elvispresley +4379 vangelis +4380 bobdylan +4381 bbking +4382 vengaboys +4383 paoli +4384 thehollies +4385 alainsouchon +4386 pooh +4387 raf +4388 fiorello +4389 lionelrichie +4390 jimihendrix +4391 theeverlybrothers +4392 limpbizkit +4393 donhenley +4394 georgeharrison +4395 threedognight +4396 johnmellencamp +4397 carpenters +4398 raycharles +4399 basie +4400 billyocean +4401 scorpions +4402 royorbison +4403 whitneyhouston +4404 ironmaiden +4405 jovanotti +4406 journey +4407 alanjackson +4408 barrymanilow +4409 hueylewis +4410 kennyloggins +4411 chopinfrederic +4412 talkingheads +4413 themonkees +4414 rem +4415 jeanmicheljarre +4416 michelezarrillo +4417 eurythmics +4418 thedoors +4419 guesswho +4420 miller +4421 thefourseasons +4422 matiabazar +4423 tompettyandtheheartbreakers +4424 chickcorea +4425 scottjoplin +4426 amedeominghi +4427 bryanadams +4428 paulaabdul +4429 rossivasco +4430 billyjoel +4431 daniele +4432 claudedebussy +4433 gilbert & sullivan +4434 chakakhan +4435 nirvana +4436 garbage +4437 andreabocelli +4438 johnnyrivers +4439 emerson, lake & palmer +4440 theallmanbrothersband +4441 zappa +4442 boston +4443 mango +4444 barbrastreisand +4445 willsmith +4446 ozzyosbourne +4447 janetjackson +4448 antonellovenditti +4449 u2 +4450 humperdinckengelbert +4451 jamiroquai +4452 zero +4453 chuckberry +4454 spicegirls +4455 ledzeppelin +4456 masini +4457 thekinks +4458 eagles +4459 billyidol +4460 alanismorissette +4461 joecocker +4462 jimcroce +4463 bobmarley +4464 blacksabbath +4465 stonetemplepilots +4466 silverchair +4467 paulmccartney +4468 blur +4469 nek +4470 greenday +4471 thepolice +4472 depechemode +4473 rageagainstthemachine +4474 madonna +4475 rogerskenny +4476 brooks & dunn +4477 883 +4478 thedrifters +4479 amygrant +4480 herman +4481 toriamos +4482 eltonjohn +4483 britneyspears +4484 lennykravitz +4485 celentano +4486 ringostarr +4487 neildiamond +4488 aqua +4489 oscarpeterson +4490 joejackson +4491 franksinatra +4492 moby +4493 collinsphil +4494 leosayer +4495 takethat +4496 electriclightorchestra +4497 pearljam +4498 marcanthony +4499 borodin +4500 petshopboys +4501 stevienicks +4502 hollybuddy +4503 turnertina +4504 annaoxa +4505 zztop +4506 sting +4507 themoodyblues +4508 ruggeri +4509 creed +4510 claudebolling +4511 renzoarbore +4512 erasure +4513 elviscostello +4514 airsupply +4515 tinaturner +4516 leali +4517 petergabriel +4518 nodoubt +4519 bread +4520 huey lewis & the news +4521 brandy +4522 level42 +4523 radiohead +4524 georgebenson +4525 wonderstevie +4526 thesmashingpumpkins +4527 cyndilauper +4528 rodstewart +4529 bush +4530 ramazzotti +4531 bobseger +4532 theshadows +4533 gershwin +4534 cream +4535 biagioantonacci +4536 steviewonder +4537 nomadi +4538 direstraits +4539 davidbowie +4540 amostori +4541 thealanparsonsproject +4542 johnlennon +4543 crosbystillsnashandyoung +4544 battiato +4545 kansas +4546 clementi +4547 richielionel +4548 yes +4549 brassensgeorges +4550 steelydan +4551 jacksonmichael +4552 thebeatles +4553 buddyholly +4554 earthwindandfire +4555 natkingcole +4556 therascals +4557 bonjovi +4558 alanparsons +4559 backstreetboys +4560 glencampbell +4561 howardcarpendale +4562 thesupremes +4563 villagepeople +4564 blink-182 +4565 jacksonbrowne +4566 sade +4567 lynyrdskynyrd +4568 foofighters +4569 2unlimited +4570 battisti +4571 hall & oates +4572 stansfieldlisa +4573 genesis +4574 boyzone +4575 theoffspring +4576 tomjones +4577 davematthewsband +4578 johnelton +4579 neilyoung +4580 dionnewarwick +4581 aceofbase +4582 marilynmanson +4583 taylorjames +4584 rkelly +4585 grandi +4586 sublime +4587 edvardgrieg +4588 tool +4589 bachjohannsebastian +4590 patbenatar +4591 celinedion +4592 queen +4593 soundgarden +4594 abba +4595 drdre +4596 defleppard +4597 dominofats +4598 realmccoy +4599 natalieimbruglia +4600 hole +4601 spinners +4602 arethafranklin +4603 reospeedwagon +4604 indian +4605 video +4606 movie +4607 scottish +4608 irish +4609 ladygaga +4610 african +4611 taylorswift +4612 shakira +4613 blues +4614 latin +4615 katyperry +4616 world +4617 kpop +4618 africandrum +4619 michaelbuble +4620 rihanna +4621 gospel +4622 beyonce +4623 chinese +4624 arabic +4625 country +4626 adele +4627 jazz +4628 kellyclarkson +4629 theeagles +4630 mozart +4631 handel +4632 tchaikovsky +4633 rachmaninov +4634 beethoven +4635 schumann +4636 christmas +4637 bach +4638 dance +4639 punk +4640 natl_anthem +4641 brahms +4642 disney +4643 rap +4644 ravel +4645 burgmueller +4646 other +4647 schubert +4648 granados +4649 albeniz +4650 mendelssohn +4651 debussy +4652 grieg +4653 moszkowski +4654 godowsky +4655 folk +4656 mussorgsky +4657 kids +4658 balakirev +4659 hymns +4660 verdi +4661 hummel +4662 deleted +4663 delibes +4664 saint-saens +4665 puccini +4666 satie +4667 offenbach +4668 widor +4669 songs +4670 stravinsky +4671 vivaldi +4672 gurlitt +4673 alkan +4674 weber +4675 strauss +4676 traditional +4677 rossini +4678 mahler +4679 soler +4680 sousa +4681 telemann +4682 busoni +4683 scarlatti +4684 stamitz +4685 classical +4686 jstrauss2 +4687 gabrieli +4688 nielsen +4689 purcell +4690 donizetti +4691 kuhlau +4692 gounod +4693 gibbons +4694 weiss +4695 faure +4696 holst +4697 spohr +4698 monteverdi +4699 reger +4700 bizet +4701 elgar +4702 czerny +4703 sullivan +4704 shostakovich +4705 franck +4706 rubinstein +4707 albrechtsberger +4708 paganini +4709 diabelli +4710 gottschalk +4711 wieniawski +4712 lully +4713 morley +4714 sibelius +4715 scriabin +4716 heller +4717 thalberg +4718 dowland +4719 carulli +4720 pachelbel +4721 sor +4722 marcello +4723 ----- Internal Server Error ----- +4724 ketterer +4725 rimsky-korsakov +4726 ascher +4727 bruckner +4728 janequin +4729 anonymous +4730 kreutzer +4731 sanz +4732 joplin +4733 susato +4734 giuliani +4735 lassus +4736 palestrina +4737 smetana +4738 berlioz +4739 couperin +4740 gomolka +4741 daquin +4742 herz +4743 campion +4744 ----- Internal Server Error ----- +4745 walthew +4746 pergolesi +4747 ----- Internal Server Error ----- +4748 reicha +4749 polak +4750 holborne +4751 hassler +4752 corelli +4753 cato +4754 azzaiolo +4755 anerio +4756 gastoldi +4757 goudimel +4758 dussek +4759 prez +4760 cimarosa +4761 byrd +4762 praetorius +4763 rameau +4764 khachaturian +4765 machaut +4766 gade +4767 perosi +4768 gorzanis +4769 smith +4770 haberbier +4771 carr +4772 marais +4773 glazunov +4774 guerrero +4775 ----- Internal Server Error ----- +4776 cabanilles +4777 losy +4778 roman +4779 hasse +4780 sammartini +4781 blow +4782 zipoli +4783 duvernoy +4784 aguado +4785 cherubini +4786 victoria +4787 field +4788 andersen +4789 ----- Internal Server Error ----- +4790 poulenc +4791 d'aragona +4792 lemire +4793 krakowa +4794 maier +4795 rimini +4796 encina +4797 banchieri +4798 best +4799 galilei +4800 warhorse +4801 gypsy +4802 soundtrack +4803 encore +4804 roblaidlow +4805 nationalanthems +4806 benjyshelton +4807 ongcmu +4808 crosbystillsnashyoung +4809 smashingpumpkins +4810 aaaaaaaaaaa +4811 alanismorrisette +4812 animenz +4813 onedirection +4814 nintendo +4815 disneythemes +4816 gunsnroses +4817 rollingstones +4818 juliancasablancas +4819 abdelmoinealfa +4820 berckmansdeoliveira +4821 moviethemes +4822 beachboys +4823 davemathews +4824 videogamethemes +4825 moabberckmansdeoliveira +4826 bluegrass +4827 unknown +4828 cameronleesimpson +4829 johannsebastianbach +4830 thecarpenters +4831 elo +4832 nightwish +4833 blink182 +4834 emersonlakeandpalmer +4835 tvthemes +4836 ----- Internal Server Error ----- +4837 ----- Internal Server Error ----- +4838 ----- Internal Server Error ----- +4839 ----- Internal Server Error ----- +4840 ----- Internal Server Error ----- +4841 ----- Internal Server Error ----- +4842 ----- Internal Server Error ----- +4843 ----- Internal Server Error ----- +4844 ----- Internal Server Error ----- +4845 ----- Internal Server Error ----- +4846 ----- Internal Server Error ----- +4847 ----- Internal Server Error ----- +4848 ----- Internal Server Error ----- +4849 ----- Internal Server Error ----- +4850 ----- Internal Server Error ----- +4851 ----- Internal Server Error ----- +4852 ----- Internal Server Error ----- +4853 ----- Internal Server Error ----- +4854 ----- Internal Server Error ----- +4855 ----- Internal Server Error ----- +4856 ----- Internal Server Error ----- +4857 ----- Internal Server Error ----- +4858 ----- Internal Server Error ----- +4859 ----- Internal Server Error ----- +4860 ----- Internal Server Error ----- +4861 ----- Internal Server Error ----- +4862 ----- Internal Server Error ----- +4863 ----- Internal Server Error -----