From 7ea3f9d8746000cc82c016d0b5d48452bb80e9fe Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sat, 28 Apr 2018 23:21:34 +0200 Subject: [PATCH 1/1] src/wav.c: Fix WAV Sampler Chunk tune parsing Fix parsing of instrument fine tuning instrument field. There is still a possible rounding error involved which might require further investigation at some stage. Update the test as well. Signed-off-by: chenmaodong --- src/wav.c | 9 +++++---- tests/command_test.c | 1 - 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/wav.c b/src/wav.c index dc97545..04bf844 100644 --- a/src/wav.c +++ b/src/wav.c @@ -1282,7 +1282,7 @@ static int wav_read_smpl_chunk (SF_PRIVATE *psf, uint32_t chunklen) { char buffer [512] ; uint32_t thisread, bytesread = 0, dword, sampler_data, loop_count ; - uint32_t note, start, end, type = -1, count ; + uint32_t note, pitch, start, end, type = -1, count ; int j, k ; chunklen += (chunklen & 1) ; @@ -1299,10 +1299,10 @@ wav_read_smpl_chunk (SF_PRIVATE *psf, uint32_t chunklen) bytesread += psf_binheader_readf (psf, "4", ¬e) ; psf_log_printf (psf, " Midi Note : %u\n", note) ; - bytesread += psf_binheader_readf (psf, "4", &dword) ; - if (dword != 0) + bytesread += psf_binheader_readf (psf, "4", &pitch) ; + if (pitch != 0) { snprintf (buffer, sizeof (buffer), "%f", - (1.0 * 0x80000000) / ((uint32_t) dword)) ; + (1.0 * 0x80000000) / ((uint32_t) pitch)) ; psf_log_printf (psf, " Pitch Fract. : %s\n", buffer) ; } else @@ -1408,6 +1408,7 @@ wav_read_smpl_chunk (SF_PRIVATE *psf, uint32_t chunklen) } ; psf->instrument->basenote = note ; + psf->instrument->detune = (int8_t)(pitch / (0x40000000 / 25.0) + 0.5) ; psf->instrument->gain = 1 ; psf->instrument->velocity_lo = psf->instrument->key_lo = 0 ; psf->instrument->velocity_hi = psf->instrument->key_hi = 127 ; diff --git a/tests/command_test.c b/tests/command_test.c index f879659..c3e7c86 100644 --- a/tests/command_test.c +++ b/tests/command_test.c @@ -768,7 +768,6 @@ instrument_test (const char *filename, int filetype) ** write_inst struct to hold the default value that the WAV ** module should hold. */ - write_inst.detune = 0 ; write_inst.key_lo = write_inst.velocity_lo = 0 ; write_inst.key_hi = write_inst.velocity_hi = 127 ; write_inst.gain = 1 ; -- 1.8.3.1