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

Committer:
spinal
Date:
Sun Nov 18 15:47:54 2018 +0000
Revision:
64:6e6c6c2b664e
Parent:
31:f4b9b85c7b62
added fix for directrectangle()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pokitto 31:f4b9b85c7b62 1 /**************************************************************************/
Pokitto 31:f4b9b85c7b62 2 /*!
Pokitto 31:f4b9b85c7b62 3 @file Synth_songfuncs.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 "PokittoDisk.h"
Pokitto 31:f4b9b85c7b62 38 #include "Synth.h"
Pokitto 31:f4b9b85c7b62 39 #ifdef POK_SIM
Pokitto 31:f4b9b85c7b62 40 #include "FileIO.h"
Pokitto 31:f4b9b85c7b62 41 #endif
Pokitto 31:f4b9b85c7b62 42
Pokitto 31:f4b9b85c7b62 43 /** SONG FUNCTIONS **/
Pokitto 31:f4b9b85c7b62 44
Pokitto 31:f4b9b85c7b62 45 //uint8_t chunk1[CHUNKSIZE], chunk2[CHUNKSIZE]; // 8 rows, 3 channels (columns), 2 bytes per entry
Pokitto 31:f4b9b85c7b62 46 uint8_t chunk[2][CHUNKSIZE]; // 8 rows, 3 channels (columns), 2 bytes per entry
Pokitto 31:f4b9b85c7b62 47 uint8_t cc = 0;
Pokitto 31:f4b9b85c7b62 48
Pokitto 31:f4b9b85c7b62 49
Pokitto 31:f4b9b85c7b62 50 #if POK_ENABLE_SOUND > 0
Pokitto 31:f4b9b85c7b62 51 #if POK_ENABLE_SD > 0
Pokitto 31:f4b9b85c7b62 52 void updatePlaybackSD(uint8_t row) {
Pokitto 31:f4b9b85c7b62 53 // samplespertick determines how long the oscillators are active before they are recalculated (i.e. the next tick
Pokitto 31:f4b9b85c7b62 54 uint8_t i=0;
Pokitto 31:f4b9b85c7b62 55
Pokitto 31:f4b9b85c7b62 56 if (notetick > samplespertick ) {
Pokitto 31:f4b9b85c7b62 57 // TRACK 1
Pokitto 31:f4b9b85c7b62 58 //if (track1on) i = *song.instrument_stream[0];
Pokitto 31:f4b9b85c7b62 59 i = 0xF;
Pokitto 31:f4b9b85c7b62 60 if (track1on) i = chunk[cc][row+1]>>4;
Pokitto 31:f4b9b85c7b62 61 if (i!=0xF) {
Pokitto 31:f4b9b85c7b62 62 setOSC(&osc1,1,patch[i].wave,patch[i].loop, patch[i].echo, patch[i].adsr,
Pokitto 31:f4b9b85c7b62 63 chunk[cc][row],patch[i].vol,
Pokitto 31:f4b9b85c7b62 64 patch[i].attack, patch[i].decay, patch[i].sustain,patch[i].release,
Pokitto 31:f4b9b85c7b62 65 patch[i].maxbend, patch[i].bendrate, patch[i].arpmode, patch[i].overdrive, patch[i].kick );
Pokitto 31:f4b9b85c7b62 66 }
Pokitto 31:f4b9b85c7b62 67 // TRACK 2
Pokitto 31:f4b9b85c7b62 68 //if (track2on) i = *song.instrument_stream[1];
Pokitto 31:f4b9b85c7b62 69 i = 0xF;
Pokitto 31:f4b9b85c7b62 70 if (track2on) i = chunk[cc][row+3]>>4;
Pokitto 31:f4b9b85c7b62 71 if (i!=0xF) {
Pokitto 31:f4b9b85c7b62 72 setOSC(&osc2,1,patch[i].wave,patch[i].loop, patch[i].echo, patch[i].adsr,
Pokitto 31:f4b9b85c7b62 73 chunk[cc][row+2],patch[i].vol,
Pokitto 31:f4b9b85c7b62 74 patch[i].attack, patch[i].decay, patch[i].sustain,patch[i].release,
Pokitto 31:f4b9b85c7b62 75 patch[i].maxbend, patch[i].bendrate, patch[i].arpmode, patch[i].overdrive, patch[i].kick );
Pokitto 31:f4b9b85c7b62 76 }
Pokitto 31:f4b9b85c7b62 77 // TRACK 3
Pokitto 31:f4b9b85c7b62 78 i = 0xF;
Pokitto 31:f4b9b85c7b62 79 if (track3on) i = chunk[cc][row+5]>>4;
Pokitto 31:f4b9b85c7b62 80 if (i!=0xF) {
Pokitto 31:f4b9b85c7b62 81 setOSC(&osc3,1,patch[i].wave,patch[i].loop, patch[i].echo, patch[i].adsr,
Pokitto 31:f4b9b85c7b62 82 chunk[cc][row]+4,patch[i].vol,
Pokitto 31:f4b9b85c7b62 83 patch[i].attack, patch[i].decay, patch[i].sustain,patch[i].release,
Pokitto 31:f4b9b85c7b62 84 patch[i].maxbend, patch[i].bendrate, patch[i].arpmode, patch[i].overdrive, patch[i].kick );
Pokitto 31:f4b9b85c7b62 85 }
Pokitto 31:f4b9b85c7b62 86 playerpos++;
Pokitto 31:f4b9b85c7b62 87 if (playerpos == PATTERNLENGTH) {
Pokitto 31:f4b9b85c7b62 88 // move to next song position
Pokitto 31:f4b9b85c7b62 89 playerpos = 0;
Pokitto 31:f4b9b85c7b62 90 /*sequencepos++;
Pokitto 31:f4b9b85c7b62 91 if (sequencepos > song.song_end) {
Pokitto 31:f4b9b85c7b62 92 if (song.song_loop == -1) {
Pokitto 31:f4b9b85c7b62 93 emptyOscillators();
Pokitto 31:f4b9b85c7b62 94 playing = false;
Pokitto 31:f4b9b85c7b62 95 sequencepos--;
Pokitto 31:f4b9b85c7b62 96 } else {
Pokitto 31:f4b9b85c7b62 97 sequencepos = song.song_loop;
Pokitto 31:f4b9b85c7b62 98 }
Pokitto 31:f4b9b85c7b62 99 }
Pokitto 31:f4b9b85c7b62 100 playerpos = 0;
Pokitto 31:f4b9b85c7b62 101 initStreams(sequencepos);
Pokitto 31:f4b9b85c7b62 102 tableRefresh=true;*/
Pokitto 31:f4b9b85c7b62 103 }
Pokitto 31:f4b9b85c7b62 104 notetick =0;
Pokitto 31:f4b9b85c7b62 105 }
Pokitto 31:f4b9b85c7b62 106 }
Pokitto 31:f4b9b85c7b62 107
Pokitto 31:f4b9b85c7b62 108 void updatePlayback() {
Pokitto 31:f4b9b85c7b62 109 // samplespertick determines how long the oscillators are active before they are recalculated (i.e. the next tick
Pokitto 31:f4b9b85c7b62 110 uint8_t i=0;
Pokitto 31:f4b9b85c7b62 111
Pokitto 31:f4b9b85c7b62 112 if (notetick > samplespertick ) {
Pokitto 31:f4b9b85c7b62 113 // TRACK 1
Pokitto 31:f4b9b85c7b62 114 if (track1on) i = *song.instrument_stream[0];
Pokitto 31:f4b9b85c7b62 115 else i = 0;
Pokitto 31:f4b9b85c7b62 116 if (i) {
Pokitto 31:f4b9b85c7b62 117 setOSC(&osc1,1,patch[i].wave,patch[i].loop, patch[i].echo, patch[i].adsr,
Pokitto 31:f4b9b85c7b62 118 *song.note_stream[0],patch[i].vol,
Pokitto 31:f4b9b85c7b62 119 patch[i].attack, patch[i].decay, patch[i].sustain,patch[i].release,
Pokitto 31:f4b9b85c7b62 120 patch[i].maxbend, patch[i].bendrate, patch[i].arpmode, patch[i].overdrive, patch[i].kick );
Pokitto 31:f4b9b85c7b62 121 }
Pokitto 31:f4b9b85c7b62 122 // TRACK 2
Pokitto 31:f4b9b85c7b62 123 if (track2on) i = *song.instrument_stream[1];
Pokitto 31:f4b9b85c7b62 124 else i = 0;
Pokitto 31:f4b9b85c7b62 125 if (i) {
Pokitto 31:f4b9b85c7b62 126 setOSC(&osc2,1,patch[i].wave,patch[i].loop, patch[i].echo, patch[i].adsr,
Pokitto 31:f4b9b85c7b62 127 *song.note_stream[1],patch[i].vol,
Pokitto 31:f4b9b85c7b62 128 patch[i].attack, patch[i].decay, patch[i].sustain,patch[i].release,
Pokitto 31:f4b9b85c7b62 129 patch[i].maxbend, patch[i].bendrate, patch[i].arpmode, patch[i].overdrive, patch[i].kick );
Pokitto 31:f4b9b85c7b62 130 }
Pokitto 31:f4b9b85c7b62 131 // TRACK 3
Pokitto 31:f4b9b85c7b62 132 if (track3on) i = *song.instrument_stream[2];
Pokitto 31:f4b9b85c7b62 133 else i = 0;
Pokitto 31:f4b9b85c7b62 134 if (i) {
Pokitto 31:f4b9b85c7b62 135 setOSC(&osc3,1,patch[i].wave,patch[i].loop, patch[i].echo, patch[i].adsr,
Pokitto 31:f4b9b85c7b62 136 *song.note_stream[2],patch[i].vol,
Pokitto 31:f4b9b85c7b62 137 patch[i].attack, patch[i].decay, patch[i].sustain,patch[i].release,
Pokitto 31:f4b9b85c7b62 138 patch[i].maxbend, patch[i].bendrate, patch[i].arpmode, patch[i].overdrive, patch[i].kick );
Pokitto 31:f4b9b85c7b62 139 }
Pokitto 31:f4b9b85c7b62 140 playerpos++;
Pokitto 31:f4b9b85c7b62 141 song.instrument_stream[0]++;
Pokitto 31:f4b9b85c7b62 142 song.note_stream[0]++;
Pokitto 31:f4b9b85c7b62 143 song.instrument_stream[1]++;
Pokitto 31:f4b9b85c7b62 144 song.note_stream[1]++;
Pokitto 31:f4b9b85c7b62 145 song.instrument_stream[2]++;
Pokitto 31:f4b9b85c7b62 146 song.note_stream[2]++;
Pokitto 31:f4b9b85c7b62 147 if (playerpos == PATTERNLENGTH) {
Pokitto 31:f4b9b85c7b62 148 // move to next song position
Pokitto 31:f4b9b85c7b62 149 sequencepos++;
Pokitto 31:f4b9b85c7b62 150 if (sequencepos > song.song_end) {
Pokitto 31:f4b9b85c7b62 151 if (song.song_loop == -1) {
Pokitto 31:f4b9b85c7b62 152 emptyOscillators();
Pokitto 31:f4b9b85c7b62 153 playing = false;
Pokitto 31:f4b9b85c7b62 154 sequencepos--;
Pokitto 31:f4b9b85c7b62 155 } else {
Pokitto 31:f4b9b85c7b62 156 sequencepos = song.song_loop;
Pokitto 31:f4b9b85c7b62 157 }
Pokitto 31:f4b9b85c7b62 158 }
Pokitto 31:f4b9b85c7b62 159 playerpos = 0;
Pokitto 31:f4b9b85c7b62 160 initStreams(sequencepos);
Pokitto 31:f4b9b85c7b62 161 tableRefresh=true;
Pokitto 31:f4b9b85c7b62 162 }
Pokitto 31:f4b9b85c7b62 163 notetick =0;
Pokitto 31:f4b9b85c7b62 164 }
Pokitto 31:f4b9b85c7b62 165 }
Pokitto 31:f4b9b85c7b62 166
Pokitto 31:f4b9b85c7b62 167 void emptyPatches(){
Pokitto 31:f4b9b85c7b62 168 for (int i=0; i<16; i++) {
Pokitto 31:f4b9b85c7b62 169 patch[i].vol = 127;
Pokitto 31:f4b9b85c7b62 170 patch[i].on = true; patch[i].wave = 1; patch[i].echo = 0; patch[i].count = 0; patch[i].cinc =0;
Pokitto 31:f4b9b85c7b62 171 patch[i].attack = 0; patch[i].loop = 0; patch[i].adsrphase = 0; patch[i].adsr = 0; patch[i].decay = 20;
Pokitto 31:f4b9b85c7b62 172 patch[i].pitchbend = 0; patch[i].bendrate = 0; patch[i].maxbend = 0; patch[i].sustain = 0; patch[i].release = 0, patch[i].overdrive = 0, patch[i].kick = 0;
Pokitto 31:f4b9b85c7b62 173 }
Pokitto 31:f4b9b85c7b62 174 }
Pokitto 31:f4b9b85c7b62 175
Pokitto 31:f4b9b85c7b62 176 void emptyBlocks(){
Pokitto 31:f4b9b85c7b62 177 for (int i=0; i<MAXBLOCKS; i++) {
Pokitto 31:f4b9b85c7b62 178 for (int j = 0; j < PATTERNLENGTH; j++) {
Pokitto 31:f4b9b85c7b62 179 block[i].instrument[j] = 0;
Pokitto 31:f4b9b85c7b62 180 block[i].notenumber[j] = 255;
Pokitto 31:f4b9b85c7b62 181 }
Pokitto 31:f4b9b85c7b62 182 }
Pokitto 31:f4b9b85c7b62 183 }
Pokitto 31:f4b9b85c7b62 184
Pokitto 31:f4b9b85c7b62 185 void initStreams(uint8_t seqpos){
Pokitto 31:f4b9b85c7b62 186 uint8_t blocknum;
Pokitto 31:f4b9b85c7b62 187 // retarget pointers for track 1
Pokitto 31:f4b9b85c7b62 188 // byte = pgm_read_byte(&(mydata[i][j]));
Pokitto 31:f4b9b85c7b62 189 blocknum=song.block_sequence[0][seqpos];
Pokitto 31:f4b9b85c7b62 190 //blocknum=pgm_read_byte(Song+SONG_SEQUENCE+seqpos);
Pokitto 31:f4b9b85c7b62 191 song.instrument_stream[0]=&block[blocknum].instrument[0];
Pokitto 31:f4b9b85c7b62 192 song.note_stream[0]=&block[blocknum].notenumber[0];
Pokitto 31:f4b9b85c7b62 193 // retarget pointers for track 2
Pokitto 31:f4b9b85c7b62 194 blocknum=song.block_sequence[1][seqpos];
Pokitto 31:f4b9b85c7b62 195 song.instrument_stream[1]=&block[blocknum].instrument[0];
Pokitto 31:f4b9b85c7b62 196 song.note_stream[1]=&block[blocknum].notenumber[0];
Pokitto 31:f4b9b85c7b62 197 // retarget pointers for track 3
Pokitto 31:f4b9b85c7b62 198 blocknum=song.block_sequence[2][seqpos];
Pokitto 31:f4b9b85c7b62 199 song.instrument_stream[2]=&block[blocknum].instrument[0];
Pokitto 31:f4b9b85c7b62 200 song.note_stream[2]=&block[blocknum].notenumber[0];
Pokitto 31:f4b9b85c7b62 201 }
Pokitto 31:f4b9b85c7b62 202
Pokitto 31:f4b9b85c7b62 203 void emptySong(){
Pokitto 31:f4b9b85c7b62 204 song.num_channels = 3;
Pokitto 31:f4b9b85c7b62 205 song.num_patches = 1;
Pokitto 31:f4b9b85c7b62 206 song.song_bpm = 120;
Pokitto 31:f4b9b85c7b62 207 song.num_patterns = 1;
Pokitto 31:f4b9b85c7b62 208 song.song_end = 0;
Pokitto 31:f4b9b85c7b62 209 song.song_loop = 0; // loop back to start
Pokitto 31:f4b9b85c7b62 210 song.rb_version = RBTRACKER_VERSION;
Pokitto 31:f4b9b85c7b62 211 for (uint8_t i = 0; i<10; i++) {
Pokitto 31:f4b9b85c7b62 212 song.block_sequence[0][i]=i*3; // track 1
Pokitto 31:f4b9b85c7b62 213 song.block_sequence[1][i]=i*3+1; // track 2
Pokitto 31:f4b9b85c7b62 214 song.block_sequence[2][i]=i*3+2; // track 3
Pokitto 31:f4b9b85c7b62 215 }
Pokitto 31:f4b9b85c7b62 216 song.instrument_stream[0] = &block[0].instrument[0];
Pokitto 31:f4b9b85c7b62 217 song.note_stream[0] = &block[0].notenumber[0];
Pokitto 31:f4b9b85c7b62 218 song.instrument_stream[1] = &block[1].instrument[0];
Pokitto 31:f4b9b85c7b62 219 song.note_stream[1] = &block[1].notenumber[0];
Pokitto 31:f4b9b85c7b62 220 song.instrument_stream[2] = &block[2].instrument[0];
Pokitto 31:f4b9b85c7b62 221 song.note_stream[2] = &block[2].notenumber[0];
Pokitto 31:f4b9b85c7b62 222 sequencepos = 0;
Pokitto 31:f4b9b85c7b62 223 }
Pokitto 31:f4b9b85c7b62 224
Pokitto 31:f4b9b85c7b62 225 int openSongFromSD(char* buffer) {
Pokitto 31:f4b9b85c7b62 226 if (!isThisFileOpen(buffer)) {
Pokitto 31:f4b9b85c7b62 227 fileClose(); // close any open files
Pokitto 31:f4b9b85c7b62 228 fileOpen(buffer,FILE_MODE_OVERWRITE | FILE_MODE_BINARY);
Pokitto 31:f4b9b85c7b62 229 }
Pokitto 31:f4b9b85c7b62 230 return isThisFileOpen(buffer);
Pokitto 31:f4b9b85c7b62 231 }
Pokitto 31:f4b9b85c7b62 232
Pokitto 31:f4b9b85c7b62 233 void writeChunkToSD(uint8_t* buffer) {
Pokitto 31:f4b9b85c7b62 234 if (fileOK()) {
Pokitto 31:f4b9b85c7b62 235 fileWriteBytes(buffer, CHUNKSIZE);
Pokitto 31:f4b9b85c7b62 236 }
Pokitto 31:f4b9b85c7b62 237 }
Pokitto 31:f4b9b85c7b62 238
Pokitto 31:f4b9b85c7b62 239 void readChunkFromSD(uint8_t* buffer) {
Pokitto 31:f4b9b85c7b62 240 if (fileOK()) {
Pokitto 31:f4b9b85c7b62 241 fileReadBytes(buffer, CHUNKSIZE);
Pokitto 31:f4b9b85c7b62 242 }
Pokitto 31:f4b9b85c7b62 243 }
Pokitto 31:f4b9b85c7b62 244 #endif
Pokitto 31:f4b9b85c7b62 245 #endif // POK_ENABLE_SOUND
Pokitto 31:f4b9b85c7b62 246
Pokitto 31:f4b9b85c7b62 247