p igmon
/
uGen4x
PCM Digital Synthesizer
synthesizer.h@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 | #ifndef SYNTHESIZER_H |
p_igmon | 0:ad6637c36dc7 | 2 | #define SYNTHESIZER_H |
p_igmon | 0:ad6637c36dc7 | 3 | |
p_igmon | 0:ad6637c36dc7 | 4 | typedef signed long S32; |
p_igmon | 0:ad6637c36dc7 | 5 | typedef signed short S16; |
p_igmon | 0:ad6637c36dc7 | 6 | typedef signed char S8; |
p_igmon | 0:ad6637c36dc7 | 7 | typedef unsigned long U32; |
p_igmon | 0:ad6637c36dc7 | 8 | typedef unsigned short U16; |
p_igmon | 0:ad6637c36dc7 | 9 | typedef unsigned char U8; |
p_igmon | 0:ad6637c36dc7 | 10 | |
p_igmon | 0:ad6637c36dc7 | 11 | #include "mbed.h" |
p_igmon | 0:ad6637c36dc7 | 12 | #include "cmsis.h" |
p_igmon | 0:ad6637c36dc7 | 13 | #include "stm32f401xe.h" |
p_igmon | 0:ad6637c36dc7 | 14 | #include "stm32f4xx.h" |
p_igmon | 0:ad6637c36dc7 | 15 | #include "stm32f4xx_hal.h" |
p_igmon | 0:ad6637c36dc7 | 16 | #include "stm32f4xx_hal_dma_ex.h" |
p_igmon | 0:ad6637c36dc7 | 17 | #include "stm32f4xx_hal_dma.h" |
p_igmon | 0:ad6637c36dc7 | 18 | #include "stm32f4xx_hal_i2s.h" |
p_igmon | 0:ad6637c36dc7 | 19 | #include "stm32f4xx_hal_flash.h" |
p_igmon | 0:ad6637c36dc7 | 20 | #include "stm32f4xx_hal_conf.h" |
p_igmon | 0:ad6637c36dc7 | 21 | #include "stm32f4xx_it.h" |
p_igmon | 0:ad6637c36dc7 | 22 | |
p_igmon | 0:ad6637c36dc7 | 23 | #include "error.h" |
p_igmon | 0:ad6637c36dc7 | 24 | #include "pinmap.h" |
p_igmon | 0:ad6637c36dc7 | 25 | #include "PinNames.h" |
p_igmon | 0:ad6637c36dc7 | 26 | #include "gpio_irq_api.h" |
p_igmon | 0:ad6637c36dc7 | 27 | |
p_igmon | 0:ad6637c36dc7 | 28 | #include "LCD.h" |
p_igmon | 0:ad6637c36dc7 | 29 | |
p_igmon | 0:ad6637c36dc7 | 30 | #include "reverve_tap.h" |
p_igmon | 0:ad6637c36dc7 | 31 | #include "from_save.h" |
p_igmon | 0:ad6637c36dc7 | 32 | #include "lcd_sw.h" |
p_igmon | 0:ad6637c36dc7 | 33 | #include "releasetime_table.h" |
p_igmon | 0:ad6637c36dc7 | 34 | |
p_igmon | 0:ad6637c36dc7 | 35 | #include "lfo_table.h" |
p_igmon | 0:ad6637c36dc7 | 36 | #include "dcf_table.h" |
p_igmon | 0:ad6637c36dc7 | 37 | |
p_igmon | 0:ad6637c36dc7 | 38 | #define FWVERSION " Ver 2.1" |
p_igmon | 0:ad6637c36dc7 | 39 | |
p_igmon | 0:ad6637c36dc7 | 40 | #define DIST |
p_igmon | 0:ad6637c36dc7 | 41 | //#define REVERVE16BIT |
p_igmon | 0:ad6637c36dc7 | 42 | //#define DCF |
p_igmon | 0:ad6637c36dc7 | 43 | #define INTERPO2 |
p_igmon | 0:ad6637c36dc7 | 44 | |
p_igmon | 0:ad6637c36dc7 | 45 | #define VOICEMAX 8 |
p_igmon | 0:ad6637c36dc7 | 46 | #define PRGGENMAX 4 |
p_igmon | 0:ad6637c36dc7 | 47 | //#define VOICEMAX 12 |
p_igmon | 0:ad6637c36dc7 | 48 | //#define PRGGENMAX 2 |
p_igmon | 0:ad6637c36dc7 | 49 | //#define GENMAX (PRGGENMAX*VOICEMAX) |
p_igmon | 0:ad6637c36dc7 | 50 | #define GENMAX 24 |
p_igmon | 0:ad6637c36dc7 | 51 | |
p_igmon | 0:ad6637c36dc7 | 52 | #define I2S2 SPI2 |
p_igmon | 0:ad6637c36dc7 | 53 | #define DMA_BUFFERSIZE 2048 |
p_igmon | 0:ad6637c36dc7 | 54 | |
p_igmon | 0:ad6637c36dc7 | 55 | #define PARAM_BUFSIZE 256 |
p_igmon | 0:ad6637c36dc7 | 56 | |
p_igmon | 0:ad6637c36dc7 | 57 | #define GEN_IDLE 0 |
p_igmon | 0:ad6637c36dc7 | 58 | #define GEN_NOTEON 1 |
p_igmon | 0:ad6637c36dc7 | 59 | #define GEN_NOTEOFF 2 |
p_igmon | 0:ad6637c36dc7 | 60 | #define GEN_PORON 3 |
p_igmon | 0:ad6637c36dc7 | 61 | #define GEN_POROFF 4 |
p_igmon | 0:ad6637c36dc7 | 62 | |
p_igmon | 0:ad6637c36dc7 | 63 | /* for main Request*/ |
p_igmon | 0:ad6637c36dc7 | 64 | //#define REQUEST_NONE 0 |
p_igmon | 0:ad6637c36dc7 | 65 | //#define REQUEST_BUFFERFULL 1 |
p_igmon | 0:ad6637c36dc7 | 66 | //#define REQUEST_PARAM 2 |
p_igmon | 0:ad6637c36dc7 | 67 | //#define REQUEST_MIDI 4 |
p_igmon | 0:ad6637c36dc7 | 68 | |
p_igmon | 0:ad6637c36dc7 | 69 | /* EG Function */ |
p_igmon | 0:ad6637c36dc7 | 70 | #define EG_IDLE 0 |
p_igmon | 0:ad6637c36dc7 | 71 | #define EG_ATTACK 1 |
p_igmon | 0:ad6637c36dc7 | 72 | #define EG_DECAY 2 |
p_igmon | 0:ad6637c36dc7 | 73 | #define EG_SUSTAIN 3 |
p_igmon | 0:ad6637c36dc7 | 74 | #define EG_RELEASE 4 |
p_igmon | 0:ad6637c36dc7 | 75 | #define EG_BEFOREATTACK 5 |
p_igmon | 0:ad6637c36dc7 | 76 | |
p_igmon | 0:ad6637c36dc7 | 77 | extern S16 limit; |
p_igmon | 0:ad6637c36dc7 | 78 | |
p_igmon | 0:ad6637c36dc7 | 79 | typedef struct { |
p_igmon | 0:ad6637c36dc7 | 80 | U8 sw;// 0,1 |
p_igmon | 0:ad6637c36dc7 | 81 | U8 wave_num;// 1 - 100 |
p_igmon | 0:ad6637c36dc7 | 82 | S8 notebias;// -128 - +127 |
p_igmon | 0:ad6637c36dc7 | 83 | U8 pan;// 0-31 |
p_igmon | 0:ad6637c36dc7 | 84 | S16 detune;// -512 - +511 |
p_igmon | 0:ad6637c36dc7 | 85 | U16 volume;// 0-65535 |
p_igmon | 0:ad6637c36dc7 | 86 | |
p_igmon | 0:ad6637c36dc7 | 87 | U16 attacktime;// |
p_igmon | 0:ad6637c36dc7 | 88 | U16 decaytime;// |
p_igmon | 0:ad6637c36dc7 | 89 | U8 sustainlevel;// |
p_igmon | 0:ad6637c36dc7 | 90 | U16 releasetime;// 0-21 |
p_igmon | 0:ad6637c36dc7 | 91 | |
p_igmon | 0:ad6637c36dc7 | 92 | U8 lfo1type; |
p_igmon | 0:ad6637c36dc7 | 93 | U8 lfo1speed; |
p_igmon | 0:ad6637c36dc7 | 94 | U16 lfo1depth; |
p_igmon | 0:ad6637c36dc7 | 95 | U16 lfo1delaytime;// 0-3000 |
p_igmon | 0:ad6637c36dc7 | 96 | |
p_igmon | 0:ad6637c36dc7 | 97 | U8 lfo2type; |
p_igmon | 0:ad6637c36dc7 | 98 | U8 lfo2speed; |
p_igmon | 0:ad6637c36dc7 | 99 | U16 lfo2depth; |
p_igmon | 0:ad6637c36dc7 | 100 | U16 lfo2delaytime;// 0-3000 |
p_igmon | 0:ad6637c36dc7 | 101 | }GENERATOR ; |
p_igmon | 0:ad6637c36dc7 | 102 | |
p_igmon | 0:ad6637c36dc7 | 103 | typedef struct { |
p_igmon | 0:ad6637c36dc7 | 104 | U8 status;// BUFFULL,PARAM,MIDI |
p_igmon | 0:ad6637c36dc7 | 105 | U8 eg_status;// IDLE,ATTCK,DECAY,SUSTAIN,RELEASE |
p_igmon | 0:ad6637c36dc7 | 106 | U8 *startadr; |
p_igmon | 0:ad6637c36dc7 | 107 | U8 *p1; |
p_igmon | 0:ad6637c36dc7 | 108 | U8 *p2; |
p_igmon | 0:ad6637c36dc7 | 109 | U8 *samplecountp1p2; |
p_igmon | 0:ad6637c36dc7 | 110 | U8 *cycle; |
p_igmon | 0:ad6637c36dc7 | 111 | U32 df;// 4e28f |
p_igmon | 0:ad6637c36dc7 | 112 | S32 dpf;// 4e28f portament data 110812 |
p_igmon | 0:ad6637c36dc7 | 113 | U8 notenum;// 0-127 |
p_igmon | 0:ad6637c36dc7 | 114 | volatile U32 voltemp;// 32bit |
p_igmon | 0:ad6637c36dc7 | 115 | volatile U32 voltemp1;// 32bit |
p_igmon | 0:ad6637c36dc7 | 116 | volatile U32 voltemp2;// 32bit |
p_igmon | 0:ad6637c36dc7 | 117 | volatile U32 voltempL;// 32bit |
p_igmon | 0:ad6637c36dc7 | 118 | volatile U32 voltempR;// 32bit |
p_igmon | 0:ad6637c36dc7 | 119 | U8 velocity;// 0-127 |
p_igmon | 0:ad6637c36dc7 | 120 | U32 x;// 指数部20ビット 小数部12ビット |
p_igmon | 0:ad6637c36dc7 | 121 | U32 xx;// 指数部20ビット 小数部12ビット |
p_igmon | 0:ad6637c36dc7 | 122 | S16 lfo1value; |
p_igmon | 0:ad6637c36dc7 | 123 | U16 lfo1count; |
p_igmon | 0:ad6637c36dc7 | 124 | U16 lfo1delaycount;// 3000-0 |
p_igmon | 0:ad6637c36dc7 | 125 | S16 lfo2value; |
p_igmon | 0:ad6637c36dc7 | 126 | U16 lfo2count; |
p_igmon | 0:ad6637c36dc7 | 127 | U16 lfo2delaycount;// 3000-0 |
p_igmon | 0:ad6637c36dc7 | 128 | U16 zerocount; |
p_igmon | 0:ad6637c36dc7 | 129 | }GENERATOR_TEMP ; |
p_igmon | 0:ad6637c36dc7 | 130 | |
p_igmon | 0:ad6637c36dc7 | 131 | typedef struct { |
p_igmon | 0:ad6637c36dc7 | 132 | U8 name[16]; |
p_igmon | 0:ad6637c36dc7 | 133 | U32 p1; |
p_igmon | 0:ad6637c36dc7 | 134 | U32 p2; |
p_igmon | 0:ad6637c36dc7 | 135 | U32 cycle; |
p_igmon | 0:ad6637c36dc7 | 136 | }GEN4_CHUNK; |
p_igmon | 0:ad6637c36dc7 | 137 | |
p_igmon | 0:ad6637c36dc7 | 138 | typedef struct { |
p_igmon | 0:ad6637c36dc7 | 139 | char menu[20]; |
p_igmon | 0:ad6637c36dc7 | 140 | void (*function)(void); |
p_igmon | 0:ad6637c36dc7 | 141 | int min; |
p_igmon | 0:ad6637c36dc7 | 142 | int max; |
p_igmon | 0:ad6637c36dc7 | 143 | }MenuListDef; |
p_igmon | 0:ad6637c36dc7 | 144 | |
p_igmon | 0:ad6637c36dc7 | 145 | |
p_igmon | 0:ad6637c36dc7 | 146 | typedef struct { |
p_igmon | 0:ad6637c36dc7 | 147 | int enable; |
p_igmon | 0:ad6637c36dc7 | 148 | S32 signal[6];// sample,x1,x2,y1,y2,result |
p_igmon | 0:ad6637c36dc7 | 149 | S32 *dcf_param;// pointer of dcf_table(b0a0 ,b1a0,... a2,a0) |
p_igmon | 0:ad6637c36dc7 | 150 | GENERATOR *gen;// gen1_adr,gen2_adr...gen4_adr |
p_igmon | 0:ad6637c36dc7 | 151 | GENERATOR_TEMP *gen_temp;// gen1_adr,gen2_adr...gen4_adr |
p_igmon | 0:ad6637c36dc7 | 152 | }STR_VOICE; |
p_igmon | 0:ad6637c36dc7 | 153 | |
p_igmon | 0:ad6637c36dc7 | 154 | |
p_igmon | 0:ad6637c36dc7 | 155 | typedef struct{ |
p_igmon | 0:ad6637c36dc7 | 156 | char name[20]; |
p_igmon | 0:ad6637c36dc7 | 157 | uint32_t startaddr;// Wave data Start Address |
p_igmon | 0:ad6637c36dc7 | 158 | uint32_t p1;// Loop Point1 |
p_igmon | 0:ad6637c36dc7 | 159 | uint32_t p2;// Loop Point2 |
p_igmon | 0:ad6637c36dc7 | 160 | uint32_t cycle;// Loop Cycle :if (cycle == 0) cycle = P2-p1 ; |
p_igmon | 0:ad6637c36dc7 | 161 | }WaveDef; |
p_igmon | 0:ad6637c36dc7 | 162 | |
p_igmon | 0:ad6637c36dc7 | 163 | typedef struct{ |
p_igmon | 0:ad6637c36dc7 | 164 | char name[20]; |
p_igmon | 0:ad6637c36dc7 | 165 | uint8_t dcf_freq; |
p_igmon | 0:ad6637c36dc7 | 166 | uint8_t dcf_q; |
p_igmon | 0:ad6637c36dc7 | 167 | uint8_t dcf_freqsence; |
p_igmon | 0:ad6637c36dc7 | 168 | uint8_t dcf_qsence; |
p_igmon | 0:ad6637c36dc7 | 169 | }PresetVoiceDef; |
p_igmon | 0:ad6637c36dc7 | 170 | |
p_igmon | 0:ad6637c36dc7 | 171 | typedef enum |
p_igmon | 0:ad6637c36dc7 | 172 | { |
p_igmon | 0:ad6637c36dc7 | 173 | DMA_Idle = 0, |
p_igmon | 0:ad6637c36dc7 | 174 | DMA_HalfComplete, |
p_igmon | 0:ad6637c36dc7 | 175 | DMA_FullComplete, |
p_igmon | 0:ad6637c36dc7 | 176 | }BUFFER_StateTypeDef; |
p_igmon | 0:ad6637c36dc7 | 177 | |
p_igmon | 0:ad6637c36dc7 | 178 | typedef enum |
p_igmon | 0:ad6637c36dc7 | 179 | { |
p_igmon | 0:ad6637c36dc7 | 180 | KEY_WAIT_ON = 0, |
p_igmon | 0:ad6637c36dc7 | 181 | KEY_AFTER_ON, |
p_igmon | 0:ad6637c36dc7 | 182 | KEY_WAIT_OFF, |
p_igmon | 0:ad6637c36dc7 | 183 | KEY_AFTER_OFF, |
p_igmon | 0:ad6637c36dc7 | 184 | KEY_AUTO_PRESS, |
p_igmon | 0:ad6637c36dc7 | 185 | KEY_AFTER_AUTO_PRESS, |
p_igmon | 0:ad6637c36dc7 | 186 | KEY_GEN_WAVE1, |
p_igmon | 0:ad6637c36dc7 | 187 | KEY_GEN_WAVE2, |
p_igmon | 0:ad6637c36dc7 | 188 | KEY_FIRST_WAIT |
p_igmon | 0:ad6637c36dc7 | 189 | }KeyState_TypeDef; |
p_igmon | 0:ad6637c36dc7 | 190 | |
p_igmon | 0:ad6637c36dc7 | 191 | void MX_GPIO_Init(void); |
p_igmon | 0:ad6637c36dc7 | 192 | void uGen4_device_init(void); |
p_igmon | 0:ad6637c36dc7 | 193 | void init_dmabuffer(void); |
p_igmon | 0:ad6637c36dc7 | 194 | void i2s_dma_init(void); |
p_igmon | 0:ad6637c36dc7 | 195 | void uGen4_init(void); |
p_igmon | 0:ad6637c36dc7 | 196 | |
p_igmon | 0:ad6637c36dc7 | 197 | void lcd_print_title(void); |
p_igmon | 0:ad6637c36dc7 | 198 | void gen_function(int *); |
p_igmon | 0:ad6637c36dc7 | 199 | |
p_igmon | 0:ad6637c36dc7 | 200 | S32 satAdd32(S32 val1 ,S32 val2); |
p_igmon | 0:ad6637c36dc7 | 201 | S16 satAdd16(S16 val1 ,S16 val2); |
p_igmon | 0:ad6637c36dc7 | 202 | S16 dcf64(S32 *param ,S32 *signal); |
p_igmon | 0:ad6637c36dc7 | 203 | char *val2str4(int value); |
p_igmon | 0:ad6637c36dc7 | 204 | void presetvoice(void); |
p_igmon | 0:ad6637c36dc7 | 205 | void param(void); |
p_igmon | 0:ad6637c36dc7 | 206 | void midichannel(void); |
p_igmon | 0:ad6637c36dc7 | 207 | void mastertune(void); |
p_igmon | 0:ad6637c36dc7 | 208 | void dcfcontrol(void); |
p_igmon | 0:ad6637c36dc7 | 209 | void gen_sw (void); |
p_igmon | 0:ad6637c36dc7 | 210 | void gen_wave (void); |
p_igmon | 0:ad6637c36dc7 | 211 | void gen_notebias(void); |
p_igmon | 0:ad6637c36dc7 | 212 | void gen_outlevel(void); |
p_igmon | 0:ad6637c36dc7 | 213 | void gen_detune(void); |
p_igmon | 0:ad6637c36dc7 | 214 | void gen_attacktime(void); |
p_igmon | 0:ad6637c36dc7 | 215 | void gen_decaytime(void); |
p_igmon | 0:ad6637c36dc7 | 216 | void gen_sustainlevel(void); |
p_igmon | 0:ad6637c36dc7 | 217 | void gen_relesetime(void); |
p_igmon | 0:ad6637c36dc7 | 218 | void gen_lfo1_wavetype(void); |
p_igmon | 0:ad6637c36dc7 | 219 | void gen_lfo1_speed (void); |
p_igmon | 0:ad6637c36dc7 | 220 | void gen_lfo1_depth(void); |
p_igmon | 0:ad6637c36dc7 | 221 | void gen_lfo2_speed (void); |
p_igmon | 0:ad6637c36dc7 | 222 | void gen_lfo2_depth(void); |
p_igmon | 0:ad6637c36dc7 | 223 | void gen_lfo1_delaytime(void); |
p_igmon | 0:ad6637c36dc7 | 224 | void gen_lfo2_delaytime(void); |
p_igmon | 0:ad6637c36dc7 | 225 | void gen_limit(void); |
p_igmon | 0:ad6637c36dc7 | 226 | |
p_igmon | 0:ad6637c36dc7 | 227 | void Erase_Sector2(void); |
p_igmon | 0:ad6637c36dc7 | 228 | |
p_igmon | 0:ad6637c36dc7 | 229 | HAL_StatusTypeDef WriteBlockFrom(uint32_t *src_address ,uint32_t *dst_address,uint32_t length); |
p_igmon | 0:ad6637c36dc7 | 230 | |
p_igmon | 0:ad6637c36dc7 | 231 | int strcmp(U8 *a ,U8 *b); |
p_igmon | 0:ad6637c36dc7 | 232 | |
p_igmon | 0:ad6637c36dc7 | 233 | void init_voice(void); |
p_igmon | 0:ad6637c36dc7 | 234 | void init_sgen(void); |
p_igmon | 0:ad6637c36dc7 | 235 | void noteon(U8 notenum ,U8 velocity); |
p_igmon | 0:ad6637c36dc7 | 236 | void noteoff(U8 notenum ,U8 velocity); |
p_igmon | 0:ad6637c36dc7 | 237 | void pgmchg(U8 number); |
p_igmon | 0:ad6637c36dc7 | 238 | void change_endian16(U16 *data); |
p_igmon | 0:ad6637c36dc7 | 239 | void wave_generate(void); |
p_igmon | 0:ad6637c36dc7 | 240 | |
p_igmon | 0:ad6637c36dc7 | 241 | void gen_attack(GENERATOR *gena,GENERATOR_TEMP *gena_temp); |
p_igmon | 0:ad6637c36dc7 | 242 | void notenum2df(GENERATOR *gen ,GENERATOR_TEMP *gen_temp); |
p_igmon | 0:ad6637c36dc7 | 243 | void envelope_work(void); |
p_igmon | 0:ad6637c36dc7 | 244 | void midi_work(void); |
p_igmon | 0:ad6637c36dc7 | 245 | void param_work(void); |
p_igmon | 0:ad6637c36dc7 | 246 | void init_midi(void); |
p_igmon | 0:ad6637c36dc7 | 247 | void init_param(void); |
p_igmon | 0:ad6637c36dc7 | 248 | |
p_igmon | 0:ad6637c36dc7 | 249 | int get_wave_addr (WaveDef *wave); |
p_igmon | 0:ad6637c36dc7 | 250 | void load2from(void); |
p_igmon | 0:ad6637c36dc7 | 251 | |
p_igmon | 0:ad6637c36dc7 | 252 | void lcd_print(char *str); |
p_igmon | 0:ad6637c36dc7 | 253 | void lcd_print1(char *str); |
p_igmon | 0:ad6637c36dc7 | 254 | void lcd_print2(char *str); |
p_igmon | 0:ad6637c36dc7 | 255 | |
p_igmon | 0:ad6637c36dc7 | 256 | void anykeyon(U8 inkey); |
p_igmon | 0:ad6637c36dc7 | 257 | |
p_igmon | 0:ad6637c36dc7 | 258 | U8 gen_function_type_byte(GENERATOR *gena_value); |
p_igmon | 0:ad6637c36dc7 | 259 | |
p_igmon | 0:ad6637c36dc7 | 260 | void test_loop(void); |
p_igmon | 0:ad6637c36dc7 | 261 | void test_loop2(void); |
p_igmon | 0:ad6637c36dc7 | 262 | |
p_igmon | 0:ad6637c36dc7 | 263 | extern WaveDef Wave[]; |
p_igmon | 0:ad6637c36dc7 | 264 | extern PresetVoiceDef PresetVoice[]; |
p_igmon | 0:ad6637c36dc7 | 265 | extern GENERATOR sgen[]; |
p_igmon | 0:ad6637c36dc7 | 266 | |
p_igmon | 0:ad6637c36dc7 | 267 | |
p_igmon | 0:ad6637c36dc7 | 268 | #endif |
p_igmon | 0:ad6637c36dc7 | 269 | |
p_igmon | 0:ad6637c36dc7 | 270 | |
p_igmon | 0:ad6637c36dc7 | 271 | |
p_igmon | 0:ad6637c36dc7 | 272 | |
p_igmon | 0:ad6637c36dc7 | 273 | |
p_igmon | 0:ad6637c36dc7 | 274 | |
p_igmon | 0:ad6637c36dc7 | 275 | |
p_igmon | 0:ad6637c36dc7 | 276 | |
p_igmon | 0:ad6637c36dc7 | 277 |