| 
					
					
						
							
						
					
					
				 | 
				@ -10,6 +10,11 @@ | 
			
		
		
	
		
			
				 | 
				 | 
				        <title>User Spotify Data</title> | 
				 | 
				 | 
				        <title>User Spotify Data</title> | 
			
		
		
	
		
			
				 | 
				 | 
				        <meta name="description" content=""> | 
				 | 
				 | 
				        <meta name="description" content=""> | 
			
		
		
	
		
			
				 | 
				 | 
				        <meta name="viewport" content="width=device-width, initial-scale=1"> | 
				 | 
				 | 
				        <meta name="viewport" content="width=device-width, initial-scale=1"> | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        <style> | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            .tick { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                font-size: 15px; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				        </style> | 
			
		
		
	
		
			
				 | 
				 | 
				    </head> | 
				 | 
				 | 
				    </head> | 
			
		
		
	
		
			
				 | 
				 | 
				    <body> | 
				 | 
				 | 
				    <body> | 
			
		
		
	
		
			
				 | 
				 | 
				        <!--[if lt IE 7]> | 
				 | 
				 | 
				        <!--[if lt IE 7]> | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -34,8 +39,8 @@ | 
			
		
		
	
		
			
				 | 
				 | 
				             */ | 
				 | 
				 | 
				             */ | 
			
		
		
	
		
			
				 | 
				 | 
				            function drawAudioFeatGraph(audioFeature, intervalEndPoints, parentElem) { | 
				 | 
				 | 
				            function drawAudioFeatGraph(audioFeature, intervalEndPoints, parentElem) { | 
			
		
		
	
		
			
				 | 
				 | 
				                let margin = {top: 20, right: 30, bottom: 30, left: 40}; | 
				 | 
				 | 
				                let margin = {top: 20, right: 30, bottom: 30, left: 40}; | 
			
		
		
	
		
			
				 | 
				 | 
				                let width = 720 - margin.left - margin.right, | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                    height = 420 - margin.top - margin.bottom; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                let width = 480 - margin.left - margin.right, | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    height = 270 - margin.top - margin.bottom; | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				                let featureData = {}; | 
				 | 
				 | 
				                let featureData = {}; | 
			
		
		
	
		
			
				 | 
				 | 
				                // define the vertical scaling function | 
				 | 
				 | 
				                // define the vertical scaling function | 
			
		
		
	
	
		
			
				| 
					
					
					
						
							
						
					
				 | 
				@ -44,29 +49,19 @@ | 
			
		
		
	
		
			
				 | 
				 | 
				                // getAudioFeatureData('instrumentalness', sessionStorage.getItem('user_secret')); | 
				 | 
				 | 
				                // getAudioFeatureData('instrumentalness', sessionStorage.getItem('user_secret')); | 
			
		
		
	
		
			
				 | 
				 | 
				                d3.json(`/audio_features/${audioFeature}/{{ user_secret }}`) | 
				 | 
				 | 
				                d3.json(`/audio_features/${audioFeature}/{{ user_secret }}`) | 
			
		
		
	
		
			
				 | 
				 | 
				                    .then(function(response) { | 
				 | 
				 | 
				                    .then(function(response) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                    // categorize the data points | 
			
		
		
	
		
			
				 | 
				 | 
				                    for (let dataPoint of response.data_points) { | 
				 | 
				 | 
				                    for (let dataPoint of response.data_points) { | 
			
		
		
	
		
			
				 | 
				 | 
				                        dataPoint = parseFloat(dataPoint); | 
				 | 
				 | 
				                        dataPoint = parseFloat(dataPoint); | 
			
		
		
	
		
			
				 | 
				 | 
				                        if (dataPoint > intervalEndPoints[3]) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            if (!featureData.hasOwnProperty(`${intervalEndPoints[3]}-${intervalEndPoints[4]}`)) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                featureData[`${intervalEndPoints[3]}-${intervalEndPoints[4]}`] = 0; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            featureData[`${intervalEndPoints[3]}-${intervalEndPoints[4]}`] += 1; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        } else if (dataPoint > intervalEndPoints[2]) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            if (!featureData.hasOwnProperty(`${intervalEndPoints[2]}-${intervalEndPoints[3]}`)) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                featureData[`${intervalEndPoints[2]}-${intervalEndPoints[3]}`] = 0; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            featureData[`${intervalEndPoints[2]}-${intervalEndPoints[3]}`] += 1; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        } else if (dataPoint > intervalEndPoints[1]) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            if (!featureData.hasOwnProperty(`${intervalEndPoints[1]}-${intervalEndPoints[2]}`)) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                featureData[`${intervalEndPoints[1]}-${intervalEndPoints[2]}`] = 0; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            featureData[`${intervalEndPoints[1]}-${intervalEndPoints[2]}`] += 1; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                        } else { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            if (!featureData.hasOwnProperty(`${intervalEndPoints[0]}-${intervalEndPoints[1]}`)) { | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                                featureData[`${intervalEndPoints[0]}-${intervalEndPoints[1]}`] = 0; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            } | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				                            featureData[`${intervalEndPoints[0]}-${intervalEndPoints[1]}`] += 1; | 
				 | 
				 | 
				 | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        let index = intervalEndPoints.length - 2; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        // find the index of the first element greater than dataPoint | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        while (dataPoint < intervalEndPoints[index]) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                            index -= 1; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        let key = `${intervalEndPoints[index]}-${intervalEndPoints[index + 1]}`; | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        if (!featureData.hasOwnProperty(key)) { | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                            featureData[key] = 0; | 
			
		
		
	
		
			
				 | 
				 | 
				                        } | 
				 | 
				 | 
				                        } | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				                        featureData[key] += 1; | 
			
		
		
	
		
			
				 | 
				 | 
				                    } | 
				 | 
				 | 
				                    } | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				                    let dataSet = Object.values(featureData); | 
				 | 
				 | 
				                    let dataSet = Object.values(featureData); | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
						
							
						
					
					
				 | 
				@ -136,6 +131,7 @@ | 
			
		
		
	
		
			
				 | 
				 | 
				            drawAudioFeatGraph("instrumentalness", [0, 0.25, 0.5, 0.75, 1.0], 'body'); | 
				 | 
				 | 
				            drawAudioFeatGraph("instrumentalness", [0, 0.25, 0.5, 0.75, 1.0], 'body'); | 
			
		
		
	
		
			
				 | 
				 | 
				            drawAudioFeatGraph("valence", [0, 0.25, 0.5, 0.75, 1.0], 'body'); | 
				 | 
				 | 
				            drawAudioFeatGraph("valence", [0, 0.25, 0.5, 0.75, 1.0], 'body'); | 
			
		
		
	
		
			
				 | 
				 | 
				            drawAudioFeatGraph("energy", [0, 0.25, 0.5, 0.75, 1.0], 'body'); | 
				 | 
				 | 
				            drawAudioFeatGraph("energy", [0, 0.25, 0.5, 0.75, 1.0], 'body'); | 
			
		
		
	
		
			
				 | 
				 | 
				 | 
				 | 
				 | 
				            drawAudioFeatGraph("tempo", [40, 80, 120, 160, 200], 'body'); | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
		
			
				 | 
				 | 
				
 | 
				 | 
				 | 
				
 | 
			
		
		
	
	
		
			
				| 
					
						
							
						
					
					
					
				 | 
				
  |