diff --git a/README.md b/README.md index 4736da0..64c9d25 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ in the source folder) stays on the Apache 2.0 license to able to collaborate bet Changelog --------- #### Version 0.9.2 +* Added operator mute switch +* Added Tune (MASTER TUNE ADJ) knob * Single click program select * Fix sysex issue with wrong machine ID diff --git a/Source/EngineMkI.cpp b/Source/EngineMkI.cpp index 351e8d3..b24345e 100644 --- a/Source/EngineMkI.cpp +++ b/Source/EngineMkI.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 Pascal Gauthier. + * Copyright (C) 2015-2016 Pascal Gauthier. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -245,6 +245,7 @@ void EngineMkI::render(int32_t *output, FmOpParams *params, int algorithm, param.phase += param.freq << LG_N; } } + const FmAlgorithm EngineMkI::algo2[32] = { { { 0xc1, 0x11, 0x11, 0x14, 0x01, 0x14 } }, // 1 @@ -307,7 +308,7 @@ void EngineMkI::compute_fb3(int32_t *output, FmOpParams *parms, int32_t gain01, for (int i = 0; i < N; i++) { // op 0 gain[0] += dgain[0]; - int32_t scaled_fb = (y0 + y) >> (fb_shift + 6); // tsk tsk tsk: this needs some tuning + int32_t scaled_fb = (y0 + y) >> (fb_shift + 1); // tsk tsk tsk: this needs some tuning y0 = y; y = Sin::lookup(phase[0] + scaled_fb); y = ((int64_t)y * (int64_t)gain[0]) >> 24; @@ -352,7 +353,7 @@ void EngineMkI::compute_fb2(int32_t *output, FmOpParams *parms, int32_t gain01, for (int i = 0; i < N; i++) { // op 0 gain[0] += dgain[0]; - int32_t scaled_fb = (y0 + y) >> (fb_shift + 2); // tsk tsk tsk: this needs some tuning + int32_t scaled_fb = (y0 + y) >> (fb_shift + 1); y0 = y; y = Sin::lookup(phase[0] + scaled_fb); y = ((int64_t)y * (int64_t)gain[0]) >> 24; @@ -371,7 +372,8 @@ void EngineMkI::compute_fb2(int32_t *output, FmOpParams *parms, int32_t gain01, /* void EngineMkI::render(int32_t *output, FmOpParams *params, int algorithm, int32_t *fb_buf, int feedback_shift) { - const int kLevelThresh = 507; + const uint16_t ENV_MAX = 1<> 4) & 3; int outbus = flags & 3; int32_t *outptr = (outbus == 0) ? output : buf_[outbus - 1].get(); - int32_t gain1 = param.gain_out == 0 ? 511 : param.gain_out; - int32_t gain2 = 512-(param.level_in >> 19); + int32_t gain1 = param.gain_out == 0 ? (ENV_MAX-1) : param.gain_out; + int32_t gain2 = ENV_MAX-(param.level_in >> (28-ENV_BITDEPTH)); param.gain_out = gain2; - if (gain1 >= kLevelThresh || gain2 >= kLevelThresh) { + if (gain1 <= kLevelThresh || gain2 <= kLevelThresh) { if (!has_contents[outbus]) { add = false; @@ -433,5 +435,5 @@ void EngineMkI::render(int32_t *output, FmOpParams *params, int algorithm, int32 } param.phase += param.freq << LG_N; } -} -*/ +}*/ + diff --git a/Source/PluginData.h b/Source/PluginData.h index 24d5ee0..22cc6f2 100644 --- a/Source/PluginData.h +++ b/Source/PluginData.h @@ -1,6 +1,6 @@ /** * - * Copyright (c) 2014-2015 Pascal Gauthier. + * Copyright (c) 2014-2016 Pascal Gauthier. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,7 +30,7 @@ uint8_t sysexChecksum(const uint8_t *sysex, int size); void exportSysexPgm(uint8_t *dest, uint8_t *src); -#define SYSEX_HEADER { 0xF0, 0x43, 0x00, 0x09, 0x20, 0x00 } +#define SYSEX_HEADER { 0xF0, 0x43, 0x00, 0x09, 0x20, 0x00 } #define SYSEX_SIZE 4104 class Cartridge { @@ -99,6 +99,7 @@ public: } int load(const uint8_t *stream, int size) { + const uint8 voiceHeaderBroken[] = { 0xF0, 0x43, 0x00, 0x00, 0x20, 0x00 }; uint8 voiceHeader[] = SYSEX_HEADER; uint8 tmp[65535]; uint8 *pos = tmp; @@ -115,11 +116,13 @@ public: if ( status != 0 ) return status; memcpy(voiceData, pos+6, 4096); + TRACE("SYSEX Header not found, loading random data"); return 2; } pos[3] = 0; - if ( memcmp(pos, voiceHeader, 6) == 0 ) { + if ( memcmp(pos, voiceHeader, 6) == 0 || memcmp(pos, voiceHeaderBroken, 6) == 0) { + TRACE("SYSEX voice header found at %d", pos); memcpy(voiceData, pos, SYSEX_SIZE); if ( sysexChecksum(voiceData + 6, 4096) == pos[4102] ) status = 0; diff --git a/Source/PluginEditor.cpp b/Source/PluginEditor.cpp index 2e8a09a..bf18a47 100644 --- a/Source/PluginEditor.cpp +++ b/Source/PluginEditor.cpp @@ -115,13 +115,23 @@ void DexedAudioProcessorEditor::cartShow() { void DexedAudioProcessorEditor::loadCart(File file) { Cartridge cart; - if ( cart.load(file) < 0 ) { + int rc = cart.load(file); + + if ( rc < 0 ) { AlertWindow::showMessageBoxAsync (AlertWindow::WarningIcon, "Error", "Unable to open: " + file.getFullPathName()); return; } + if ( rc != 0 ) { + rc = AlertWindow::showOkCancelBox(AlertWindow::QuestionIcon, "Unable to find DX7 sysex cartridge in file", + "This sysex file is not for the DX7 or it is corrupted. " + "Do you still want to load this file as random data ?"); + if ( rc == 0 ) + return; + } + processor->loadCartridge(cart); rebuildProgramCombobox(); processor->setCurrentProgram(0);