diff loudness.js @ 793:261d92ea87e1

Automatic Loudness normalisation to -23 LUFS
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Wed, 16 Dec 2015 12:15:18 +0000
parents 7b522c145516
children 8f88db0c38b5
line wrap: on
line diff
--- a/loudness.js	Tue Dec 15 16:02:17 2015 +0000
+++ b/loudness.js	Wed Dec 16 12:15:18 2015 +0000
@@ -6,15 +6,17 @@
  *  multiple objects
  */
 
-function getLoudness(buffer, result, timescale, offlineContext)
+var interval_cal_loudness_event = null;
+
+function calculateLoudness(buffer, timescale, target, offlineContext)
 {
-	// This function returns the EBU R 128 specification loudness model
+	// This function returns the EBU R 128 specification loudness model and sets the linear gain required to match -23 LUFS
 	// buffer -> Web Audio API Buffer object
 	// timescale -> M or Momentary (returns Array), S or Short (returns Array),
 	//   I or Integrated (default, returns number)
+	// target -> default is -23 LUFS but can be any LUFS measurement.
 	
-	// Create the required filters
-	if (buffer == undefined || result == undefined)
+	if (buffer == undefined)
 	{
 		return 0;
 	}
@@ -22,10 +24,15 @@
 	{
 		timescale = "I";
 	}
+	if (target == undefined)
+	{
+		target = -23;
+	}
 	if (offlineContext == undefined)
 	{
 		offlineContext = new OfflineAudioContext(buffer.numberOfChannels, buffer.length, buffer.sampleRate);
 	}
+	// Create the required filters
 	var KFilter = offlineContext.createBiquadFilter();
 	KFilter.type = "highshelf";
 	KFilter.gain.value = 4;
@@ -45,7 +52,6 @@
 	processSource.start();
 	offlineContext.startRendering().then(function(renderedBuffer) {
 		// Have the renderedBuffer information, now continue processing
-		console.log(renderedBuffer);
 		switch(timescale)
 		{
 		case "I":
@@ -87,11 +93,13 @@
 				}
 			}
 			var overallRelLoudness = calculateOverallLoudnessFromChannelBlocks(relgateEnergy);
-			result[0] =  overallRelLoudness;
+			buffer.lufs =  overallRelLoudness;
+			var diff = -23 -overallRelLoudness;
+			buffer.gain = decibelToLinear(diff);
 		}
 	}).catch(function(err) {
 		console.log(err);
-		result[0] = 1;
+		buffer.lufs = 1;
 	});
 }