p igmon
/
uGen4x
PCM Digital Synthesizer
from_save.cpp@0:ad6637c36dc7, 2016-09-02 (annotated)
- 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?
User | Revision | Line number | New 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 |