Audio Library

Status
Not open for further replies.
Regarding the "audiophile" board: In most applications in commercial grade engineering for products made with these devices, they are going to be masked . Which is to say they will have thier audio window reduced in context of the mix. That said, 16 bit 44.1 works fine and even the noise of the current audio shield chip disappears into filters I'd put on the signal by default before using it in a mix. I understand the desire to brag specs, but the performance gain vs cost of the " audiophile" version may be only noticeable to those who notice brand of guitar string or drumstick. YMMV.

(for what counts) totally agree - great points !
 
@PaulStoffregen: May I also suggest to extend AudioSynthWaveform by TONE_TYPE_CUSTOM, and a method to set a pointer to a custom waveform to allow wavetable synthesis? I kind of started implementing this already in your library, but I am a bit stuck.

Suggestion for Example:
AudioSynthWaveform wave1;

in Code:
wave1.setSamplePtr(Wave_PPG_Saw_1); // Sample is at &Wave_PPG_Saw_1
wave1.setSampleLength(600); // Single Shot Waves from AKWF have 600 Samples
wave1.begin(0.5,440.0,TONE_TYPE_CUSTOM);

Please tell me if you need some samples to test it. I converted the awesome big
AKFW Free Single Shot Waveform Collection to Headers.

The idea behind making it pointer-based: You can cycle trough waveforms and do a wavetable cycling synthesis.

One sample for testing:
const int saw05_sampleRate = 44100;
const int saw05_length = 600;

const signed char saw05_data[] ={0,
0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6,
6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12,
13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 19, 19, 19,
20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26,
27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 33, 33, 33,
34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40,
41, 41, 41, 42, 42, 42, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 48,
48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 53, 53, 53, 54, 54, 54, 55,
55, 55, 56, 56, 56, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62,
62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 69, 69,
69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 75, 75, 75, 76, 76,
76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83,
83, 84, 84, 84, 85, 85, 85, 86, 86, 86, 87, 87, 87, 88, 88, 88, 89, 89, 89, 90,
90, 90, 91, 91, 91, 92, 92, 92, 93, 93, 93, 94, 94, 94, 95, 95, 95, 96, 96, 96,
97, 97, 97, 98, 98, 98, 99, 99, 99, 100, 100, 100, 101, 101, 101, 4, -61, -123, -112, -126,
-112, -123, -118, -128, -126, -128, -120, -115, -102, -93, -81, -76, -73, -75, -78, -84, -89, -94, -97, -98,
-96, -93, -90, -86, -84, -82, -81, -82, -83, -85, -87, -88, -88, -88, -87, -86, -84, -83, -82, -82,
-82, -82, -82, -82, -83, -83, -83, -82, -82, -81, -80, -80, -79, -79, -79, -79, -79, -79, -79, -78,
-78, -78, -77, -77, -77, -76, -76, -76, -75, -75, -75, -75, -74, -74, -74, -74, -73, -73, -73, -72,
-72, -72, -71, -71, -71, -71, -70, -70, -70, -69, -69, -69, -68, -68, -68, -67, -67, -67, -67, -66,
-66, -66, -65, -65, -65, -64, -64, -64, -63, -63, -63, -63, -62, -62, -62, -61, -61, -61, -60, -60,
-60, -59, -59, -59, -58, -58, -58, -57, -57, -57, -56, -56, -56, -55, -55, -55, -54, -54, -54, -53,
-53, -53, -52, -52, -52, -51, -51, -51, -50, -50, -50, -49, -49, -49, -48, -48, -48, -47, -47, -47,
-46, -46, -46, -45, -45, -45, -44, -44, -44, -43, -43, -43, -42, -42, -42, -41, -41, -41, -40, -40,
-40, -39, -39, -39, -38, -38, -38, -37, -37, -37, -36, -36, -36, -35, -35, -35, -34, -34, -33, -33,
-33, -32, -32, -32, -31, -31, -31, -30, -30, -30, -29, -29, -29, -28, -28, -28, -27, -27, -27, -26,
-26, -26, -25, -25, -25, -24, -24, -24, -23, -23, -23, -22, -22, -22, -21, -21, -20, -20, -20, -19,
-19, -19, -18, -18, -18, -17, -17, -17, -16, -16, -16, -15, -15, -15, -14, -14, -14, -13, -13, -13,
-12, -12, -12, -11, -11, -11, -10, -10, -10, -9, -9, -9, -9, -8, -8, -8, -7, -7, -7, -6,
-6, -6, -5, -5, -5, -4, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, -1, };
 
Last edited:
Just a quick update. I haven't had any time to devote to the Audio library over the last few weeks. After Maker Faire, I released 1.19 (mostly bug fixes and supporting more clock speeds) and over the last week I've been porting the remaining libraries that are incompatible with Teensy3. This week I did NewPing, FreqCount, FreqMeasure, FrequencyTimer2, TimerOne, TimerThree, MsTimer2 & FlexiTimer2. I'm planning to do a few more, and then work on the SPI sharing issue for a few solid days, in hopes of solving it in the upstream Arduino software. The SPI sharing issue also impacts the audio library.

Really, I haven't forgotten about the audio library, but I'm just 1 guy with a huge TODO list. After the SPI thing is submitted to the Arduino devs, I'm going to get back onto the audio library. First up is merging Pete's SPI flash stuff (perhaps with adding a partition map to the first sector on the chip). I'm hearing more requests for wavetable synthesis, so that's probably going to move up in the priority list.
 
Hi Paul

This is great library - many thanks !

My little tip for new synthesis - karplus strong, phase distortion, granular, formant :)

Kamil
 
Audio Board Ground Question - Need Advice

