annotate examples/basic_analog_output/render.cpp @ 380:9dc5a0ccad25 prerelease

Fixed missing ) in Makefile, and removed unnecessary Utilities.h includes
author andrewm
date Sun, 12 Jun 2016 23:03:57 +0100
parents db2fe4e1b88e
children
rev   line source
andrewm@0 1 /*
robert@372 2 ____ _____ _ _
robert@372 3 | __ )| ____| | / \
robert@372 4 | _ \| _| | | / _ \
robert@372 5 | |_) | |___| |___ / ___ \
robert@372 6 |____/|_____|_____/_/ \_\.io
robert@372 7
andrewm@0 8 */
andrewm@0 9
robert@372 10 /*
robert@372 11 *
robert@372 12 * Andrew McPherson and Victor Zappi
robert@372 13 * Queen Mary, University of London
robert@372 14 */
robert@372 15
robert@372 16 /**
robert@372 17 \example 3_analog_output
robert@372 18
robert@372 19 Fading LEDs
robert@372 20 -----------
robert@372 21
robert@372 22 This sketch uses a sine wave to drive the brightness of a series of LEDs
robert@372 23 connected to the eight analog out pins. Again you can see the nested `for` loop
robert@372 24 structure but this time for the analog output channels rather than the audio.
robert@372 25
robert@372 26 - connect an LED in series with a 470ohm resistor between each of the analogOut pins and ground.
robert@372 27
robert@372 28 Within the first for loop in render we cycle through each frame in the analog
robert@372 29 output matrix. At each frame we then cycle through the analog output channels
robert@372 30 with another for loop and set the output voltage according to the phase of a
robert@372 31 sine tone that acts as an LFO. The analog output pins can provide a voltage of
robert@372 32 ~4.092V.
robert@372 33
robert@372 34 The output on each pin is set with `analogWrite()` within the for loop that
robert@372 35 cycles through the analog output channels. This needs to be provided with
robert@372 36 arguments as follows `analogWrite(context, n, channel, out)`. Channel is
robert@372 37 where the you give the address of the analog output pin (in this case we cycle
robert@372 38 through each pin address in the for loop), out is the variable that holds the
robert@372 39 desired output (in this case set by the sine wave).
robert@372 40
robert@372 41 Notice that the phase of the brightness cycle for each led is different. This
robert@372 42 is achieved by updating a variable that stores a relative phase value. This
robert@372 43 variable is advanced by pi/4 (1/8 of a full rotation) for each channel giving
robert@372 44 each of the eight LEDs a different phase.
robert@372 45 */
andrewm@0 46
giuliomoro@301 47 #include <Bela.h>
andrewm@0 48 #include <rtdk.h>
andrewm@0 49 #include <cmath>
andrewm@0 50
andrewm@0 51 // Set range for analog outputs designed for driving LEDs
andrewm@52 52 const float kMinimumAmplitude = (1.5 / 5.0);
andrewm@52 53 const float kAmplitudeRange = 1.0 - kMinimumAmplitude;
andrewm@0 54
andrewm@0 55 float gFrequency;
andrewm@0 56 float gPhase;
andrewm@0 57 float gInverseSampleRate;
andrewm@0 58
andrewm@56 59 // setup() is called once before the audio rendering starts.
andrewm@0 60 // Use it to perform any initialisation and allocation which is dependent
andrewm@0 61 // on the period size or sample rate.
andrewm@0 62 //
andrewm@0 63 // userData holds an opaque pointer to a data structure that was passed
andrewm@0 64 // in from the call to initAudio().
andrewm@0 65 //
andrewm@0 66 // Return true on success; returning false halts the program.
andrewm@0 67
giuliomoro@301 68 bool setup(BelaContext *context, void *userData)
andrewm@0 69 {
andrewm@0 70 // Retrieve a parameter passed in from the initAudio() call
andrewm@0 71 gFrequency = *(float *)userData;
andrewm@0 72
andrewm@52 73 if(context->analogFrames == 0) {
andrewm@12 74 rt_printf("Error: this example needs the matrix enabled\n");
andrewm@0 75 return false;
andrewm@0 76 }
andrewm@0 77
andrewm@52 78 gInverseSampleRate = 1.0 / context->analogSampleRate;
andrewm@0 79 gPhase = 0.0;
andrewm@0 80
andrewm@0 81 return true;
andrewm@0 82 }
andrewm@0 83
andrewm@0 84 // render() is called regularly at the highest priority by the audio engine.
andrewm@0 85 // Input and output are given from the audio hardware and the other
andrewm@0 86 // ADCs and DACs (if available). If only audio is available, numMatrixFrames
andrewm@0 87 // will be 0.
andrewm@0 88
giuliomoro@301 89 void render(BelaContext *context, void *userData)
andrewm@0 90 {
andrewm@56 91 for(unsigned int n = 0; n < context->analogFrames; n++) {
andrewm@0 92 // Set LED to different phase for each matrix channel
andrewm@0 93 float relativePhase = 0.0;
andrewm@56 94 for(unsigned int channel = 0; channel < context->analogChannels; channel++) {
andrewm@0 95 float out = kMinimumAmplitude + kAmplitudeRange * 0.5f * (1.0f + sinf(gPhase + relativePhase));
andrewm@0 96
andrewm@308 97 analogWrite(context, n, channel, out);
andrewm@0 98
andrewm@0 99 // Advance by pi/4 (1/8 of a full rotation) for each channel
andrewm@0 100 relativePhase += M_PI * 0.25;
andrewm@0 101 }
andrewm@0 102
andrewm@0 103 gPhase += 2.0 * M_PI * gFrequency * gInverseSampleRate;
andrewm@0 104 if(gPhase > 2.0 * M_PI)
andrewm@0 105 gPhase -= 2.0 * M_PI;
andrewm@0 106 }
andrewm@0 107 }
andrewm@0 108
andrewm@56 109 // cleanup() is called once at the end, after the audio has stopped.
andrewm@56 110 // Release any resources that were allocated in setup().
andrewm@0 111
giuliomoro@301 112 void cleanup(BelaContext *context, void *userData)
andrewm@0 113 {
andrewm@0 114
andrewm@0 115 }