-
Notifications
You must be signed in to change notification settings - Fork 5
Audio 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)
{
}
Teensy is a PJRC trademark. Notes here are for reference and will typically refer to the ARM variants unless noted.