Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
256 changes: 135 additions & 121 deletions embedded/juceplugin/PyoClass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,140 +18,154 @@
* If not, see <http://www.gnu.org/licenses/>. *
* *
*************************************************************************/
#include "PyoClass.h"

Pyo::Pyo() {
interpreter = nullptr;
}
#include "PyoClass.h"
#include <iostream>

Pyo::Pyo() {
interpreter = nullptr;
debug = 0;
}

Pyo::~Pyo() {
if (interpreter != NULL) {
pyo_end_interpreter(interpreter);
}
}

void Pyo::setup(int _nChannels, int _bufferSize, int _sampleRate) {
nChannels = _nChannels;
bufferSize = _bufferSize;
sampleRate = _sampleRate;
interpreter = pyo_new_interpreter(sampleRate, bufferSize, nChannels);
pyoInBuffer = reinterpret_cast<float*>(pyo_get_input_buffer_address(interpreter));
pyoOutBuffer = reinterpret_cast<float*>(pyo_get_output_buffer_address(interpreter));
pyoCallback = reinterpret_cast<callPtr*>(pyo_get_embedded_callback_address(interpreter));
pyoId = pyo_get_server_id(interpreter);
pyo_set_server_params(interpreter, sampleRate, bufferSize);
}

void Pyo::setup(int _inChannels, int _outChannels, int _bufferSize, int _sampleRate) {
inChannels = _inChannels;
outChannels = _outChannels;
bufferSize = _bufferSize;
sampleRate = _sampleRate;

interpreter = pyo_new_interpreter(sampleRate, bufferSize, inChannels, outChannels);
pyoInBuffer = reinterpret_cast<float*>(pyo_get_input_buffer_address(interpreter));
pyoOutBuffer = reinterpret_cast<float*>(pyo_get_output_buffer_address(interpreter));
pyoCallback = reinterpret_cast<callPtr*>(pyo_get_embedded_callback_address(interpreter));
pyoId = pyo_get_server_id(interpreter);
pyo_set_server_params(interpreter, sampleRate, bufferSize);
}

std::vector<std::string> Pyo::getStdout() {
std::vector<std::string> out;
char *msg;
while (pyo_dequeue_stdout(&msg)) {
out.emplace_back(msg); // copy into vector
free(msg); // free allocated C buffer
}
return out;
}

void Pyo::setbpm(double bpm) {
pyo_set_bpm(interpreter, bpm);
}
void Pyo::process(AudioBuffer<float>& buffer) {
for (int channel = 0; channel < nChannels; ++channel) {
float *channelData = buffer.getWritePointer(channel);
for (int sample = 0; sample < bufferSize; sample++) {
pyoInBuffer[sample*nChannels+channel] = channelData[sample];
}
}
pyoCallback(pyoId);
for (int channel = 0; channel < nChannels; ++channel) {
float *channelData = buffer.getWritePointer(channel);
for (int sample = 0; sample < bufferSize; sample++) {
channelData[sample] = pyoOutBuffer[sample*nChannels+channel];
}
}
}
int Pyo::loadfile(const char *file, int add) {
return pyo_exec_file(interpreter, file, pyoMsg, add);
}
int Pyo::loadfile(const String &file, int add) {
return pyo_exec_file(interpreter, file.getCharPointer(), pyoMsg, add);
}

void Pyo::process(juce::AudioBuffer<float>& buffer) {
for (int channel = 0; channel < inChannels; ++channel) {
float *channelData = buffer.getWritePointer(channel);
for (int sample = 0; sample < bufferSize; sample++) {
pyoInBuffer[sample*inChannels+channel] = channelData[sample];
}
}
pyoCallback(pyoId);
for (int channel = 0; channel < outChannels; ++channel) {
float *channelData = buffer.getWritePointer(channel);
for (int sample = 0; sample < bufferSize; sample++) {
channelData[sample] = pyoOutBuffer[sample*outChannels+channel];
}
}
}

int Pyo::loadfile(const char *file, int add) {
return pyo_exec_file(interpreter, file, pyoMsg, add, debug);
}

int Pyo::loadfile(const juce::String &file, int add) {
return pyo_exec_file(interpreter, file.getCharPointer(), pyoMsg, add, debug);
}

int Pyo::exec(const char *_msg) {
strcpy(pyoMsg, _msg);
return pyo_exec_statement(interpreter, pyoMsg, 0);
return pyo_exec_statement(interpreter, pyoMsg, debug);
}

