Jonne Valola / PokittoLib Featured

Dependents:   YATTT sd_map_test cPong SnowDemo ... more

PokittoLib

Library for programming Pokitto hardware

How to Use

  1. Import this library to online compiler (see button "import" on the right hand side
  2. DO NOT import mbed-src anymore, a better version is now included inside PokittoLib
  3. Change My_settings.h according to your project
  4. Start coding!
Committer:
Pokitto
Date:
Wed Apr 25 14:00:49 2018 +0000
Revision:
41:e667167aa9d8
Parent:
35:4f7edccf8ed6
new button handler;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pokitto 31:f4b9b85c7b62 1 /**************************************************************************/
Pokitto 31:f4b9b85c7b62 2 /*!
Pokitto 31:f4b9b85c7b62 3 @file HWSound.cpp
Pokitto 31:f4b9b85c7b62 4 @author Jonne Valola
Pokitto 31:f4b9b85c7b62 5
Pokitto 31:f4b9b85c7b62 6 @section LICENSE
Pokitto 31:f4b9b85c7b62 7
Pokitto 31:f4b9b85c7b62 8 Software License Agreement (BSD License)
Pokitto 31:f4b9b85c7b62 9
Pokitto 31:f4b9b85c7b62 10 Copyright (c) 2016, Jonne Valola
Pokitto 31:f4b9b85c7b62 11 All rights reserved.
Pokitto 31:f4b9b85c7b62 12
Pokitto 31:f4b9b85c7b62 13 Redistribution and use in source and binary forms, with or without
Pokitto 31:f4b9b85c7b62 14 modification, are permitted provided that the following conditions are met:
Pokitto 31:f4b9b85c7b62 15 1. Redistributions of source code must retain the above copyright
Pokitto 31:f4b9b85c7b62 16 notice, this list of conditions and the following disclaimer.
Pokitto 31:f4b9b85c7b62 17 2. Redistributions in binary form must reproduce the above copyright
Pokitto 31:f4b9b85c7b62 18 notice, this list of conditions and the following disclaimer in the
Pokitto 31:f4b9b85c7b62 19 documentation and/or other materials provided with the distribution.
Pokitto 31:f4b9b85c7b62 20 3. Neither the name of the copyright holders nor the
Pokitto 31:f4b9b85c7b62 21 names of its contributors may be used to endorse or promote products
Pokitto 31:f4b9b85c7b62 22 derived from this software without specific prior written permission.
Pokitto 31:f4b9b85c7b62 23
Pokitto 31:f4b9b85c7b62 24 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
Pokitto 31:f4b9b85c7b62 25 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Pokitto 31:f4b9b85c7b62 26 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Pokitto 31:f4b9b85c7b62 27 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
Pokitto 31:f4b9b85c7b62 28 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
Pokitto 31:f4b9b85c7b62 29 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Pokitto 31:f4b9b85c7b62 30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
Pokitto 31:f4b9b85c7b62 31 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Pokitto 31:f4b9b85c7b62 32 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Pokitto 31:f4b9b85c7b62 33 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Pokitto 31:f4b9b85c7b62 34 */
Pokitto 31:f4b9b85c7b62 35 /**************************************************************************/
Pokitto 31:f4b9b85c7b62 36
Pokitto 31:f4b9b85c7b62 37 #include "mbed.h"
Pokitto 31:f4b9b85c7b62 38 #include "HWSound.h"
Pokitto 31:f4b9b85c7b62 39 //#include "MCP4018.h"
Pokitto 31:f4b9b85c7b62 40 #include "SoftwareI2C.h"
Pokitto 31:f4b9b85c7b62 41 #include "Pokitto_settings.h"
Pokitto 31:f4b9b85c7b62 42 #include "PokittoDisk.h"
Pokitto 31:f4b9b85c7b62 43 #include "PokittoGlobs.h"
Pokitto 31:f4b9b85c7b62 44 #include "Synth.h"
Pokitto 31:f4b9b85c7b62 45 #include "timer_11u6x.h"
Pokitto 31:f4b9b85c7b62 46 #include "clock_11u6x.h"
Pokitto 35:4f7edccf8ed6 47 #include "HWLCD.h"
Pokitto 31:f4b9b85c7b62 48 //#include "beat_11025.h"
Pokitto 31:f4b9b85c7b62 49
Pokitto 31:f4b9b85c7b62 50
Pokitto 35:4f7edccf8ed6 51 Pokitto::Sound __shw;
Pokitto 31:f4b9b85c7b62 52
Pokitto 31:f4b9b85c7b62 53 using namespace Pokitto;
Pokitto 31:f4b9b85c7b62 54
Pokitto 31:f4b9b85c7b62 55 #ifndef POK_SIM
Pokitto 35:4f7edccf8ed6 56 #if POK_ENABLE_SOUND
Pokitto 31:f4b9b85c7b62 57 pwmout_t* obj = &audiopwm;
Pokitto 31:f4b9b85c7b62 58 #endif
Pokitto 33:7d20a1e51908 59 #endif
Pokitto 31:f4b9b85c7b62 60
Pokitto 31:f4b9b85c7b62 61 /** Sound Variables **/
Pokitto 31:f4b9b85c7b62 62 #if (POK_STREAMING_MUSIC > 0)
Pokitto 31:f4b9b85c7b62 63 unsigned char buffers[4][BUFFER_SIZE];
Pokitto 31:f4b9b85c7b62 64 volatile int currentBuffer = 0, oldBuffer = 0;
Pokitto 31:f4b9b85c7b62 65 volatile int bufindex = 0, vol=1;
Pokitto 31:f4b9b85c7b62 66 volatile unsigned char * currentPtr;
Pokitto 31:f4b9b85c7b62 67 volatile unsigned char * endPtr;
Pokitto 31:f4b9b85c7b62 68 int8_t streamvol=3;
Pokitto 31:f4b9b85c7b62 69 uint32_t streamcounter=0;
Pokitto 31:f4b9b85c7b62 70 uint8_t streamstep=0;
Pokitto 31:f4b9b85c7b62 71 #endif
Pokitto 31:f4b9b85c7b62 72
Pokitto 31:f4b9b85c7b62 73 #if POK_ENABLE_SOUND > 0
Pokitto 31:f4b9b85c7b62 74 pwmout_t Pokitto::audiopwm; // this way (instead of PwmOut class) pwm doesn't start screaming until it is initialized !
Pokitto 31:f4b9b85c7b62 75 //Ticker Pokitto::audio;
Pokitto 31:f4b9b85c7b62 76
Pokitto 31:f4b9b85c7b62 77 using namespace Pokitto;
Pokitto 31:f4b9b85c7b62 78
Pokitto 31:f4b9b85c7b62 79 /** stream output and status */
Pokitto 31:f4b9b85c7b62 80 uint8_t Pokitto::streambyte,Pokitto::streamon;
Pokitto 31:f4b9b85c7b62 81
Pokitto 35:4f7edccf8ed6 82 uint8_t soundbuf[SBUFSIZE];
Pokitto 35:4f7edccf8ed6 83 uint8_t Pokitto::HWvolume=0;
Pokitto 35:4f7edccf8ed6 84 uint16_t soundbufindex;
Pokitto 35:4f7edccf8ed6 85 uint8_t* soundbufptr;
Pokitto 35:4f7edccf8ed6 86
Pokitto 31:f4b9b85c7b62 87 bool volpotError=false; //test for broken MCP4018
Pokitto 31:f4b9b85c7b62 88
Pokitto 31:f4b9b85c7b62 89 uint16_t soundbyte;
Pokitto 31:f4b9b85c7b62 90
Pokitto 31:f4b9b85c7b62 91
Pokitto 31:f4b9b85c7b62 92 #if POK_USE_DAC > 0
Pokitto 31:f4b9b85c7b62 93 #if POK_BOARDREV == 1
Pokitto 31:f4b9b85c7b62 94 /** 2-layer board rev 1.3 **/
Pokitto 31:f4b9b85c7b62 95 DigitalOut dac0(P1_6);
Pokitto 31:f4b9b85c7b62 96 DigitalOut dac1(P1_0);
Pokitto 31:f4b9b85c7b62 97 DigitalOut dac2(P1_16);
Pokitto 31:f4b9b85c7b62 98 DigitalOut dac3(P0_19);
Pokitto 31:f4b9b85c7b62 99 DigitalOut dac4(P0_17);
Pokitto 31:f4b9b85c7b62 100 DigitalOut dac5(P1_12);
Pokitto 31:f4b9b85c7b62 101 DigitalOut dac6(P1_15);
Pokitto 31:f4b9b85c7b62 102 DigitalOut dac7(P1_8);
Pokitto 31:f4b9b85c7b62 103 #else
Pokitto 31:f4b9b85c7b62 104 /** 4-layer board rev 2.1 **/
Pokitto 31:f4b9b85c7b62 105 DigitalOut dac0(P1_28);
Pokitto 31:f4b9b85c7b62 106 DigitalOut dac1(P1_29);
Pokitto 31:f4b9b85c7b62 107 DigitalOut dac2(P1_30);
Pokitto 31:f4b9b85c7b62 108 DigitalOut dac3(P1_31);
Pokitto 31:f4b9b85c7b62 109 /* has daniel made a mistake ?*/
Pokitto 31:f4b9b85c7b62 110 DigitalOut dac4(P2_20);
Pokitto 31:f4b9b85c7b62 111 DigitalOut dac5(P2_21);
Pokitto 31:f4b9b85c7b62 112 DigitalOut dac6(P2_22);
Pokitto 31:f4b9b85c7b62 113 DigitalOut dac7(P2_23);
Pokitto 31:f4b9b85c7b62 114
Pokitto 31:f4b9b85c7b62 115 DigitalOut amp(P1_17);
Pokitto 31:f4b9b85c7b62 116
Pokitto 31:f4b9b85c7b62 117 #endif // POK_BOARDREV
Pokitto 31:f4b9b85c7b62 118 #endif // POK_USE_DAC
Pokitto 31:f4b9b85c7b62 119
Pokitto 31:f4b9b85c7b62 120 #if POK_BOARDREV == 2
Pokitto 31:f4b9b85c7b62 121 //MCP4018 volpot(P0_5,P0_4);
Pokitto 31:f4b9b85c7b62 122
Pokitto 31:f4b9b85c7b62 123 /**
Pokitto 31:f4b9b85c7b62 124 * @brief Handle interrupt from 32-bit timer 0
Pokitto 31:f4b9b85c7b62 125 * @return Nothing
Pokitto 31:f4b9b85c7b62 126 */
Pokitto 31:f4b9b85c7b62 127
Pokitto 31:f4b9b85c7b62 128 uint32_t p=0;
Pokitto 35:4f7edccf8ed6 129 uint8_t pixx=0, pixy=0;
Pokitto 31:f4b9b85c7b62 130
Pokitto 31:f4b9b85c7b62 131 extern "C" void TIMER32_0_IRQHandler(void)
Pokitto 31:f4b9b85c7b62 132 {
Pokitto 31:f4b9b85c7b62 133 if (Chip_TIMER_MatchPending(LPC_TIMER32_0, 1)) {
Pokitto 31:f4b9b85c7b62 134 Chip_TIMER_ClearMatch(LPC_TIMER32_0, 1);
Pokitto 31:f4b9b85c7b62 135 //pokSoundBufferedIRQ();
Pokitto 32:6d5a63b6d5b6 136 #if POK_GBSOUND > 0
Pokitto 32:6d5a63b6d5b6 137 /** GAMEBUINO SOUND **/
Pokitto 32:6d5a63b6d5b6 138 Pokitto::audio_IRQ();
Pokitto 32:6d5a63b6d5b6 139 #else
Pokitto 32:6d5a63b6d5b6 140 /** NOT GAMEBUINO SOUND **/
Pokitto 35:4f7edccf8ed6 141 #if POK_SOUND_BUFFERED
Pokitto 35:4f7edccf8ed6 142 pokSoundBufferedIRQ();
Pokitto 35:4f7edccf8ed6 143 #else
Pokitto 35:4f7edccf8ed6 144 pokSoundIRQ();
Pokitto 35:4f7edccf8ed6 145 #endif
Pokitto 32:6d5a63b6d5b6 146 #endif
Pokitto 31:f4b9b85c7b62 147 }
Pokitto 31:f4b9b85c7b62 148 }
Pokitto 31:f4b9b85c7b62 149
Pokitto 31:f4b9b85c7b62 150
Pokitto 31:f4b9b85c7b62 151 void initHWvolumecontrol() {
Pokitto 31:f4b9b85c7b62 152 HWvolume=0;
Pokitto 31:f4b9b85c7b62 153 volpotError=true;
Pokitto 31:f4b9b85c7b62 154 //if (volpot.put(HWvolume)) volpotError=true; //try if MCP4018 answers
Pokitto 31:f4b9b85c7b62 155 setHWvolume(VOLUME_STARTUP);
Pokitto 31:f4b9b85c7b62 156 }
Pokitto 31:f4b9b85c7b62 157
Pokitto 31:f4b9b85c7b62 158 int Pokitto::setHWvolume(uint8_t v) {
Pokitto 31:f4b9b85c7b62 159 HWvolume = 0x7F&v;
Pokitto 31:f4b9b85c7b62 160 //if (!volpotError) return volpot.put(HWvolume); //use normal I2C
Pokitto 31:f4b9b85c7b62 161 /* fallback method for broken MCP4018 */
Pokitto 31:f4b9b85c7b62 162 SoftwareI2C swvolpot(P0_4, P0_5); //swapped SDA,SCL
Pokitto 31:f4b9b85c7b62 163 swvolpot.write(0x5e,HWvolume);
Pokitto 31:f4b9b85c7b62 164 return HWvolume;
Pokitto 31:f4b9b85c7b62 165 }
Pokitto 31:f4b9b85c7b62 166
Pokitto 31:f4b9b85c7b62 167 uint8_t Pokitto::getHWvolume() {
Pokitto 31:f4b9b85c7b62 168 return HWvolume;
Pokitto 31:f4b9b85c7b62 169 }
Pokitto 31:f4b9b85c7b62 170
Pokitto 31:f4b9b85c7b62 171 void Pokitto::changeHWvolume(int8_t v) {
Pokitto 31:f4b9b85c7b62 172 int temp = HWvolume + v;
Pokitto 31:f4b9b85c7b62 173 if (temp < 0) temp = 0; //prevent volume "looparound" than can make a massive crack
Pokitto 31:f4b9b85c7b62 174 if (temp > 127) temp = 127;
Pokitto 31:f4b9b85c7b62 175 setHWvolume(temp);
Pokitto 31:f4b9b85c7b62 176 }
Pokitto 31:f4b9b85c7b62 177
Pokitto 31:f4b9b85c7b62 178 uint8_t Pokitto::ampIsOn() {
Pokitto 31:f4b9b85c7b62 179 return amp;
Pokitto 31:f4b9b85c7b62 180 }
Pokitto 31:f4b9b85c7b62 181
Pokitto 31:f4b9b85c7b62 182 void Pokitto::ampEnable(uint8_t v) {
Pokitto 31:f4b9b85c7b62 183 if (v>1) v=1; // limit against funny values
Pokitto 31:f4b9b85c7b62 184 amp=v;
Pokitto 31:f4b9b85c7b62 185 }
Pokitto 31:f4b9b85c7b62 186 #endif // POK_BOARDREV == 2
Pokitto 31:f4b9b85c7b62 187
Pokitto 31:f4b9b85c7b62 188 void Pokitto::dac_write(uint8_t value) {
Pokitto 31:f4b9b85c7b62 189 #if POK_USE_DAC > 0
Pokitto 31:f4b9b85c7b62 190 #if POK_BOARDREV == 1 // was 1
Pokitto 31:f4b9b85c7b62 191 if (value & 1) SET_DAC0 else CLR_DAC0;
Pokitto 31:f4b9b85c7b62 192 value >>= 1;
Pokitto 31:f4b9b85c7b62 193 if (value & 1) SET_DAC1 else CLR_DAC1;
Pokitto 31:f4b9b85c7b62 194 value >>= 1;
Pokitto 31:f4b9b85c7b62 195 if (value & 1) SET_DAC2 else CLR_DAC2;
Pokitto 31:f4b9b85c7b62 196 value >>= 1;
Pokitto 31:f4b9b85c7b62 197 if (value & 1) SET_DAC3 else CLR_DAC3;
Pokitto 31:f4b9b85c7b62 198 value >>= 1;
Pokitto 31:f4b9b85c7b62 199 if (value & 1) SET_DAC4 else CLR_DAC4;
Pokitto 31:f4b9b85c7b62 200 value >>= 1;
Pokitto 31:f4b9b85c7b62 201 if (value & 1) SET_DAC5 else CLR_DAC5;
Pokitto 31:f4b9b85c7b62 202 value >>= 1;
Pokitto 31:f4b9b85c7b62 203 if (value & 1) SET_DAC6 else CLR_DAC6;
Pokitto 31:f4b9b85c7b62 204 value >>= 1;
Pokitto 31:f4b9b85c7b62 205 if (value & 1) SET_DAC7 else CLR_DAC7;
Pokitto 31:f4b9b85c7b62 206 #else
Pokitto 35:4f7edccf8ed6 207
Pokitto 31:f4b9b85c7b62 208 //val = value<<28; //lower 4 bits go higher - because port mask is used, no AND is needed to clear bits
Pokitto 31:f4b9b85c7b62 209 //val += value<<(15-4); //higher 4 bits go lower. No need to shift by 15 because bits are in the higher nibble
Pokitto 31:f4b9b85c7b62 210 /* daniel has made a mistake with ports */
Pokitto 31:f4b9b85c7b62 211 //val = ((value&0x70)<<(28-4)); //higher 4 bits go higher - because port mask is used, no AND is needed to clear bits
Pokitto 31:f4b9b85c7b62 212 //val += value<<(15); //lower 4 bits go lower. No need to shift by 15 because bits are in the higher nibble
Pokitto 31:f4b9b85c7b62 213 //SET_MASK_DAC;
Pokitto 31:f4b9b85c7b62 214 //LPC_GPIO_PORT->MPIN[1] = val; // write bits to port
Pokitto 31:f4b9b85c7b62 215 //CLR_MASK_DAC;
Pokitto 31:f4b9b85c7b62 216 /* fixed here */
Pokitto 35:4f7edccf8ed6 217 #define MASKED_DAC 0
Pokitto 35:4f7edccf8ed6 218 #if MASKED_DAC
Pokitto 35:4f7edccf8ed6 219 uint32_t val;
Pokitto 35:4f7edccf8ed6 220 val=value;
Pokitto 31:f4b9b85c7b62 221 SET_MASK_DAC_LO;
Pokitto 31:f4b9b85c7b62 222 LPC_GPIO_PORT->MPIN[1] = val<<28; // write lower 4 bits to port
Pokitto 31:f4b9b85c7b62 223 CLR_MASK_DAC_LO;
Pokitto 31:f4b9b85c7b62 224 SET_MASK_DAC_HI;
Pokitto 31:f4b9b85c7b62 225 LPC_GPIO_PORT->MPIN[2] = val<<(20-4); // write bits to port
Pokitto 35:4f7edccf8ed6 226 CLR_MASK_DAC_HI;
Pokitto 35:4f7edccf8ed6 227 #else
Pokitto 31:f4b9b85c7b62 228 if (value & 1) SET_DAC0 else CLR_DAC0;
Pokitto 31:f4b9b85c7b62 229 value >>= 1;
Pokitto 31:f4b9b85c7b62 230 if (value & 1) SET_DAC1 else CLR_DAC1;
Pokitto 31:f4b9b85c7b62 231 value >>= 1;
Pokitto 31:f4b9b85c7b62 232 if (value & 1) SET_DAC2 else CLR_DAC2;
Pokitto 31:f4b9b85c7b62 233 value >>= 1;
Pokitto 31:f4b9b85c7b62 234 if (value & 1) SET_DAC3 else CLR_DAC3;
Pokitto 31:f4b9b85c7b62 235 value >>= 1;
Pokitto 31:f4b9b85c7b62 236 if (value & 1) SET_DAC4 else CLR_DAC4;
Pokitto 31:f4b9b85c7b62 237 value >>= 1;
Pokitto 31:f4b9b85c7b62 238 if (value & 1) SET_DAC5 else CLR_DAC5;
Pokitto 31:f4b9b85c7b62 239 value >>= 1;
Pokitto 31:f4b9b85c7b62 240 if (value & 1) SET_DAC6 else CLR_DAC6;
Pokitto 31:f4b9b85c7b62 241 value >>= 1;
Pokitto 31:f4b9b85c7b62 242 if (value & 1) SET_DAC7 else CLR_DAC7;
Pokitto 35:4f7edccf8ed6 243 #endif //MASKED_DAC
Pokitto 31:f4b9b85c7b62 244 //CLR_MASK_DAC;
Pokitto 31:f4b9b85c7b62 245 #endif // BOARDREV
Pokitto 31:f4b9b85c7b62 246 #endif
Pokitto 31:f4b9b85c7b62 247 }
Pokitto 31:f4b9b85c7b62 248
Pokitto 31:f4b9b85c7b62 249 /** SOUND INIT **/
Pokitto 31:f4b9b85c7b62 250 void Pokitto::soundInit() {
Pokitto 35:4f7edccf8ed6 251 #if POK_ENABLE_SOUND > 0
Pokitto 31:f4b9b85c7b62 252 uint32_t timerFreq;
Pokitto 35:4f7edccf8ed6 253 #if POK_USE_PWM
Pokitto 35:4f7edccf8ed6 254
Pokitto 31:f4b9b85c7b62 255 pwmout_init(&audiopwm,POK_AUD_PIN);
Pokitto 31:f4b9b85c7b62 256 pwmout_period_us(&audiopwm,POK_AUD_PWM_US); //was 31us
Pokitto 31:f4b9b85c7b62 257 pwmout_write(&audiopwm,0.1f);
Pokitto 35:4f7edccf8ed6 258 #endif
Pokitto 31:f4b9b85c7b62 259
Pokitto 32:6d5a63b6d5b6 260 //#if POK_GBSOUND > 0
Pokitto 31:f4b9b85c7b62 261 /** GAMEBUINO SOUND **/
Pokitto 32:6d5a63b6d5b6 262 //audio.attach_us(&audio_IRQ, 1000000/(POK_AUD_FREQ>>0));
Pokitto 32:6d5a63b6d5b6 263 //#else
Pokitto 31:f4b9b85c7b62 264 /** NOT GAMEBUINO SOUND **/
Pokitto 31:f4b9b85c7b62 265 //audio.attach_us(&pokSoundBufferedIRQ, 1000000/(POK_AUD_FREQ>>0));
Pokitto 31:f4b9b85c7b62 266 /* Initialize 32-bit timer 0 clock */
Pokitto 31:f4b9b85c7b62 267 Chip_TIMER_Init(LPC_TIMER32_0);
Pokitto 31:f4b9b85c7b62 268
Pokitto 31:f4b9b85c7b62 269 /* Timer rate is system clock rate */
Pokitto 31:f4b9b85c7b62 270 timerFreq = Chip_Clock_GetSystemClockRate();
Pokitto 31:f4b9b85c7b62 271
Pokitto 31:f4b9b85c7b62 272 /* Timer setup for match and interrupt at TICKRATE_HZ */
Pokitto 31:f4b9b85c7b62 273 Chip_TIMER_Reset(LPC_TIMER32_0);
Pokitto 31:f4b9b85c7b62 274
Pokitto 31:f4b9b85c7b62 275 /* Enable both timers to generate interrupts when time matches */
Pokitto 31:f4b9b85c7b62 276 Chip_TIMER_MatchEnableInt(LPC_TIMER32_0, 1);
Pokitto 31:f4b9b85c7b62 277
Pokitto 31:f4b9b85c7b62 278 /* Setup 32-bit timer's duration (32-bit match time) */
Pokitto 31:f4b9b85c7b62 279 Chip_TIMER_SetMatch(LPC_TIMER32_0, 1, (timerFreq / POK_AUD_FREQ));
Pokitto 31:f4b9b85c7b62 280
Pokitto 31:f4b9b85c7b62 281 /* Setup both timers to restart when match occurs */
Pokitto 31:f4b9b85c7b62 282 Chip_TIMER_ResetOnMatchEnable(LPC_TIMER32_0, 1);
Pokitto 31:f4b9b85c7b62 283
Pokitto 31:f4b9b85c7b62 284 /* Start both timers */
Pokitto 31:f4b9b85c7b62 285 Chip_TIMER_Enable(LPC_TIMER32_0);
Pokitto 31:f4b9b85c7b62 286
Pokitto 31:f4b9b85c7b62 287 /* Clear both timers of any pending interrupts */
Pokitto 31:f4b9b85c7b62 288 #define TIMER_32_0_IRQn 18
Pokitto 31:f4b9b85c7b62 289 NVIC_ClearPendingIRQ((IRQn_Type)TIMER_32_0_IRQn);
Pokitto 31:f4b9b85c7b62 290
Pokitto 31:f4b9b85c7b62 291 /* Redirect IRQ vector - Jonne*/
Pokitto 31:f4b9b85c7b62 292 NVIC_SetVector((IRQn_Type)TIMER_32_0_IRQn, (uint32_t)&TIMER32_0_IRQHandler);
Pokitto 31:f4b9b85c7b62 293
Pokitto 31:f4b9b85c7b62 294 /* Enable both timer interrupts */
Pokitto 31:f4b9b85c7b62 295 NVIC_EnableIRQ((IRQn_Type)TIMER_32_0_IRQn);
Pokitto 32:6d5a63b6d5b6 296 //#endif // POK_GAMEBUINO_SUPPORT
Pokitto 31:f4b9b85c7b62 297
Pokitto 31:f4b9b85c7b62 298 //emptySong();
Pokitto 31:f4b9b85c7b62 299 //emptyOscillators();
Pokitto 31:f4b9b85c7b62 300 //emptyBlocks();
Pokitto 31:f4b9b85c7b62 301 //emptyPatches();
Pokitto 31:f4b9b85c7b62 302 #ifdef TEST_SOUND
Pokitto 31:f4b9b85c7b62 303 testOsc();
Pokitto 31:f4b9b85c7b62 304 #endif // TEST_SOUND
Pokitto 31:f4b9b85c7b62 305 #if POK_BOARDREV == 2
Pokitto 31:f4b9b85c7b62 306 initHWvolumecontrol();
Pokitto 31:f4b9b85c7b62 307 #endif
Pokitto 35:4f7edccf8ed6 308
Pokitto 35:4f7edccf8ed6 309 #if POK_ENABLE_SYNTH
Pokitto 35:4f7edccf8ed6 310 emptyOscillators();
Pokitto 35:4f7edccf8ed6 311 #endif
Pokitto 35:4f7edccf8ed6 312
Pokitto 35:4f7edccf8ed6 313
Pokitto 35:4f7edccf8ed6 314 #endif // POK_ENABLE_SOUND
Pokitto 35:4f7edccf8ed6 315
Pokitto 31:f4b9b85c7b62 316 }
Pokitto 31:f4b9b85c7b62 317
Pokitto 31:f4b9b85c7b62 318
Pokitto 31:f4b9b85c7b62 319 uint8_t Pokitto::streamPaused() {
Pokitto 31:f4b9b85c7b62 320 return !streamon;
Pokitto 31:f4b9b85c7b62 321 }
Pokitto 31:f4b9b85c7b62 322
Pokitto 31:f4b9b85c7b62 323 void Pokitto::pauseStream() {
Pokitto 31:f4b9b85c7b62 324 streamon=0;
Pokitto 31:f4b9b85c7b62 325 }
Pokitto 31:f4b9b85c7b62 326
Pokitto 31:f4b9b85c7b62 327 void Pokitto::playStream() {
Pokitto 31:f4b9b85c7b62 328 streamon=1;
Pokitto 31:f4b9b85c7b62 329 }
Pokitto 31:f4b9b85c7b62 330
Pokitto 31:f4b9b85c7b62 331
Pokitto 31:f4b9b85c7b62 332 void pokPauseStream() {
Pokitto 31:f4b9b85c7b62 333 streamon=0;
Pokitto 31:f4b9b85c7b62 334 }
Pokitto 31:f4b9b85c7b62 335
Pokitto 31:f4b9b85c7b62 336 void pokPlayStream() {
Pokitto 31:f4b9b85c7b62 337 streamon=1;
Pokitto 31:f4b9b85c7b62 338 }
Pokitto 31:f4b9b85c7b62 339
Pokitto 31:f4b9b85c7b62 340
Pokitto 31:f4b9b85c7b62 341
Pokitto 35:4f7edccf8ed6 342 inline void pokSoundBufferedIRQ() {
Pokitto 35:4f7edccf8ed6 343 uint8_t output = soundbuf[soundbufindex+=Pokitto::streamon];
Pokitto 35:4f7edccf8ed6 344 if (soundbufindex==SBUFSIZE) soundbufindex=0;
Pokitto 31:f4b9b85c7b62 345 //if (p==sizeof(beat_11025_raw)) p=0;
Pokitto 31:f4b9b85c7b62 346 //soundbuf[soundbufindex++] = output;
Pokitto 35:4f7edccf8ed6 347 //uint32_t t_on = (uint32_t)(((obj->pwm->MATCHREL0)*output)>>8); //cut out float
Pokitto 35:4f7edccf8ed6 348 //obj->pwm->MATCHREL1 = t_on;
Pokitto 35:4f7edccf8ed6 349 dac_write(output);
Pokitto 35:4f7edccf8ed6 350
Pokitto 35:4f7edccf8ed6 351 //setDRAMpoint(pixx, pixy);
Pokitto 31:f4b9b85c7b62 352 }
Pokitto 31:f4b9b85c7b62 353
Pokitto 35:4f7edccf8ed6 354 inline void pokSoundIRQ() {
Pokitto 33:7d20a1e51908 355 #if POK_ENABLE_SOUND > 0
Pokitto 35:4f7edccf8ed6 356 //#define TICKY 0xFFFF //160
Pokitto 35:4f7edccf8ed6 357 //#define INCY 409
Pokitto 34:427237571c6a 358 uint8_t output=0;
Pokitto 34:427237571c6a 359 streamon=1;
Pokitto 35:4f7edccf8ed6 360 //if (test==TICKY) test=0;
Pokitto 35:4f7edccf8ed6 361 //if (test<(TICKY/2)) { tpin=1; pwmout_write(&audiopwm,(float)0/(float)255);}//dac_write(0);}
Pokitto 35:4f7edccf8ed6 362 //else {tpin=0; pwmout_write(&audiopwm,(float)255/(float)255);}//dac_write(64);}
Pokitto 35:4f7edccf8ed6 363 //test+=INCY;
Pokitto 35:4f7edccf8ed6 364 //return;
Pokitto 31:f4b9b85c7b62 365 #ifndef POK_SIM
Pokitto 35:4f7edccf8ed6 366 #if POK_USE_PWM
Pokitto 35:4f7edccf8ed6 367 pwmout_t* obj = &audiopwm;
Pokitto 35:4f7edccf8ed6 368 #endif
Pokitto 31:f4b9b85c7b62 369 #endif
Pokitto 31:f4b9b85c7b62 370 #if POK_STREAMING_MUSIC > 0
Pokitto 31:f4b9b85c7b62 371 #if POK_STREAMFREQ_HALVE
Pokitto 31:f4b9b85c7b62 372 streamstep = 1-streamstep;
Pokitto 31:f4b9b85c7b62 373 #else
Pokitto 31:f4b9b85c7b62 374 streamstep = 1;
Pokitto 31:f4b9b85c7b62 375 #endif // POK_STREAMFREQ_HALVE
Pokitto 31:f4b9b85c7b62 376 streamstep &= streamon; // streamon is used to toggle SD music streaming on and off
Pokitto 31:f4b9b85c7b62 377 if (streamstep) {
Pokitto 31:f4b9b85c7b62 378 output = (*currentPtr++);
Pokitto 31:f4b9b85c7b62 379 if(streamvol && streamon) {
Pokitto 31:f4b9b85c7b62 380 output >>= 3-streamvol;
Pokitto 31:f4b9b85c7b62 381 streambyte = output;
Pokitto 31:f4b9b85c7b62 382 } else {
Pokitto 31:f4b9b85c7b62 383 streambyte = 0; // duty cycle
Pokitto 31:f4b9b85c7b62 384 output = 0;
Pokitto 31:f4b9b85c7b62 385 }
Pokitto 31:f4b9b85c7b62 386 if (currentPtr >= endPtr)
Pokitto 31:f4b9b85c7b62 387 {
Pokitto 31:f4b9b85c7b62 388 currentBuffer++;
Pokitto 31:f4b9b85c7b62 389 if (currentBuffer==4) currentBuffer=0;
Pokitto 31:f4b9b85c7b62 390 currentPtr = buffers[currentBuffer];
Pokitto 31:f4b9b85c7b62 391 endPtr = currentPtr + BUFFER_SIZE;
Pokitto 31:f4b9b85c7b62 392 }
Pokitto 31:f4b9b85c7b62 393 }
Pokitto 31:f4b9b85c7b62 394 #endif // POK_STREAMING_MUSIC
Pokitto 31:f4b9b85c7b62 395
Pokitto 31:f4b9b85c7b62 396 /** DO ADDITIONAL SOUND PROCESSING (NOT STREAM) OF SOUND HERE **/
Pokitto 31:f4b9b85c7b62 397
Pokitto 31:f4b9b85c7b62 398 #if POK_ENABLE_SYNTH
Pokitto 31:f4b9b85c7b62 399 /** if song is being played from sd **/
Pokitto 31:f4b9b85c7b62 400 if (playing) {
Pokitto 31:f4b9b85c7b62 401 notetick++;
Pokitto 35:4f7edccf8ed6 402 updatePlayback();
Pokitto 31:f4b9b85c7b62 403 }
Pokitto 31:f4b9b85c7b62 404 /** oscillators update **/
Pokitto 31:f4b9b85c7b62 405 osc1.count += osc1.cinc + (osc1.pitchbend >> 4); // counts to 65535 and overflows to zero WAS 8 !
Pokitto 31:f4b9b85c7b62 406 osc2.count += osc2.cinc + (osc2.pitchbend >> 4); // counts to 65535 and overflows to zero
Pokitto 31:f4b9b85c7b62 407 osc3.count += osc3.cinc + (osc3.pitchbend >> 4); // counts to 65535 and overflows to zero
Pokitto 31:f4b9b85c7b62 408 Marr[tick](); // call mixing function
Pokitto 31:f4b9b85c7b62 409 --tick;
Pokitto 31:f4b9b85c7b62 410
Pokitto 31:f4b9b85c7b62 411 /** mixing oscillator output **/
Pokitto 31:f4b9b85c7b62 412
Pokitto 31:f4b9b85c7b62 413 uint16_t op = (uint16_t) ((osc1.output)*(osc1.vol>>8))>>9;// >> 2 osc1.vol Marr;
Pokitto 31:f4b9b85c7b62 414 op += (uint16_t) ((osc2.output)*(osc2.vol>>8))>>9;// >> 2 osc1.vol Marr;
Pokitto 31:f4b9b85c7b62 415 op += (uint16_t) ((osc3.output)*(osc3.vol>>8))>>9;// >> 2 osc1.vol Marr;
Pokitto 31:f4b9b85c7b62 416 output = (uint8_t) op;
Pokitto 31:f4b9b85c7b62 417
Pokitto 31:f4b9b85c7b62 418 #endif // POK_ENABLE_SYNTH
Pokitto 31:f4b9b85c7b62 419
Pokitto 31:f4b9b85c7b62 420 #ifndef POK_SIM
Pokitto 31:f4b9b85c7b62 421 /** HARDWARE **/
Pokitto 31:f4b9b85c7b62 422 #if POK_ENABLE_SOUND > 0
Pokitto 31:f4b9b85c7b62 423 #if POK_STREAMING_MUSIC > 0
Pokitto 31:f4b9b85c7b62 424 /** sound is enabled, streaming is enabled */
Pokitto 31:f4b9b85c7b62 425 #if POK_STREAM_TO_DAC > 0
Pokitto 31:f4b9b85c7b62 426 /** stream goes to DAC */
Pokitto 31:f4b9b85c7b62 427 #if POK_USE_DAC > 0
Pokitto 35:4f7edccf8ed6 428 dac_write(streambyte>>__shw.headPhoneLevel); // duty cycle
Pokitto 31:f4b9b85c7b62 429 #endif // POK_USE_DAC
Pokitto 31:f4b9b85c7b62 430 #else
Pokitto 31:f4b9b85c7b62 431 /** stream goes to PWM */
Pokitto 31:f4b9b85c7b62 432 if (streamstep) {
Pokitto 31:f4b9b85c7b62 433 //pwmout_write(&audiopwm,(float)streambyte/(float)255);
Pokitto 35:4f7edccf8ed6 434 #if POK_USE_PWM
Pokitto 35:4f7edccf8ed6 435 uint32_t t_on = (uint32_t)((((obj->pwm->MATCHREL0)*streambyte)>>8)>>__shw.headPhoneLevel); //cut out float
Pokitto 31:f4b9b85c7b62 436 obj->pwm->MATCHREL1 = t_on;
Pokitto 35:4f7edccf8ed6 437 #endif
Pokitto 31:f4b9b85c7b62 438 //dac_write((uint8_t)streambyte); // duty cycle
Pokitto 31:f4b9b85c7b62 439 }
Pokitto 31:f4b9b85c7b62 440 #endif // POK_STREAM_TO_DAC
Pokitto 31:f4b9b85c7b62 441 #endif // POK_STREAMING_MUSIC
Pokitto 31:f4b9b85c7b62 442 #if POK_STREAM_TO_DAC > 0
Pokitto 35:4f7edccf8ed6 443 /** synth goes to PWM */
Pokitto 35:4f7edccf8ed6 444 //pwmout_write(&audiopwm,(float)output/(float)255);
Pokitto 35:4f7edccf8ed6 445 #if POK_USE_PWM
Pokitto 35:4f7edccf8ed6 446 uint32_t t_on = (uint32_t)((((obj->pwm->MATCHREL0)*output)>>8)>>__shw.headPhoneLevel); //cut out float
Pokitto 35:4f7edccf8ed6 447 obj->pwm->MATCHREL1 = t_on;
Pokitto 35:4f7edccf8ed6 448 #endif
Pokitto 35:4f7edccf8ed6 449 #else // POK_STREAMING_MUSIC
Pokitto 35:4f7edccf8ed6 450 dac_write((uint8_t)output>>__shw.headPhoneLevel); // SYNTH to DAC
Pokitto 35:4f7edccf8ed6 451 #endif
Pokitto 31:f4b9b85c7b62 452 soundbyte = (output+streambyte)>>1;
Pokitto 31:f4b9b85c7b62 453 soundbuf[soundbufindex++]=soundbyte;
Pokitto 35:4f7edccf8ed6 454 if (soundbufindex==256) soundbufindex=0;
Pokitto 31:f4b9b85c7b62 455 #endif //POK_ENABLE_SOUND
Pokitto 31:f4b9b85c7b62 456 #endif // HARDWARE
Pokitto 35:4f7edccf8ed6 457 #endif //POK_ENABLE_SOUND
Pokitto 31:f4b9b85c7b62 458 }
Pokitto 31:f4b9b85c7b62 459
Pokitto 31:f4b9b85c7b62 460
Pokitto 31:f4b9b85c7b62 461 void Pokitto::updateSDAudioStream() {
Pokitto 35:4f7edccf8ed6 462 #ifndef NOPETITFATFS
Pokitto 31:f4b9b85c7b62 463 if (streamPaused()) return;
Pokitto 31:f4b9b85c7b62 464
Pokitto 31:f4b9b85c7b62 465 #if POK_STREAMING_MUSIC > 0
Pokitto 31:f4b9b85c7b62 466 if (oldBuffer != currentBuffer) {
Pokitto 31:f4b9b85c7b62 467 if (currentBuffer==0) fileReadBytes(&buffers[3][0],BUFFER_SIZE);
Pokitto 31:f4b9b85c7b62 468 else if (currentBuffer==1) fileReadBytes(&buffers[0][0],BUFFER_SIZE);
Pokitto 31:f4b9b85c7b62 469 else if (currentBuffer==2) fileReadBytes(&buffers[1][0],BUFFER_SIZE);
Pokitto 31:f4b9b85c7b62 470 else fileReadBytes(&buffers[2][0],BUFFER_SIZE);
Pokitto 31:f4b9b85c7b62 471 oldBuffer = currentBuffer;
Pokitto 31:f4b9b85c7b62 472 streamcounter += BUFFER_SIZE;
Pokitto 31:f4b9b85c7b62 473 } else return;
Pokitto 31:f4b9b85c7b62 474
Pokitto 31:f4b9b85c7b62 475 #ifndef POK_SIM
Pokitto 31:f4b9b85c7b62 476 if ( streamcounter > fs.fsize - (BUFFER_SIZE*6)) {
Pokitto 31:f4b9b85c7b62 477 #else
Pokitto 31:f4b9b85c7b62 478 if ( streamcounter > getFileLength() - (BUFFER_SIZE*6)) {
Pokitto 31:f4b9b85c7b62 479 #endif
Pokitto 31:f4b9b85c7b62 480 streamcounter=0;
Pokitto 31:f4b9b85c7b62 481 #if POK_STREAM_LOOP
Pokitto 31:f4b9b85c7b62 482 fileRewind();
Pokitto 31:f4b9b85c7b62 483 #else
Pokitto 31:f4b9b85c7b62 484 pokPauseStream();
Pokitto 31:f4b9b85c7b62 485 #endif
Pokitto 31:f4b9b85c7b62 486 }
Pokitto 31:f4b9b85c7b62 487 #endif
Pokitto 35:4f7edccf8ed6 488 #endif // NOPETITFATFS
Pokitto 31:f4b9b85c7b62 489 }
Pokitto 31:f4b9b85c7b62 490
Pokitto 31:f4b9b85c7b62 491
Pokitto 31:f4b9b85c7b62 492 #endif // POK_ENABLE_SOUND
Pokitto 31:f4b9b85c7b62 493
Pokitto 31:f4b9b85c7b62 494
Pokitto 31:f4b9b85c7b62 495