In my present quest to do more with less it occurred to me I could drive a 8 ohm to 600 ohm transformer with headphone out. This seemed to work at max output driving a 600 ohm load at about +11 dbm. I had originally planned to use some type of DPDT switching to switch the 600 ohm balanced line between a TX mode ( driven by HP out) and RX mode into line-in. If I bridge the HP output to line-in ( to do away with the DPDT switching) what to do with HP_VGND becomes an issue. Perhaps bridging on the 600 ohm side of the transformer? This references the balanced line to ground which does not seem to be best practice. Perhaps another 600 to 600 isolation transformer?
 
Hey!

I just converted the 4000+ single-shot samples to be used in Wavetable-Syntesis on the Teensy:
https://github.com/DatanoiseTV/AKWF_WaveForms

They were at 600 Frames per Sample (which is D2+2) and are now resampled to 256+1 frames to
be used with the existing Teensy Audio Library - Signed 16-Bit Integers.
 
Last edited:
Paul,

I have been very impressed with the Teensy and built some projects with it. For a project, I am trying to make on audio onset library for a beat detections using your board, Teensy 3.1 and the audio library. Do you know if someone made it already?

regards
Rob Oudenijk
 
I am trying to make on audio onset library for a beat detections using your board, Teensy 3.1 and the audio library. Do you know if someone made it already?

I am not aware of anyone doing this year. It's definitely something I want to do later this summer, but at the rate I'm going with a ton of other Teensy-related stuff, I wouldn't wait for me...
 
Paul,

Thanks for the fast reply. I have been searching and could not find anyone doing that. The project is part of a "Dancing Wiper Project" that will let the wind shield wipers swing on the beat of music in a car. The mechanical and hardware interface works fine. But to get the onset and beat detection working a a harder job. We did find some very interesting source code at https://github.com/johnglover/modal/tree/master/modal/detectionfunctions.
Maybe the link would make the implementation of a onset library for Teensy much easier to implement and other people the opportunity to make simple beat detecting boxes fro Teensies.

regards
rob
 
Hi syso2342

Is possible make simple example how to use you wavetables ?

Many thanks

Kamil

P.S. little question - exist karplus strong example for teensy 3.1 ?
 
I use the algorithm in the synth_sine.cpp file to linear filter my waveforms, and it performs very well.
Now, instead of waveforms with 257 samples, I would like to use 1025 samples to allow higher harmonics.
I tried changing the code, but I get some high pitched noise.
what should I change to allow these larger waveforms?


code from synth_sine.cpp:
for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
index = ph >> 24;
val1 = AudioWaveformSine[index];
val2 = AudioWaveformSine[index+1];
scale = (ph >> 8) & 0xFFFF;
val2 *= scale;
val1 *= 0xFFFF - scale;
//block->data = (((val1 + val2) >> 16) * magnitude) >> 16;
block->data = multiply_32x32_rshift32(val1 + val2, magnitude);
ph += inc;
}



my attempt:

I assumed the bit shifting of the line index = ph >> 24; had to do with the 257 samples waveform.
so I changed this to index = ph >> 22;

Also, the line scale = (ph >> 8) & 0xFFFF; was changed to scale = (ph >> 10) & 0xFFFF;
for (i=0; i < AUDIO_BLOCK_SAMPLES; i++) {
index = ph >> 22;
val1 = AudioWaveformSine[index];
val2 = AudioWaveformSine[index+1];
scale = (ph >> 10) & 0xFFFF;
val2 *= scale;
val1 *= 0xFFFF - scale;
//block->data = (((val1 + val2) >> 16) * magnitude) >> 16;
block->data = multiply_32x32_rshift32(val1 + val2, magnitude);
ph += inc;
}
 
The uint32_t phase is a 32 bit number that represents your position in the waveform. If you have an 8 bit wavetable, you need the most significant 8 bits to tell you which sample in your wavetable to use. That's why index = ph>>24, because 32-8=24. So you got index = ph>>22; correct.

Scale is used to interpolate between two samples to give a greater degree of accuracy. This code uses a 16 bit value to interpolate from the current sample to the next one. Since you have already used 10 bits of your phase to get the index, you would use the next most significant bits to interpolate. Therefore you should have scale=(ph>>6)&0xFFFF;

Haven't tried your code but that's the gist of it.
 
hi,
i'm currently using UART for midi com. but is there a way to use the standard MIDI.h arduino library with the audio shield?
greets
 
i'll replay to myself:
HardwareSerial Uart = HardwareSerial();
MIDI_CREATE_INSTANCE(HardwareSerial, Uart, midi2);
midi2.begin()....
is going well
 
next question. i'm trying to build a simple drummachine. when it play 2 sounds simultaniously i have a short delay between the sounds of about some ms (choking). is there a way to avoid this or what could be the problem?

cheers
 
I'm confused by all this not-very-specific talk involving different libraries.

The MIDI library sends and receives MIDI messages over one of the serial ports, which usually is used at 31250 baud with a 5 pin DIN connector. The USB MIDI support in Teensyduino (enabled with Tools > USB Type set to MIDI) does the same over USB to your computer, at 12 Mbit/sec speed.

The Audio library processes actual sound, not digital MIDI messages.

Certainly the Audio library can play more than 1 sound simultaneously. You do need to create multiple instances of play objects and combine then together with mixer objects. The PlayFromSketch example is a good place to start.

All 3 of these are independent. All 3, or any combination, can be used together in the same project.

Vananders, you can get much better help for your project if you'd write more specific and detailed questions that explain better what you're trying to accomplish.
 
Idea for new modules for audio library

Clock
Random Lfo
Sample&Hold
Sample&Track


thanks Kamil
 
Status
Not open for further replies.
Back
Top