kopia lustrzana https://github.com/jameshball/osci-render
Pass more variables from audioprocessor to Lua
rodzic
a0d2c93327
commit
c17d5024cf
|
@ -350,7 +350,7 @@ void OscirenderAudioProcessor::addFile(juce::File file) {
|
||||||
fileBlocks.push_back(std::make_shared<juce::MemoryBlock>());
|
fileBlocks.push_back(std::make_shared<juce::MemoryBlock>());
|
||||||
fileNames.push_back(file.getFileName());
|
fileNames.push_back(file.getFileName());
|
||||||
fileIds.push_back(currentFileId++);
|
fileIds.push_back(currentFileId++);
|
||||||
parsers.push_back(std::make_shared<FileParser>(errorCallback));
|
parsers.push_back(std::make_shared<FileParser>(errorCallback, variableCallback));
|
||||||
sounds.push_back(new ShapeSound(parsers.back()));
|
sounds.push_back(new ShapeSound(parsers.back()));
|
||||||
file.createInputStream()->readIntoMemoryBlock(*fileBlocks.back());
|
file.createInputStream()->readIntoMemoryBlock(*fileBlocks.back());
|
||||||
|
|
||||||
|
@ -362,7 +362,7 @@ void OscirenderAudioProcessor::addFile(juce::String fileName, const char* data,
|
||||||
fileBlocks.push_back(std::make_shared<juce::MemoryBlock>());
|
fileBlocks.push_back(std::make_shared<juce::MemoryBlock>());
|
||||||
fileNames.push_back(fileName);
|
fileNames.push_back(fileName);
|
||||||
fileIds.push_back(currentFileId++);
|
fileIds.push_back(currentFileId++);
|
||||||
parsers.push_back(std::make_shared<FileParser>(errorCallback));
|
parsers.push_back(std::make_shared<FileParser>(errorCallback, variableCallback));
|
||||||
sounds.push_back(new ShapeSound(parsers.back()));
|
sounds.push_back(new ShapeSound(parsers.back()));
|
||||||
fileBlocks.back()->append(data, size);
|
fileBlocks.back()->append(data, size);
|
||||||
|
|
||||||
|
@ -374,7 +374,7 @@ void OscirenderAudioProcessor::addFile(juce::String fileName, std::shared_ptr<ju
|
||||||
fileBlocks.push_back(data);
|
fileBlocks.push_back(data);
|
||||||
fileNames.push_back(fileName);
|
fileNames.push_back(fileName);
|
||||||
fileIds.push_back(currentFileId++);
|
fileIds.push_back(currentFileId++);
|
||||||
parsers.push_back(std::make_shared<FileParser>(errorCallback));
|
parsers.push_back(std::make_shared<FileParser>(errorCallback, variableCallback));
|
||||||
sounds.push_back(new ShapeSound(parsers.back()));
|
sounds.push_back(new ShapeSound(parsers.back()));
|
||||||
|
|
||||||
openFile(fileBlocks.size() - 1);
|
openFile(fileBlocks.size() - 1);
|
||||||
|
|
|
@ -231,7 +231,10 @@ public:
|
||||||
|
|
||||||
std::shared_ptr<DelayEffect> delayEffect = std::make_shared<DelayEffect>();
|
std::shared_ptr<DelayEffect> delayEffect = std::make_shared<DelayEffect>();
|
||||||
std::function<void(int, juce::String, juce::String)> errorCallback = [this](int lineNum, juce::String fileName, juce::String error) { notifyErrorListeners(lineNum, fileName, error); };
|
std::function<void(int, juce::String, juce::String)> errorCallback = [this](int lineNum, juce::String fileName, juce::String error) { notifyErrorListeners(lineNum, fileName, error); };
|
||||||
std::shared_ptr<PerspectiveEffect> perspectiveEffect = std::make_shared<PerspectiveEffect>(VERSION_HINT, errorCallback);
|
std::function<LuaVariables()> variableCallback = [this]() {
|
||||||
|
return LuaVariables{ (int) currentSampleRate.load(), frequency.load()};
|
||||||
|
};
|
||||||
|
std::shared_ptr<PerspectiveEffect> perspectiveEffect = std::make_shared<PerspectiveEffect>(VERSION_HINT, errorCallback, variableCallback);
|
||||||
|
|
||||||
BooleanParameter* midiEnabled = new BooleanParameter("MIDI Enabled", "midiEnabled", VERSION_HINT, false);
|
BooleanParameter* midiEnabled = new BooleanParameter("MIDI Enabled", "midiEnabled", VERSION_HINT, false);
|
||||||
BooleanParameter* inputEnabled = new BooleanParameter("Audio Input Enabled", "inputEnabled", VERSION_HINT, false);
|
BooleanParameter* inputEnabled = new BooleanParameter("Audio Input Enabled", "inputEnabled", VERSION_HINT, false);
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
const juce::String PerspectiveEffect::FILE_NAME = "6a3580b0-c5fc-4b28-a33e-e26a487f052f";
|
const juce::String PerspectiveEffect::FILE_NAME = "6a3580b0-c5fc-4b28-a33e-e26a487f052f";
|
||||||
|
|
||||||
PerspectiveEffect::PerspectiveEffect(int versionHint, std::function<void(int, juce::String, juce::String)> errorCallback) : versionHint(versionHint), errorCallback(errorCallback) {
|
PerspectiveEffect::PerspectiveEffect(int versionHint, std::function<void(int, juce::String, juce::String)> errorCallback, std::function<LuaVariables()> variableCallback) : versionHint(versionHint), errorCallback(errorCallback), variableCallback(variableCallback) {
|
||||||
fixedRotateX = new BooleanParameter("Perspective Fixed Rotate X", "perspectiveFixedRotateX", versionHint, false);
|
fixedRotateX = new BooleanParameter("Perspective Fixed Rotate X", "perspectiveFixedRotateX", versionHint, false);
|
||||||
fixedRotateY = new BooleanParameter("Perspective Fixed Rotate Y", "perspectiveFixedRotateY", versionHint, false);
|
fixedRotateY = new BooleanParameter("Perspective Fixed Rotate Y", "perspectiveFixedRotateY", versionHint, false);
|
||||||
fixedRotateZ = new BooleanParameter("Perspective Fixed Rotate Z", "perspectiveFixedRotateZ", versionHint, false);
|
fixedRotateZ = new BooleanParameter("Perspective Fixed Rotate Z", "perspectiveFixedRotateZ", versionHint, false);
|
||||||
|
@ -94,7 +94,7 @@ void PerspectiveEffect::updateCode(const juce::String& newCode) {
|
||||||
juce::SpinLock::ScopedLockType lock(codeLock);
|
juce::SpinLock::ScopedLockType lock(codeLock);
|
||||||
defaultScript = newCode == DEFAULT_SCRIPT;
|
defaultScript = newCode == DEFAULT_SCRIPT;
|
||||||
code = newCode;
|
code = newCode;
|
||||||
parser = std::make_unique<LuaParser>(FILE_NAME, code, errorCallback);
|
parser = std::make_unique<LuaParser>(FILE_NAME, code, errorCallback, variableCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PerspectiveEffect::setVariable(juce::String variableName, double value) {
|
void PerspectiveEffect::setVariable(juce::String variableName, double value) {
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
class PerspectiveEffect : public EffectApplication {
|
class PerspectiveEffect : public EffectApplication {
|
||||||
public:
|
public:
|
||||||
PerspectiveEffect(int versionHint, std::function<void(int, juce::String, juce::String)> errorCallback);
|
PerspectiveEffect(int versionHint, std::function<void(int, juce::String, juce::String)> errorCallback, std::function<LuaVariables()> variableCallback);
|
||||||
|
|
||||||
// arbitrary UUID
|
// arbitrary UUID
|
||||||
static const juce::String FILE_NAME;
|
static const juce::String FILE_NAME;
|
||||||
|
@ -25,7 +25,8 @@ private:
|
||||||
const juce::String DEFAULT_SCRIPT = "return { x, y, z }";
|
const juce::String DEFAULT_SCRIPT = "return { x, y, z }";
|
||||||
juce::String code = DEFAULT_SCRIPT;
|
juce::String code = DEFAULT_SCRIPT;
|
||||||
std::function<void(int, juce::String, juce::String)> errorCallback;
|
std::function<void(int, juce::String, juce::String)> errorCallback;
|
||||||
std::unique_ptr<LuaParser> parser = std::make_unique<LuaParser>(FILE_NAME, code, errorCallback);
|
std::function<LuaVariables()> variableCallback;
|
||||||
|
std::unique_ptr<LuaParser> parser = std::make_unique<LuaParser>(FILE_NAME, code, errorCallback, variableCallback);
|
||||||
juce::SpinLock codeLock;
|
juce::SpinLock codeLock;
|
||||||
|
|
||||||
bool defaultScript = true;
|
bool defaultScript = true;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "LuaParser.h"
|
#include "LuaParser.h"
|
||||||
#include "luaimport.h"
|
#include "luaimport.h"
|
||||||
|
|
||||||
LuaParser::LuaParser(juce::String fileName, juce::String script, std::function<void(int, juce::String, juce::String)> errorCallback, juce::String fallbackScript) : fallbackScript(fallbackScript), errorCallback(errorCallback), fileName(fileName) {
|
LuaParser::LuaParser(juce::String fileName, juce::String script, std::function<void(int, juce::String, juce::String)> errorCallback, std::function<LuaVariables()> variableCallback, juce::String fallbackScript) : fallbackScript(fallbackScript), errorCallback(errorCallback), variableCallback(variableCallback), fileName(fileName) {
|
||||||
reset(script);
|
reset(script);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,6 +72,17 @@ std::vector<float> LuaParser::run() {
|
||||||
lua_pushnumber(L, step);
|
lua_pushnumber(L, step);
|
||||||
lua_setglobal(L, "step");
|
lua_setglobal(L, "step");
|
||||||
|
|
||||||
|
auto vars = variableCallback();
|
||||||
|
|
||||||
|
lua_pushnumber(L, vars.sampleRate);
|
||||||
|
lua_setglobal(L, "sample_rate");
|
||||||
|
|
||||||
|
lua_pushnumber(L, vars.frequency);
|
||||||
|
lua_setglobal(L, "frequency");
|
||||||
|
|
||||||
|
lua_pushnumber(L, phase);
|
||||||
|
lua_setglobal(L, "phase");
|
||||||
|
|
||||||
// this CANNOT run at the same time as setVariable
|
// this CANNOT run at the same time as setVariable
|
||||||
if (updateVariables) {
|
if (updateVariables) {
|
||||||
juce::SpinLock::ScopedTryLockType lock(variableLock);
|
juce::SpinLock::ScopedTryLockType lock(variableLock);
|
||||||
|
@ -125,6 +136,10 @@ std::vector<float> LuaParser::run() {
|
||||||
lua_settop(L, 0);
|
lua_settop(L, 0);
|
||||||
|
|
||||||
step++;
|
step++;
|
||||||
|
phase += 2 * std::numbers::pi * vars.frequency / vars.sampleRate;
|
||||||
|
if (phase > 2 * std::numbers::pi) {
|
||||||
|
phase -= 2 * std::numbers::pi;
|
||||||
|
}
|
||||||
|
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <JuceHeader.h>
|
#include <JuceHeader.h>
|
||||||
#include <regex>
|
#include <regex>
|
||||||
|
#include <numbers>
|
||||||
#include "../shape/Shape.h"
|
#include "../shape/Shape.h"
|
||||||
|
|
||||||
class ErrorListener {
|
class ErrorListener {
|
||||||
|
@ -9,10 +10,15 @@ public:
|
||||||
virtual juce::String getFileName() = 0;
|
virtual juce::String getFileName() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct LuaVariables {
|
||||||
|
int sampleRate;
|
||||||
|
double frequency;
|
||||||
|
};
|
||||||
|
|
||||||
struct lua_State;
|
struct lua_State;
|
||||||
class LuaParser {
|
class LuaParser {
|
||||||
public:
|
public:
|
||||||
LuaParser(juce::String fileName, juce::String script, std::function<void(int, juce::String, juce::String)> errorCallback, juce::String fallbackScript = "return { 0.0, 0.0 }");
|
LuaParser(juce::String fileName, juce::String script, std::function<void(int, juce::String, juce::String)> errorCallback, std::function<LuaVariables()> variableCallback, juce::String fallbackScript = "return { 0.0, 0.0 }");
|
||||||
~LuaParser();
|
~LuaParser();
|
||||||
|
|
||||||
std::vector<float> run();
|
std::vector<float> run();
|
||||||
|
@ -31,6 +37,7 @@ private:
|
||||||
int functionRef = -1;
|
int functionRef = -1;
|
||||||
bool usingFallbackScript = false;
|
bool usingFallbackScript = false;
|
||||||
long step = 1;
|
long step = 1;
|
||||||
|
double phase = 0.0;
|
||||||
lua_State* L = nullptr;
|
lua_State* L = nullptr;
|
||||||
juce::String script;
|
juce::String script;
|
||||||
juce::String fallbackScript;
|
juce::String fallbackScript;
|
||||||
|
@ -39,5 +46,6 @@ private:
|
||||||
std::vector<juce::String> variableNames;
|
std::vector<juce::String> variableNames;
|
||||||
std::vector<double> variables;
|
std::vector<double> variables;
|
||||||
std::function<void(int, juce::String, juce::String)> errorCallback;
|
std::function<void(int, juce::String, juce::String)> errorCallback;
|
||||||
|
std::function<LuaVariables()> variableCallback;
|
||||||
juce::String fileName;
|
juce::String fileName;
|
||||||
};
|
};
|
|
@ -3,7 +3,7 @@
|
||||||
#include "../shape/CircleArc.h"
|
#include "../shape/CircleArc.h"
|
||||||
#include <numbers>
|
#include <numbers>
|
||||||
|
|
||||||
FileParser::FileParser(std::function<void(int, juce::String, juce::String)> errorCallback) : errorCallback(errorCallback) {}
|
FileParser::FileParser(std::function<void(int, juce::String, juce::String)> errorCallback, std::function<LuaVariables()> variableCallback) : errorCallback(errorCallback), variableCallback(variableCallback) {}
|
||||||
|
|
||||||
void FileParser::parse(juce::String fileName, juce::String extension, std::unique_ptr<juce::InputStream> stream, juce::Font font) {
|
void FileParser::parse(juce::String fileName, juce::String extension, std::unique_ptr<juce::InputStream> stream, juce::Font font) {
|
||||||
juce::SpinLock::ScopedLockType scope(lock);
|
juce::SpinLock::ScopedLockType scope(lock);
|
||||||
|
@ -27,7 +27,7 @@ void FileParser::parse(juce::String fileName, juce::String extension, std::uniqu
|
||||||
} else if (extension == ".txt") {
|
} else if (extension == ".txt") {
|
||||||
text = std::make_shared<TextParser>(stream->readEntireStreamAsString(), font);
|
text = std::make_shared<TextParser>(stream->readEntireStreamAsString(), font);
|
||||||
} else if (extension == ".lua") {
|
} else if (extension == ".lua") {
|
||||||
lua = std::make_shared<LuaParser>(fileName, stream->readEntireStreamAsString(), errorCallback, fallbackLuaScript);
|
lua = std::make_shared<LuaParser>(fileName, stream->readEntireStreamAsString(), errorCallback, variableCallback, fallbackLuaScript);
|
||||||
}
|
}
|
||||||
|
|
||||||
sampleSource = lua != nullptr;
|
sampleSource = lua != nullptr;
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
class FileParser {
|
class FileParser {
|
||||||
public:
|
public:
|
||||||
FileParser(std::function<void(int, juce::String, juce::String)> errorCallback = nullptr);
|
FileParser(std::function<void(int, juce::String, juce::String)> errorCallback = nullptr, std::function<LuaVariables()> variableCallback = nullptr);
|
||||||
|
|
||||||
void parse(juce::String fileName, juce::String extension, std::unique_ptr<juce::InputStream>, juce::Font);
|
void parse(juce::String fileName, juce::String extension, std::unique_ptr<juce::InputStream>, juce::Font);
|
||||||
std::vector<std::unique_ptr<Shape>> nextFrame();
|
std::vector<std::unique_ptr<Shape>> nextFrame();
|
||||||
|
@ -41,4 +41,5 @@ private:
|
||||||
juce::String fallbackLuaScript = "return { 0.0, 0.0 }";
|
juce::String fallbackLuaScript = "return { 0.0, 0.0 }";
|
||||||
|
|
||||||
std::function<void(int, juce::String, juce::String)> errorCallback;
|
std::function<void(int, juce::String, juce::String)> errorCallback;
|
||||||
|
std::function<LuaVariables()> variableCallback;
|
||||||
};
|
};
|
||||||
|
|
Ładowanie…
Reference in New Issue