Skip to content

Instantly share code, notes, and snippets.

@joslloand
Created July 13, 2016 18:09
Show Gist options
  • Save joslloand/e1f70252386b454fb345fe552029df4c to your computer and use it in GitHub Desktop.
Save joslloand/e1f70252386b454fb345fe552029df4c to your computer and use it in GitHub Desktop.
sc3-atk: Testing / Validation for Kernel Encoder & Decoder delay
/*
Testing / Validation for
Update Help to include note on kernel delay #15
Author: J Anderson
*/
"https://github.com/ambisonictoolkit/atk-sc3/issues/15".openOS
/*
Assume testing in NRT using Ctk Quark will provide valid results.
Contents:
- Kernel Decoder test
- Kernel Encoder test
*/
/*
Kernel Decoder test
*/
(
var headerFormat, sampleFormat, sampleRate;
var numChannels, blockSize, duration, outputPath;
var score;
var decoder;
var synth;
var kernelSize, kernelDelay;
var pulseWidth;
// --
// set up output file format & parameters
headerFormat = "WAV";
sampleFormat = "int24";
sampleRate = 44100;
// sampleRate = 48000;
// sampleRate = 88200;
// sampleRate = 96000;
// sampleRate = 176400;
// sampleRate = 192000;
blockSize = 64;
// blockSize = 128;
// blockSize = 256;
numChannels = 4;
duration = 1.0;
outputPath = ("~/Desktop/kernelDelayTestDecode." ++ headerFormat.toLower).standardizePath;
// test parameters
// pulseWidth = 1; // integer number, pulse size = pulseWidth * kernelSize
pulseWidth = 2; // integer number
// --
// define our CtkScore
score = CtkScore.new;
// define a decoder
// test against binaural decoders: -newSpherical, -newListen, -newCIPIC
// NOTE: -newUHJ is linear against M
decoder = FoaDecoderKernel.newSpherical(
sampleRate: sampleRate,
score: score
);
kernelSize = decoder.kernelSize; // samples
kernelDelay = (((kernelSize-1)/2.0) + kernelSize - blockSize); // samples
// display some information
"-------------------------------".postln;
"Decoder kernelSize = % samples\n".postf(kernelSize);
"Decoder kernelDelay = % samples\n".postf(kernelDelay);
"-------------------------------".postln;
"".postln;
// define a CtkSynthDef
synth = CtkSynthDef(\kernelDecodeTest, {arg pulseWidth = 1, phase = 0.0, mul = 1.0;
var freq, delayTime;
var impulse, decode, delay, out;
// calcs
freq = sampleRate/(pulseWidth * kernelSize);
delayTime = (((kernelSize-1)/2.0) + kernelSize - blockSize) / sampleRate;
// generate test impulse
impulse = Impulse.ar(freq, phase, mul);
// delay test impulse
delay = DelayC.ar(impulse, delayTime, delayTime);
// decode test B-format - two channels output
decode = FoaDecode.ar(
Array.with(impulse) ++ Silent.ar(3), // expand impulse
decoder
);
// concatenate test impulse, decode;
out = Array.with(impulse)++ Array.with(delay) ++ decode ;
Out.ar(0, out);
});
// create a synth note and add it to the score
score.add(
synth.note(0.0, duration).pulseWidth_(pulseWidth)
);
// write our score to disk
score.write(
outputPath,
sampleRate: sampleRate,
headerFormat: headerFormat,
sampleFormat: sampleFormat,
options: ServerOptions.new.numOutputBusChannels_(numChannels).blockSize_(blockSize)
);
)
/*
Kernel Encoder test
*/
(
var headerFormat, sampleFormat, sampleRate;
var numChannels, blockSize, duration, outputPath;
var score;
var encoder;
var synth;
var kernelSize, kernelDelay;
var pulseWidth;
// --
// set up output file format & parameters
headerFormat = "WAV";
sampleFormat = "int24";
sampleRate = 44100;
// sampleRate = 48000;
// sampleRate = 88200;
// sampleRate = 96000;
// sampleRate = 176400;
// sampleRate = 192000;
blockSize = 64;
// blockSize = 128;
// blockSize = 256;
kernelSize = 512;
// kernelSize = 1024;
// kernelSize = 2048;
// kernelSize = 4096;
// kernelSize = 8192;
// kernelSize = 16384;
numChannels = 6;
duration = 1.0;
outputPath = ("~/Desktop/kernelDelayTestEncode." ++ headerFormat.toLower).standardizePath;
// test parameters
// pulseWidth = 1; // integer number, pulse size = pulseWidth * kernelSize
pulseWidth = 2; // integer number
// --
// define our CtkScore
score = CtkScore.new;
// define a decoder
// test against mono encoders: -newSpread, -newDiffuse
encoder = FoaEncoderKernel.newSpread(
kernelSize: kernelSize,
sampleRate: sampleRate,
score: score
);
// kernelSize = decoder.kernelSize; // samples
kernelDelay = (((kernelSize-1)/2.0) + kernelSize - blockSize); // samples
// display some information
"-------------------------------".postln;
"Decoder kernelSize = % samples\n".postf(kernelSize);
"Decoder kernelDelay = % samples\n".postf(kernelDelay);
"-------------------------------".postln;
"".postln;
// define a CtkSynthDef
synth = CtkSynthDef(\kernelEncodeTest, {arg pulseWidth = 1, phase = 0.0, mul = 1.0;
var freq, delayTime;
var impulse, encode, delay, out;
// calcs
freq = sampleRate/(pulseWidth * kernelSize);
delayTime = (((kernelSize-1)/2.0) + kernelSize - blockSize) / sampleRate;
// generate test impulse
impulse = Impulse.ar(freq, phase, mul);
// delay test impulse
delay = DelayC.ar(impulse, delayTime, delayTime);
// decode test B-format - two channels output
encode = FoaEncode.ar(
Array.with(impulse),
encoder
);
// concatenate test impulse, decode;
out = Array.with(impulse)++ Array.with(delay) ++ encode ;
Out.ar(0, out);
});
// create a synth note and add it to the score
score.add(
synth.note(0.0, duration).pulseWidth_(pulseWidth)
);
// write our score to disk
score.write(
outputPath,
sampleRate: sampleRate,
headerFormat: headerFormat,
sampleFormat: sampleFormat,
options: ServerOptions.new.numOutputBusChannels_(numChannels).blockSize_(blockSize)
);
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment