Synthesizer based on the Unzen / Nucleo F746ZG
Dependencies: amakusa mbed-dsp mbed shimabara ukifune unzen_nucleo_f746
Fork of skeleton_unzen_nucleo_f746 by
雲仙フレームワークのテストとして作っているプロジェクトです。中身はどんどん変っていきます。 説明はDSP空挺団の「シンセサイザー」カテゴリーを参照してください。初回は「ドッグフードを食べる」です。
main.cpp@17:728ffc633179, 2017-01-31 (annotated)
- Committer:
- shorie
- Date:
- Tue Jan 31 14:19:16 2017 +0000
- Revision:
- 17:728ffc633179
- Parent:
- 13:b33cb5925113
- Child:
- 18:b9b1116f8768
VFO is now working.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shorie | 1:98ddcbbe10ba | 1 | #include "mbed.h" |
shorie | 1:98ddcbbe10ba | 2 | |
shorie | 9:7f521a0b397c | 3 | // Note : Do not touch the "unzen dependent" part. No need to read. |
shorie | 9:7f521a0b397c | 4 | // Modify the "project dependent" part. |
shorie | 9:7f521a0b397c | 5 | // Also, Modify the SignalProcessing class. |
shorie | 6:486b1cb03e61 | 6 | |
shorie | 6:486b1cb03e61 | 7 | |
shorie | 6:486b1cb03e61 | 8 | /************************** unzen dependent constants. ************************/ |
shorie | 6:486b1cb03e61 | 9 | #define CODEC_I2C_ADDR 0x38 // Address of the ADAU-1361A |
shorie | 6:486b1cb03e61 | 10 | |
shorie | 6:486b1cb03e61 | 11 | |
shorie | 6:486b1cb03e61 | 12 | /*========================= Project Dependent Constants ======================*/ |
shorie | 6:486b1cb03e61 | 13 | #define BLOCKSIZE 16 // number of the sample to be processed at once. |
shorie | 6:486b1cb03e61 | 14 | #define FS shimabara::Fs_48 // Fs can be Fs_32, Fs_441, Fs_48, Fs_96 |
shorie | 6:486b1cb03e61 | 15 | |
shorie | 6:486b1cb03e61 | 16 | |
shorie | 6:486b1cb03e61 | 17 | /************************** unzen dependent include. **************************/ |
shorie | 0:a837eeab3ca6 | 18 | #include "unzen.h" // audio framework include file |
shorie | 1:98ddcbbe10ba | 19 | #include "umb_adau1361a.h" // audio codec contoler include file |
shorie | 3:1b420050bdda | 20 | #include "amakusa.h" // audio signal processing class library. |
shorie | 8:d8d1776e865b | 21 | #include "ukifune.h" // UI board support routines |
shorie | 8:d8d1776e865b | 22 | #include "signal_processing.h" // Implementaion of user signal processing. |
shorie | 2:d5028a37f17b | 23 | |
shorie | 3:1b420050bdda | 24 | |
shorie | 6:486b1cb03e61 | 25 | /************************* Unzen Dependent Global Variables *******************/ |
shorie | 6:486b1cb03e61 | 26 | // I2C is essential to talk with ADAU1361 |
shorie | 8:d8d1776e865b | 27 | static I2C i2c(D14, D15); |
shorie | 6:486b1cb03e61 | 28 | // create an audio codec contoler |
shorie | 8:d8d1776e865b | 29 | static shimabara::UMB_ADAU1361A codec(FS, i2c, CODEC_I2C_ADDR ); |
shorie | 6:486b1cb03e61 | 30 | // create an audio framework by singlton pattern |
shorie | 8:d8d1776e865b | 31 | static unzen::Framework audio; |
shorie | 6:486b1cb03e61 | 32 | // create a pointer to the signal processing object. |
shorie | 8:d8d1776e865b | 33 | static SignalProcessing * process; |
shorie | 6:486b1cb03e61 | 34 | |
shorie | 6:486b1cb03e61 | 35 | |
shorie | 6:486b1cb03e61 | 36 | /************************* Unzen Dependent Function Prototype *****************/ |
shorie | 6:486b1cb03e61 | 37 | // for system usage. Do not care. |
shorie | 6:486b1cb03e61 | 38 | void initialize_system(void); |
shorie | 0:a837eeab3ca6 | 39 | |
shorie | 2:d5028a37f17b | 40 | |
shorie | 7:e86c645231ff | 41 | /*========================= Main program. ====================================*/ |
shorie | 0:a837eeab3ca6 | 42 | int main() |
shorie | 0:a837eeab3ca6 | 43 | { |
shorie | 11:7d8740437e6a | 44 | uint32_t pushing, releasing, holding; |
shorie | 17:728ffc633179 | 45 | |
shorie | 17:728ffc633179 | 46 | // VFO style |
shorie | 17:728ffc633179 | 47 | wave_style style = triangle; |
shorie | 11:7d8740437e6a | 48 | |
shorie | 6:486b1cb03e61 | 49 | // start audio. Do not touch |
shorie | 6:486b1cb03e61 | 50 | initialize_system(); |
shorie | 17:728ffc633179 | 51 | |
shorie | 17:728ffc633179 | 52 | process->set_vfo_frequency( 440 ); |
shorie | 17:728ffc633179 | 53 | process->set_vfo_wave_style( style ); |
shorie | 17:728ffc633179 | 54 | ukifune::turn_led_off( ukifune::led1_1 ); |
shorie | 17:728ffc633179 | 55 | ukifune::turn_led_on( ukifune::led1_2 ); |
shorie | 0:a837eeab3ca6 | 56 | |
shorie | 6:486b1cb03e61 | 57 | // main loop. Signal processing is done in background. |
shorie | 6:486b1cb03e61 | 58 | while(1) |
shorie | 6:486b1cb03e61 | 59 | { // place your foreground program here. |
shorie | 12:2b121255e2d1 | 60 | |
shorie | 12:2b121255e2d1 | 61 | // get volume from UI panel, then apply it to signal processing. |
shorie | 17:728ffc633179 | 62 | process->set_volume( ukifune::get_volume(0) ); |
shorie | 17:728ffc633179 | 63 | process->set_vfo_duty_cycle( ukifune::get_volume(1) ); |
shorie | 2:d5028a37f17b | 64 | |
shorie | 11:7d8740437e6a | 65 | // sample usage of button switch detection |
shorie | 11:7d8740437e6a | 66 | ukifune::get_button_state( pushing, releasing, holding); |
shorie | 11:7d8740437e6a | 67 | |
shorie | 11:7d8740437e6a | 68 | // pushing detection demo |
shorie | 11:7d8740437e6a | 69 | if ( pushing & (1 << ukifune::swm1 ) ) // is SWM1 switch pusshing down? |
shorie | 17:728ffc633179 | 70 | if ( style == triangle ) |
shorie | 17:728ffc633179 | 71 | { |
shorie | 17:728ffc633179 | 72 | style = square; |
shorie | 17:728ffc633179 | 73 | process->set_vfo_wave_style( style ); |
shorie | 17:728ffc633179 | 74 | ukifune::turn_led_on( ukifune::led1_1 ); |
shorie | 17:728ffc633179 | 75 | ukifune::turn_led_off( ukifune::led1_2 ); |
shorie | 17:728ffc633179 | 76 | } |
shorie | 17:728ffc633179 | 77 | else |
shorie | 17:728ffc633179 | 78 | { |
shorie | 17:728ffc633179 | 79 | style = triangle; |
shorie | 17:728ffc633179 | 80 | process->set_vfo_wave_style( style ); |
shorie | 17:728ffc633179 | 81 | ukifune::turn_led_off( ukifune::led1_1 ); |
shorie | 17:728ffc633179 | 82 | ukifune::turn_led_on( ukifune::led1_2 ); |
shorie | 17:728ffc633179 | 83 | } |
shorie | 17:728ffc633179 | 84 | |
shorie | 11:7d8740437e6a | 85 | |
shorie | 11:7d8740437e6a | 86 | |
shorie | 11:7d8740437e6a | 87 | |
shorie | 6:486b1cb03e61 | 88 | // you have to call tick() every 20mS-50mS if you need get_volume() |
shorie | 6:486b1cb03e61 | 89 | wait(0.05); |
shorie | 6:486b1cb03e61 | 90 | ukifune::tick(); |
shorie | 6:486b1cb03e61 | 91 | } |
shorie | 7:e86c645231ff | 92 | } // End of main |
shorie | 7:e86c645231ff | 93 | |
shorie | 7:e86c645231ff | 94 | |
shorie | 8:d8d1776e865b | 95 | /************************* Unzen Dependent Callbacks **************************/ |
shorie | 7:e86c645231ff | 96 | // customer signal processing initialization call back. |
shorie | 7:e86c645231ff | 97 | void init_callback( |
shorie | 7:e86c645231ff | 98 | unsigned int block_size // block size [sample] |
shorie | 7:e86c645231ff | 99 | ) |
shorie | 7:e86c645231ff | 100 | { |
shorie | 7:e86c645231ff | 101 | // place initialization code here |
shorie | 7:e86c645231ff | 102 | process = new SignalProcessing( block_size ); |
shorie | 7:e86c645231ff | 103 | } // end of init_callback |
shorie | 7:e86c645231ff | 104 | |
shorie | 7:e86c645231ff | 105 | |
shorie | 7:e86c645231ff | 106 | // customer signal processing call back. |
shorie | 7:e86c645231ff | 107 | void process_callback( |
shorie | 7:e86c645231ff | 108 | float rx_left_buffer[], // array of the left input samples |
shorie | 7:e86c645231ff | 109 | float rx_right_buffer[], // array of the right input samples |
shorie | 7:e86c645231ff | 110 | float tx_left_buffer[], // place to write the left output samples |
shorie | 13:b33cb5925113 | 111 | float tx_right_buffer[], // place to write the right output samples |
shorie | 7:e86c645231ff | 112 | unsigned int block_size // block size [sample] |
shorie | 7:e86c645231ff | 113 | ) |
shorie | 7:e86c645231ff | 114 | { |
shorie | 7:e86c645231ff | 115 | // place signal processing code here |
shorie | 7:e86c645231ff | 116 | process->run( rx_left_buffer, rx_right_buffer, tx_left_buffer, tx_right_buffer, block_size ); |
shorie | 7:e86c645231ff | 117 | } // End of process_callback |
shorie | 2:d5028a37f17b | 118 | |
shorie | 6:486b1cb03e61 | 119 | |
shorie | 6:486b1cb03e61 | 120 | /************************* Unzen Dependent Function implementation ************/ |
shorie | 6:486b1cb03e61 | 121 | void initialize_system(void) |
shorie | 2:d5028a37f17b | 122 | { |
shorie | 6:486b1cb03e61 | 123 | // Set I3C clock to 100kHz |
shorie | 6:486b1cb03e61 | 124 | i2c.frequency( 100000 ); |
shorie | 6:486b1cb03e61 | 125 | |
shorie | 6:486b1cb03e61 | 126 | // Configure the optional block size of signal processing. By default, it is 1[Sample] |
shorie | 6:486b1cb03e61 | 127 | audio.set_block_size(BLOCKSIZE); |
shorie | 6:486b1cb03e61 | 128 | |
shorie | 6:486b1cb03e61 | 129 | // Start UI module. |
shorie | 6:486b1cb03e61 | 130 | ukifune::init( & audio ); |
shorie | 6:486b1cb03e61 | 131 | |
shorie | 6:486b1cb03e61 | 132 | // Start the ADAU1361. Audio codec starts to generate the I2C signals |
shorie | 6:486b1cb03e61 | 133 | codec.start(); |
shorie | 6:486b1cb03e61 | 134 | // Start the audio framework on ARM processor. |
shorie | 6:486b1cb03e61 | 135 | audio.start( init_callback, process_callback); // path the initializaiton and process call back to framework |
shorie | 6:486b1cb03e61 | 136 | |
shorie | 6:486b1cb03e61 | 137 | // Setup initial analog gain |
shorie | 6:486b1cb03e61 | 138 | codec.set_hp_output_gain( 0, 0 ); |
shorie | 6:486b1cb03e61 | 139 | codec.set_line_output_gain( 0, 0 ); |
shorie | 6:486b1cb03e61 | 140 | } |