Audio Example using MQS on Teensy 4.0 or 4.1 - TeensyUser/doc GitHub Wiki

Example using MQS on Teensy 4.0 or 4.1

The Teensy 4.0 and 4.1 have the ability to emit sound using the MQS subsystem. This is similar to the DAC (digital to analog converter) that is available on the Teensy 3.1, 3.2, 3.5, or 3.6.

The MQS pins unfortunately collide with the first SPI pins on the Teensy 4.0 or 4.1 (pins 10 and 12). This means if you want to use SPI devices like displays, you will need to use the second or third SPI buses.

At the time this example was written, the audio tool did not have support for the MQS system. The code in the Teensy library supports it, but you can't use the audio tool to create the patch cables. You need to select I2S and then edit the code afterwards.

/*
  Demo of the audio sweep function.
  The user specifies the amplitude,
  start and end frequencies (which can sweep up or down)
  and the length of time of the sweep.

  Modified to eliminate the audio shield, and use MQS output.  Because of the
  use of fixed pins (10, 12), you probably cannot use the main SPI bus when you
  are using the MQS output.

  Pins:		Teensy 4.0/4.1

  MQSR:		Pin 10
  MQSL:		Pin 12.  */

#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>

// GUItool: begin automatically generated code (edited by meissner afterwards).
AudioSynthToneSweep	tonesweep;		//xy=99,198
AudioMixer4		mixer2;			//xy=280,253
AudioMixer4		mixer1;			//xy=280,175
AudioOutputMQS		mqs;			//xy=452,189

AudioConnection		patchCord1 (tonesweep, 0, mixer1, 0);
AudioConnection		patchCord2 (tonesweep, 0, mixer2, 0);
AudioConnection		patchCord3 (mixer2,    0, mqs,    1);
AudioConnection		patchCord4 (mixer1,    0, mqs,    0);
// GUItool: end automatically generated code

const float	t_ampx	= 0.8;
const int	t_lox	= 10;
const int	t_hix	= 22000;
const float	t_timex	= 10;		// Length of time for the sweep in seconds

// Do a sweep in both directions, enabling or disabling the left/right speakers
void do_sweep (int i)
{
  int do_left  = (i & 1) != 0;
  int do_right = (i & 2) != 0;
  float gain   = (do_left && do_right) ? 0.5f : 1.0f;

  Serial.printf ("Sweep up,   left = %c, right = %c\n",
		 (do_left)  ? 'Y' : 'N',
		 (do_right) ? 'Y' : 'N');

  mixer1.gain (0, do_left  ? gain : 0.0f);
  mixer2.gain (0, do_right ? gain : 0.0f);

  if (!tonesweep.play (t_ampx, t_lox, t_hix, t_timex)) {
    Serial.println ("ToneSweep - play failed");
    while (1)
      ;
  }

  // wait for the sweep to end
  while (tonesweep.isPlaying ())
    ;

  // and now reverse the sweep
  Serial.printf ("Sweep down, left = %c, right = %c\n",
		 (do_left)  ? 'Y' : 'N',
		 (do_right) ? 'Y' : 'N');

  if (!tonesweep.play (t_ampx, t_hix, t_lox, t_timex)) {
    Serial.println("ToneSweep - play failed");
    while (1)
      ;
  }

  // wait for the sweep to end
  while (tonesweep.isPlaying ())
    ;

  Serial.println ("Sweep done");
}

void setup(void)
{
  // Wait for at least 3 seconds for the USB serial connection
  Serial.begin (9600);
  while (!Serial && millis () < 3000)
    ;

  AudioMemory (8);
  Serial.println ("setup done");

  for (int i = 1; i <= 3; i++)
    do_sweep (i);

  Serial.println ("Done");
}

void loop (void)
{
}
⚠️ **GitHub.com Fallback** ⚠️