Turing Tarpit - Ecstasy
2019-02-01
We’ve published a new recording in our Soundcloud, a composition inspired by the American actress and inventor Hedy Lamarr. We’ve used the next tracks as sources:
- Audio samples related to Hedy Lamarr, launched randomly by a program written in ChucK programming language.
- Simulation of message encoding using the Frequency-hopping spread spectrum technique, written in ChucK programming language. In this case the message is the trumpet solo. Hedy Lamarr contributed decisively to develop the Frequency-hopping spread spectrum technique, that is still used in current technologies such as Bluetooth or Wi-Fi.
- Guitar + effects improvisation.
- Trumpet improvisation.
Frequency-hopping spread spectrum (FHSS) is a method of transmitting radio signals by rapidly switching a carrier among many frequency channels, using a pseudorandom sequence known to both transmitter and receiver. Hedy Lamarr and composer George Antheil patented in 1942 a “Secret Communication System” that implemented a version of frequency hopping that used a piano-roll to change between 88 frequencies.
Adaptations of the FHSS technique in the ChucK code to get an audible and interesting result:
- Use of audible frequencies (sequences of musical notes).
- Frequency changes every 2 seconds (much faster in real FHSS).
- The ChucK program takes a sample of the signal (the trumpet solo) every 0,5ms.
// ChucK code
// Frequency-Hopping Spread Spectrum simulation
// UGen
SinOsc osc => Chorus ch => Gain g => DelayL d => dac;
// set parameters
30::ms => d.delay;
0.5 => g.gain;
0.5 => ch.mix;
0 => ch.modDepth;
// carrier signals
\[ 261.63, 369.99, 523.25, 739.99, 130.81, 1396.91, 130.81, 1046.50, 43.65, 392.0 \] @=> float freqs\[\];
0 => int iFreqs;
freqs\[iFreqs\] => float myFreq;
// sound buffer
SndBuf mySound;
me.dir() + "/audio/trumpet\_solo.wav" => mySound.read;
// jump = number of samples every 0.5 ms (make sound every 0.5 ms)
(mySound.samples() / (mySound.length() / 0.5::ms)) $ int => int jump;
// change the carrier every 2 seconds
now + 2::second => time freqChange;
// play till the end of message (sound sample)
now + mySound.length() => time end;
while (now <= end)
{
for( 0 => int i; i < mySound.samples(); i+jump => i)
{
// add the message to the carrier and make it audible
Std.fabs(mySound.valueAt(i) \* 50000) + myFreq => osc.freq => ch.modFreq;
0.5::ms => now;
if (now > freqChange)
{
(iFreqs + 1) % 10 => iFreqs;
freqs\[iFreqs\] => myFreq;
now + 2::second => freqChange;
}
}
}