| ... | ... |
@@ -291,20 +291,27 @@ audio_handler(void *ctx, Uint8 *out_stream, int len) |
| 291 | 291 |
} |
| 292 | 292 |
} |
| 293 | 293 |
|
| 294 |
+float |
|
| 295 |
+calc_duration(Uint16 len, Uint8 pitch) |
|
| 296 |
+{
|
|
| 297 |
+ float scale = tuning[pitch - 20] / tuning[0x3c - 20]; |
|
| 298 |
+ return len / (scale * 44.1f); |
|
| 299 |
+} |
|
| 300 |
+ |
|
| 294 | 301 |
void |
| 295 | 302 |
audio_start(int idx, Uint8 *d, Uxn *u) |
| 296 | 303 |
{
|
| 297 | 304 |
Uint16 dur = PEEK2(d + 0x5); |
| 298 | 305 |
Uint8 off = d[0xf] == 0x00; |
| 299 | 306 |
Uint16 len = PEEK2(d + 0xa); |
| 300 |
- float duration = dur > 0 ? dur : len / 44.1f; |
|
| 307 |
+ Uint8 pitch = d[0xf] & 0x7f; |
|
| 308 |
+ float duration = dur > 0 ? dur : calc_duration(len, pitch); |
|
| 301 | 309 |
|
| 302 | 310 |
if(!off) {
|
| 303 | 311 |
Uint16 addr = PEEK2(d + 0xc); |
| 304 | 312 |
Uint8 *data = &u->ram[addr]; |
| 305 | 313 |
Uint8 volume = d[0xe]; |
| 306 | 314 |
bool loop = !(d[0xf] & 0x80); |
| 307 |
- Uint8 pitch = d[0xf] & 0x7f; |
|
| 308 | 315 |
Uint16 adsr = PEEK2(d + 0x8); |
| 309 | 316 |
Uint8 attack = (adsr >> 12) & 0xF; |
| 310 | 317 |
Uint8 decay = (adsr >> 8) & 0xF; |