int Pyo::exec(const String &_msg) {
int Pyo::exec(const juce::String &_msg) {
strcpy(pyoMsg, _msg.getCharPointer());
return pyo_exec_statement(interpreter, pyoMsg, 0);
}
int Pyo::value(const char *name, float value) {
sprintf(pyoMsg, "%s.value=%f", name, value);
return pyo_exec_statement(interpreter, pyoMsg, 0);
}
int Pyo::value(const String &name, float value) {
const char * _name = name.getCharPointer();
sprintf(pyoMsg, "%s.value=%f", _name, value);
return pyo_exec_statement(interpreter, pyoMsg, 0);
}
int Pyo::value(const char *name, float *value, int len) {
char fchar[32];
sprintf(pyoMsg, "%s.value=[", name);
for (int i=0; i<len; i++) {
sprintf(fchar, "%f,", value[i]);
strcat(pyoMsg, fchar);
}
strcat(pyoMsg, "]");
return pyo_exec_statement(interpreter, pyoMsg, 0);
}
int Pyo::value(const String &name, float *value, int len) {
char fchar[32];
const char * _name = name.getCharPointer();
sprintf(pyoMsg, "%s.value=[", _name);
for (int i=0; i<len; i++) {
sprintf(fchar, "%f,", value[i]);
strcat(pyoMsg, fchar);
}
strcat(pyoMsg, "]");
return pyo_exec_statement(interpreter, pyoMsg, 0);
}
int Pyo::set(const char *name, float value) {
sprintf(pyoMsg, "%s=%f", name, value);
return pyo_exec_statement(interpreter, pyoMsg, 0);
}
int Pyo::set(const String &name, float value) {
const char * _name = name.getCharPointer();
sprintf(pyoMsg, "%s=%f", _name, value);
return pyo_exec_statement(interpreter, pyoMsg, 0);
}
int Pyo::set(const char *name, float *value, int len) {
char fchar[32];
sprintf(pyoMsg, "%s=[", name);
for (int i=0; i<len; i++) {
sprintf(fchar, "%f,", value[i]);
strcat(pyoMsg, fchar);
}
strcat(pyoMsg, "]");
return pyo_exec_statement(interpreter, pyoMsg, 0);
}
int Pyo::set(const String &name, float *value, int len) {
char fchar[32];
const char * _name = name.getCharPointer();
sprintf(pyoMsg, "%s=[", _name);
for (int i=0; i<len; i++) {
sprintf(fchar, "%f,", value[i]);
strcat(pyoMsg, fchar);
}
strcat(pyoMsg, "]");
return pyo_exec_statement(interpreter, pyoMsg, 0);
}
void Pyo::midi(int status, int data1, int data2) {
pyo_add_midi_event(interpreter, status, data1, data2);
}
void Pyo::clear() {
pyo_server_reboot(interpreter);
}
return pyo_exec_statement(interpreter, pyoMsg, debug);
}

int Pyo::value(const char *name, float value) {
sprintf(pyoMsg, "%s.value=%f", name, value);
return pyo_exec_statement(interpreter, pyoMsg, debug);
}

int Pyo::value(const juce::String &name, float value) {
const char * _name = name.getCharPointer();
sprintf(pyoMsg, "%s.value=%f", _name, value);
return pyo_exec_statement(interpreter, pyoMsg, debug);
}

int Pyo::value(const char *name, float *value, int len) {
char fchar[32];
sprintf(pyoMsg, "%s.value=[", name);
for (int i=0; i<len; i++) {
sprintf(fchar, "%f,", value[i]);
strcat(pyoMsg, fchar);
}
strcat(pyoMsg, "]");
return pyo_exec_statement(interpreter, pyoMsg, debug);
}

int Pyo::value(const juce::String &name, float *value, int len) {
char fchar[32];
const char * _name = name.getCharPointer();
sprintf(pyoMsg, "%s.value=[", _name);
for (int i=0; i<len; i++) {
sprintf(fchar, "%f,", value[i]);
strcat(pyoMsg, fchar);
}
strcat(pyoMsg, "]");
return pyo_exec_statement(interpreter, pyoMsg, debug);
}

int Pyo::set(const char *name, float value) {
sprintf(pyoMsg, "%s=%f", name, value);
return pyo_exec_statement(interpreter, pyoMsg, debug);
}

int Pyo::set(const juce::String &name, float value) {
const char * _name = name.getCharPointer();
sprintf(pyoMsg, "%s=%f", _name, value);
return pyo_exec_statement(interpreter, pyoMsg, debug);
}

int Pyo::set(const char *name, float *value, int len) {
char fchar[32];
sprintf(pyoMsg, "%s=[", name);
for (int i=0; i<len; i++) {
sprintf(fchar, "%f,", value[i]);
strcat(pyoMsg, fchar);
}
strcat(pyoMsg, "]");
return pyo_exec_statement(interpreter, pyoMsg, debug);
}

int Pyo::set(const juce::String &name, float *value, int len) {
char fchar[32];
const char * _name = name.getCharPointer();
sprintf(pyoMsg, "%s=[", _name);
for (int i=0; i<len; i++) {
sprintf(fchar, "%f,", value[i]);
strcat(pyoMsg, fchar);
}
strcat(pyoMsg, "]");
return pyo_exec_statement(interpreter, pyoMsg, debug);
}

void Pyo::midi(int status, int data1, int data2) {
pyo_add_midi_event(interpreter, status, data1, data2);
}

void Pyo::clear() {
pyo_server_reboot(interpreter);
}
Loading