PokittoLib is the library needed for programming the Pokitto DIY game console (www.pokitto.com)

Committer:
Pokitto
Date:
Mon Apr 02 22:37:04 2018 +0000
Revision:
35:4f7edccf8ed6
Parent:
34:427237571c6a
All changes synced with Github repo (mode 13, mode 15 etc.)

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