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;
    }
  }
}