| @@ -4,7 +4,7 @@ | |||||
| #include "dr_wav.h" | #include "dr_wav.h" | ||||
| static const char WAVETABLE_FILTERS[] = "WAV (.wav):wav,WAV"; | |||||
| static const char WAVETABLE_FILTERS[] = "WAV (.wav):wav,WAV;Raw:f32,i8,i16,i24,i32,*"; | |||||
| /** Loads and stores wavetable samples and metadata */ | /** Loads and stores wavetable samples and metadata */ | ||||
| @@ -164,16 +164,35 @@ struct Wavetable { | |||||
| drwav_uninit(&wav); | drwav_uninit(&wav); | ||||
| } | } | ||||
| else { | else { | ||||
| // Load float32 | |||||
| // Load bytes from file | |||||
| std::vector<uint8_t> data = system::readFile(path); | std::vector<uint8_t> data = system::readFile(path); | ||||
| size_t len = data.size() / sizeof(float); | |||||
| samples.resize(len); | |||||
| std::memcpy(samples.data(), data.data(), len * sizeof(float)); | |||||
| } | |||||
| // Clamp samples between -1 and 1 | |||||
| for (size_t i = 0; i < samples.size(); i++) { | |||||
| samples[i] = clamp(samples[i], -1.f, 1.f); | |||||
| if (ext == ".f32") { | |||||
| size_t len = data.size() / sizeof(float); | |||||
| samples.resize(len); | |||||
| // This is the same as memcpy but consistent with the other conversions. | |||||
| dsp::convert((const float*) data.data(), samples.data(), len); | |||||
| } | |||||
| else if (ext == ".s8" || ext == ".i8") { | |||||
| size_t len = data.size() / sizeof(int8_t); | |||||
| samples.resize(len); | |||||
| dsp::convert((const int8_t*) data.data(), samples.data(), len); | |||||
| } | |||||
| else if (ext == ".s16" || ext == ".i16") { | |||||
| size_t len = data.size() / sizeof(int16_t); | |||||
| samples.resize(len); | |||||
| dsp::convert((const int16_t*) data.data(), samples.data(), len); | |||||
| } | |||||
| else if (ext == ".s24" || ext == ".i24") { | |||||
| size_t len = data.size() / sizeof(dsp::int24_t); | |||||
| samples.resize(len); | |||||
| dsp::convert((const dsp::int24_t*) data.data(), samples.data(), len); | |||||
| } | |||||
| else if (ext == ".s32" || ext == ".i32" || true) { | |||||
| size_t len = data.size() / sizeof(int32_t); | |||||
| samples.resize(len); | |||||
| dsp::convert((const int32_t*) data.data(), samples.data(), len); | |||||
| } | |||||
| } | } | ||||
| interpolate(); | interpolate(); | ||||
| @@ -266,6 +285,8 @@ struct WTDisplay : LedDisplay { | |||||
| TModule* module; | TModule* module; | ||||
| void drawLayer(const DrawArgs& args, int layer) override { | void drawLayer(const DrawArgs& args, int layer) override { | ||||
| nvgScissor(args.vg, RECT_ARGS(args.clipBox)); | |||||
| if (layer == 1) { | if (layer == 1) { | ||||
| if (defaultWavetable.samples.empty()) | if (defaultWavetable.samples.empty()) | ||||
| defaultWavetable.reset(); | defaultWavetable.reset(); | ||||
| @@ -329,6 +350,8 @@ struct WTDisplay : LedDisplay { | |||||
| nvgStrokeColor(args.vg, SCHEME_YELLOW); | nvgStrokeColor(args.vg, SCHEME_YELLOW); | ||||
| nvgStroke(args.vg); | nvgStroke(args.vg); | ||||
| } | } | ||||
| nvgResetScissor(args.vg); | |||||
| LedDisplay::drawLayer(args, layer); | LedDisplay::drawLayer(args, layer); | ||||
| } | } | ||||