mood prediction works

This commit is contained in:
Thomas Matlak 2017-05-04 22:59:33 -04:00
parent 62ff8dd1f5
commit 861139929e
5 changed files with 80 additions and 13 deletions

View File

@ -14,7 +14,7 @@
# limitations under the License.
#
from predict import generate_midi, predictmood
from predict import generate_midi
import os
from flask import send_file, request
import pretty_midi
@ -25,29 +25,55 @@ else:
from io import StringIO
import time
import json
import mido
import tempfile
from usingMusicNN import predictmood
import numpy as np
from flask import Flask
app = Flask(__name__, static_url_path='', static_folder=os.path.abspath('../static'))
HappyNote = 0
SadNote = 1
def HappyTrack():
track = mido.MidiTrack()
track.append(mido.Message('note_on', note=HappyNote, velocity=3, time=6))
return track
def SadTrack():
track = mido.MidiTrack()
track.append(mido.Message('note_on', note=SadNote, velocity=3, time=6))
return track
@app.route('/predict', methods=['POST'])
def predict():
now = time.time()
values = json.loads(request.data)
midi_data = pretty_midi.PrettyMIDI(StringIO(''.join(chr(v) for v in values)))
print values
duration = float(request.args.get('duration'))
ret_midi = generate_midi(midi_data, duration)
return send_file(ret_midi, attachment_filename='return.mid',
mimetype='audio/midi', as_attachment=True)
@app.route('/getmood', methods=['POST'])
def getmood():
values = json.loads(request.data)
midi_data = pretty_midi.PrettyMIDI(StringIO(''.join(chr(v) for v in values)))
ret_file = predictmood(midi_data)
print ret_file
return send_file(ret_file, attachment_filename='return.json', as_attachment=True)
# Store the received midi file in a temporary file to be able to use it with mido
mfile = tempfile.NamedTemporaryFile()
midi_data.write(mfile)
mfile.seek(0)
midofile = mido.MidiFile(mfile.name)
mood = predictmood(midofile)
print mood
# Add a new track with the first note indicating the mood
midi_to_mod = mido.MidiFile(ret_midi.name)
midi_to_mod.tracks.append(HappyTrack() if mood == 'happy' else SadTrack())
ret_file = tempfile.NamedTemporaryFile()
midi_to_mod.save(ret_file.name)
ret_file.seek(0)
return send_file(ret_file, attachment_filename='return.mid',
mimetype='audio/midi', as_attachment=True)
@app.route('/', methods=['GET', 'POST'])
def index():

View File

@ -63,6 +63,16 @@ class AI extends events.EventEmitter{
this.emit('keyUp', note.midi, note.noteOff + now)
}
})
// We added another track to the midi file that contains data we want to send back to the client
// the first note of this new track is used as a bool value for happy/sad
if (response.tracks[2]['notes'][0]['midi'] === 0) {
console.log('happy')
window.isSad = 0;
}
else if (response.tracks[2]['notes'][0]['midi'] === 1) {
console.log('sad')
window.isSad = 1;
}
})
this._lastPhrase = -1
this.emit('sent')

View File

@ -45,12 +45,30 @@ class Glow {
this._aiVisible = false
this._aiGlow.classList.remove('visible')
this._userGlow.classList.add('visible')
// Update the class of glow to show the correct color
if (window.isSad) {
this._userGlow.classList.add('sad')
this._userGlow.classList.remove('happy')
}
else {
this._userGlow.classList.add('happy')
this._userGlow.classList.remove('sad')
}
}
} else {
if (!this._aiVisible){
this._aiVisible = true
this._aiGlow.classList.add('visible')
this._userGlow.classList.remove('visible')
// Update the class of glow to show the correct color
if (window.isSad) {
this._userGlow.classList.add('sad')
this._userGlow.classList.remove('happy')
}
else {
this._userGlow.classList.add('happy')
this._userGlow.classList.remove('sad')
}
}
}
}

View File

@ -1,4 +1,6 @@
$blue : rgb(30, 183, 235);
$orange : rgb(249, 187, 45);
$green : rgb(0, 225, 0);
$red: rgb(255, 0, 0);
$font-family: 'Quicksand', sans-serif;

View File

@ -15,9 +15,10 @@
}
}
$glowReach : 60%;
/*$glowReach : 60%;*/
$glowReach : 80%;
#ai {
/*#ai {
opacity: 0;
background-image: radial-gradient(ellipse farthest-corner at 50% 0px, $orange 0%, black $glowReach);
}
@ -25,5 +26,15 @@
#user {
opacity: 0;
background-image: radial-gradient(ellipse farthest-corner at 50% 0px, $blue 0%, black $glowReach);
}*/
.happy {
opacity: 0;
background-image: radial-gradient(ellipse farthest-corner at 50% 0px, $green 0%, black $glowReach);
}
.sad {
opacity: 0;
background-image: radial-gradient(ellipse farthest-corner at 50% 0px, $red 0%, black $glowReach);
}
}