PCM Digital Synthesizer

Dependencies:   LCD mbed

/media/uploads/p_igmon/img_1731-w480.jpg

Committer:
p_igmon
Date:
Fri Sep 02 13:24:16 2016 +0000
Revision:
0:ad6637c36dc7
for Micro Gen4 Synthesizer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
p_igmon 0:ad6637c36dc7 1 #include "synthesizer.h"
p_igmon 0:ad6637c36dc7 2
p_igmon 0:ad6637c36dc7 3 /*
p_igmon 0:ad6637c36dc7 4 Sector 0 0x0800 0000 - 0x0800 3FFF 16 Kbytes
p_igmon 0:ad6637c36dc7 5 Sector 1 0x0800 4000 - 0x0800 7FFF 16 Kbytes
p_igmon 0:ad6637c36dc7 6 Sector 2 0x0800 8000 - 0x0800 BFFF 16 Kbytes
p_igmon 0:ad6637c36dc7 7 Sector 3 0x0800 C000 - 0x0800 FFFF 16 Kbytes
p_igmon 0:ad6637c36dc7 8 Sector 4 0x0801 0000 - 0x0801 FFFF 64 Kbytes
p_igmon 0:ad6637c36dc7 9 Sector 5 0x0802 0000 - 0x0803 FFFF 128 Kbytes
p_igmon 0:ad6637c36dc7 10 Sector 6 0x0804 0000 - 0x0805 FFFF 128 Kbytes
p_igmon 0:ad6637c36dc7 11 Sector 7 0x0806 0000 - 0x0807 FFFF 128 Kbytes
p_igmon 0:ad6637c36dc7 12 */
p_igmon 0:ad6637c36dc7 13 extern Serial pc;
p_igmon 0:ad6637c36dc7 14 //extern RawSerial pc;
p_igmon 0:ad6637c36dc7 15
p_igmon 0:ad6637c36dc7 16 extern U32 PresetVoiceAmount;
p_igmon 0:ad6637c36dc7 17 extern U32 SGenAmount;
p_igmon 0:ad6637c36dc7 18
p_igmon 0:ad6637c36dc7 19 extern U8 PresetVoiceNum;
p_igmon 0:ad6637c36dc7 20 extern U8 MidiChannel;
p_igmon 0:ad6637c36dc7 21 extern U16 MasterVolume;
p_igmon 0:ad6637c36dc7 22 extern S8 MasterTune;
p_igmon 0:ad6637c36dc7 23 extern U8 midi_base_ch;
p_igmon 0:ad6637c36dc7 24 extern int rch_pol;
p_igmon 0:ad6637c36dc7 25
p_igmon 0:ad6637c36dc7 26 extern WaveDef Wave[];
p_igmon 0:ad6637c36dc7 27 extern PresetVoiceDef PresetVoice[];
p_igmon 0:ad6637c36dc7 28 extern GENERATOR sgen[];
p_igmon 0:ad6637c36dc7 29
p_igmon 0:ad6637c36dc7 30 void FROM_WriteBlock(uint32_t MemAddress , uint32_t FromAddress ,uint32_t datalength){
p_igmon 0:ad6637c36dc7 31 uint32_t *SrcAddress = (uint32_t *)MemAddress;
p_igmon 0:ad6637c36dc7 32 uint32_t *DstAddress = (uint32_t *)FromAddress;
p_igmon 0:ad6637c36dc7 33 HAL_FLASH_Unlock();
p_igmon 0:ad6637c36dc7 34 HAL_FLASH_OB_Unlock();
p_igmon 0:ad6637c36dc7 35 datalength >>= 2;
p_igmon 0:ad6637c36dc7 36 while(datalength--){
p_igmon 0:ad6637c36dc7 37 HAL_StatusTypeDef status = HAL_FLASH_Program(TYPEPROGRAM_WORD, (uint32_t)DstAddress++, *SrcAddress++);
p_igmon 0:ad6637c36dc7 38 if (status != HAL_OK){
p_igmon 0:ad6637c36dc7 39 pc.printf("FLASH->CR = 0x%4x \n\r",FLASH->CR);
p_igmon 0:ad6637c36dc7 40 pc.printf("FLASH->SR = 0x%4x \n\r",FLASH->SR);// PGPERR: Programming parallelism error
p_igmon 0:ad6637c36dc7 41 pc.printf("FLASH->OPTCR = 0x%4x \n\r",FLASH->OPTCR);
p_igmon 0:ad6637c36dc7 42 return ;
p_igmon 0:ad6637c36dc7 43 }
p_igmon 0:ad6637c36dc7 44 }
p_igmon 0:ad6637c36dc7 45 HAL_FLASH_Lock();
p_igmon 0:ad6637c36dc7 46 }
p_igmon 0:ad6637c36dc7 47
p_igmon 0:ad6637c36dc7 48
p_igmon 0:ad6637c36dc7 49 void save2from(void){
p_igmon 0:ad6637c36dc7 50 U32 temp;
p_igmon 0:ad6637c36dc7 51 HAL_StatusTypeDef status;
p_igmon 0:ad6637c36dc7 52
p_igmon 0:ad6637c36dc7 53 HAL_FLASH_Unlock();// for Erase
p_igmon 0:ad6637c36dc7 54 HAL_FLASH_OB_Unlock();// for Erase
p_igmon 0:ad6637c36dc7 55 FLASH_Erase_Sector(FLASH_SECTOR_3, VOLTAGE_RANGE_3);// FLASH_SECTOR_0-7
p_igmon 0:ad6637c36dc7 56 FROM_WriteBlock((uint32_t) &Wave[0] , (uint32_t)Flash_Wave_Address ,(uint32_t)Flash_Wave_Len);
p_igmon 0:ad6637c36dc7 57 FROM_WriteBlock((uint32_t) &PresetVoice[0] , (uint32_t)Flash_PresetVoice_Address ,(uint32_t)Flash_PresetVoice_Len);
p_igmon 0:ad6637c36dc7 58 FROM_WriteBlock((uint32_t) &sgen[0] , (uint32_t)Flash_Generator_Address ,(uint32_t)Flash_Generator_Len);
p_igmon 0:ad6637c36dc7 59
p_igmon 0:ad6637c36dc7 60 temp = (PresetVoiceNum<<24) |(MasterTune<<16) |(MasterVolume & 0x7f00) | (MidiChannel & 0x0f);
p_igmon 0:ad6637c36dc7 61 HAL_FLASH_Unlock();
p_igmon 0:ad6637c36dc7 62 HAL_FLASH_OB_Unlock();
p_igmon 0:ad6637c36dc7 63 status = HAL_FLASH_Program(TYPEPROGRAM_WORD, (uint32_t)Flash_System_Address , temp);
p_igmon 0:ad6637c36dc7 64 if (status != HAL_OK){
p_igmon 0:ad6637c36dc7 65 pc.printf("System Write FLASH->SR = 0x%4x \n\r",FLASH->SR);// PGPERR: Programming parallelism error
p_igmon 0:ad6637c36dc7 66 }
p_igmon 0:ad6637c36dc7 67 temp = rch_pol;// & 0xffff;
p_igmon 0:ad6637c36dc7 68 status = HAL_FLASH_Program(TYPEPROGRAM_WORD, (uint32_t)((uint32_t *)Flash_System_Address + 1) , temp);
p_igmon 0:ad6637c36dc7 69 if (status != HAL_OK){
p_igmon 0:ad6637c36dc7 70 pc.printf("System Write2 FLASH->SR = 0x%4x \n\r",FLASH->SR);// PGPERR: Programming parallelism error
p_igmon 0:ad6637c36dc7 71 }
p_igmon 0:ad6637c36dc7 72
p_igmon 0:ad6637c36dc7 73 HAL_FLASH_Lock();
p_igmon 0:ad6637c36dc7 74
p_igmon 0:ad6637c36dc7 75 }
p_igmon 0:ad6637c36dc7 76
p_igmon 0:ad6637c36dc7 77 void FROM_ReadBlock(uint32_t *MemAddress , uint32_t *FromAddress ,int datalength){
p_igmon 0:ad6637c36dc7 78 memcpy (MemAddress ,FromAddress ,datalength);
p_igmon 0:ad6637c36dc7 79 }
p_igmon 0:ad6637c36dc7 80
p_igmon 0:ad6637c36dc7 81 void load2from(void){
p_igmon 0:ad6637c36dc7 82 // FROM_ReadBlock((uint32_t *) &Wave[0] , (uint32_t *)Flash_Wave_Address ,(U32)&Wave[99]-(U32)&Wave[0]+sizeof(WaveDef));
p_igmon 0:ad6637c36dc7 83 /*
p_igmon 0:ad6637c36dc7 84 FROM_ReadBlock((uint32_t *) &PresetVoice[0] , (uint32_t *)Flash_PresetVoice_Address ,(U32)&PresetVoice[63]-(U32)&PresetVoice[0]+sizeof(PresetVoiceDef));
p_igmon 0:ad6637c36dc7 85 FROM_ReadBlock((uint32_t *) &sgen[0] , (uint32_t *)Flash_Generator_Address ,(U32)&sgen[PRGGENMAX * 64-1]-(U32)&sgen[0]+sizeof(GENERATOR));
p_igmon 0:ad6637c36dc7 86 */
p_igmon 0:ad6637c36dc7 87 FROM_ReadBlock((uint32_t *) &PresetVoice[0] , (uint32_t *)Flash_PresetVoice_Address, PresetVoiceAmount);
p_igmon 0:ad6637c36dc7 88 FROM_ReadBlock((uint32_t *) &sgen[0] , (uint32_t *)Flash_Generator_Address , SGenAmount);
p_igmon 0:ad6637c36dc7 89
p_igmon 0:ad6637c36dc7 90 U32 temp = *Flash_System_Address;
p_igmon 0:ad6637c36dc7 91 PresetVoiceNum = (U8)((temp>>24) & 0x7f);
p_igmon 0:ad6637c36dc7 92 MasterTune = (S8)((temp>>16)& 0xff);
p_igmon 0:ad6637c36dc7 93 MasterVolume = (U16)(temp & 0x7f00);
p_igmon 0:ad6637c36dc7 94 MidiChannel = (U8)(temp & 0x0f);
p_igmon 0:ad6637c36dc7 95 midi_base_ch = MidiChannel - 1;
p_igmon 0:ad6637c36dc7 96
p_igmon 0:ad6637c36dc7 97 temp = *(Flash_System_Address + 1);
p_igmon 0:ad6637c36dc7 98 rch_pol = (int)temp;
p_igmon 0:ad6637c36dc7 99 }
p_igmon 0:ad6637c36dc7 100
p_igmon 0:ad6637c36dc7 101
p_igmon 0:ad6637c36dc7 102 int get_wave_addr (WaveDef *wave){
p_igmon 0:ad6637c36dc7 103 WaveDef *wavea = wave;
p_igmon 0:ad6637c36dc7 104 uint8_t *ptr = (uint8_t *)Flash_WaveData_Address;
p_igmon 0:ad6637c36dc7 105 uint8_t *next_ptr;
p_igmon 0:ad6637c36dc7 106 GEN4_CHUNK *Gen4Chunk;
p_igmon 0:ad6637c36dc7 107 int n;
p_igmon 0:ad6637c36dc7 108 int num = 0;
p_igmon 0:ad6637c36dc7 109
p_igmon 0:ad6637c36dc7 110 while(1){
p_igmon 0:ad6637c36dc7 111 /* RIFF ? */
p_igmon 0:ad6637c36dc7 112 if(! ((*ptr == 'R') && (*(ptr+1) =='I') && (*(ptr+2) =='F') && (*(ptr+3) =='F')) ) return -1;
p_igmon 0:ad6637c36dc7 113 ptr += 4;
p_igmon 0:ad6637c36dc7 114 /* get next waveaddress */
p_igmon 0:ad6637c36dc7 115 next_ptr = (uint8_t *)((*(ptr+3)<<24)|(*(ptr+2)<<16)|(*(ptr+1)<<8)|(*ptr));
p_igmon 0:ad6637c36dc7 116 ptr += 4;
p_igmon 0:ad6637c36dc7 117 next_ptr += (uint32_t )ptr;
p_igmon 0:ad6637c36dc7 118
p_igmon 0:ad6637c36dc7 119 /* WAVE ? */
p_igmon 0:ad6637c36dc7 120 if(! ((*ptr == 'W') && (*(ptr+1) =='A') && (*(ptr+2) =='V') && (*(ptr+3) =='E')) ) return -2;
p_igmon 0:ad6637c36dc7 121
p_igmon 0:ad6637c36dc7 122 /* Search gen4 */
p_igmon 0:ad6637c36dc7 123 ptr += 4;
p_igmon 0:ad6637c36dc7 124 n = 64;
p_igmon 0:ad6637c36dc7 125 while (n-- > 0){
p_igmon 0:ad6637c36dc7 126 if ((*ptr == 'g') && (*(ptr+1) =='e') && (*(ptr+2) =='n') && (*(ptr+3) =='4')) break;
p_igmon 0:ad6637c36dc7 127 ptr++;
p_igmon 0:ad6637c36dc7 128 }
p_igmon 0:ad6637c36dc7 129 if (n == 0)return -4;
p_igmon 0:ad6637c36dc7 130
p_igmon 0:ad6637c36dc7 131 // printf("0x%x 0x%x\r\n",ptr,*ptr);
p_igmon 0:ad6637c36dc7 132
p_igmon 0:ad6637c36dc7 133 ptr += 4;// volume
p_igmon 0:ad6637c36dc7 134 ptr += 4;// name
p_igmon 0:ad6637c36dc7 135 memcpy(&wave[num].name[0] ,ptr ,16);
p_igmon 0:ad6637c36dc7 136
p_igmon 0:ad6637c36dc7 137 Gen4Chunk = (GEN4_CHUNK *)ptr;
p_igmon 0:ad6637c36dc7 138 wave[num].name[16] = 0;
p_igmon 0:ad6637c36dc7 139 num++;
p_igmon 0:ad6637c36dc7 140 wavea->p1 = Gen4Chunk->p1;
p_igmon 0:ad6637c36dc7 141 wavea->p2 = Gen4Chunk->p2;
p_igmon 0:ad6637c36dc7 142 wavea->cycle = Gen4Chunk->cycle;
p_igmon 0:ad6637c36dc7 143 // printf("p1 = %d\r\n",Gen4Chunk->p1);
p_igmon 0:ad6637c36dc7 144
p_igmon 0:ad6637c36dc7 145 /* Search data */
p_igmon 0:ad6637c36dc7 146 ptr += 16+4+4+4;
p_igmon 0:ad6637c36dc7 147 n = 200;
p_igmon 0:ad6637c36dc7 148 while (n-- > 0){
p_igmon 0:ad6637c36dc7 149 if ((*ptr == 'd') && (*(ptr+1) =='a') && (*(ptr+2) =='t') && (*(ptr+3) =='a')) break;
p_igmon 0:ad6637c36dc7 150 ptr++;
p_igmon 0:ad6637c36dc7 151 }
p_igmon 0:ad6637c36dc7 152 if (n == 0)return -3;
p_igmon 0:ad6637c36dc7 153
p_igmon 0:ad6637c36dc7 154 /* get startaddr */
p_igmon 0:ad6637c36dc7 155 ptr += 8;
p_igmon 0:ad6637c36dc7 156 wavea->startaddr = (U32)ptr;
p_igmon 0:ad6637c36dc7 157 // pc.printf("wavea->startaddr = 0x%4x \r\n",wavea->startaddr);
p_igmon 0:ad6637c36dc7 158 wavea++;
p_igmon 0:ad6637c36dc7 159
p_igmon 0:ad6637c36dc7 160 ptr = next_ptr;
p_igmon 0:ad6637c36dc7 161 if ((*ptr == 0x00)||(*ptr == 0xff)) return 0;
p_igmon 0:ad6637c36dc7 162 }
p_igmon 0:ad6637c36dc7 163 }
p_igmon 0:ad6637c36dc7 164
p_igmon 0:ad6637c36dc7 165 void dump2serial(void){
p_igmon 0:ad6637c36dc7 166 uint32_t *ptr = Flash_Sector3_Address;
p_igmon 0:ad6637c36dc7 167 uint8_t c;
p_igmon 0:ad6637c36dc7 168 // uint32_t len = ALIGNMENT4_INC(sizeof(PresetVoiceDef));
p_igmon 0:ad6637c36dc7 169 U32 len = 16384>>2;
p_igmon 0:ad6637c36dc7 170 while (len--){
p_igmon 0:ad6637c36dc7 171 for (int i =0;i<4;i++){
p_igmon 0:ad6637c36dc7 172 c = (*ptr >>(i*8))& 0xff;
p_igmon 0:ad6637c36dc7 173 pc.putc(c);
p_igmon 0:ad6637c36dc7 174 }
p_igmon 0:ad6637c36dc7 175 ptr++;
p_igmon 0:ad6637c36dc7 176 }
p_igmon 0:ad6637c36dc7 177 }
p_igmon 0:ad6637c36dc7 178
p_igmon 0:ad6637c36dc7 179
p_igmon 0:ad6637c36dc7 180
p_igmon 0:ad6637c36dc7 181