Genesis Pro
- KVRAF
- 2754 posts since 28 Feb, 2015
Yeah, people at Gearslutz are crazy, don't hang around with those people
Mac Mini M4 Pro | 14 Cores (10P/4E) | 48GB RAM | Studio One | Reason | Bitwig Studio | Logic Pro | FL Studio | Cubase Pro | Waveform | Reaper | Renoise | ~1000 VSTs/AUs | ~350 REs
- Banned
- 4491 posts since 8 Jul, 2008 from UK
Then you are doing something wrong because I am not getting hardly any CPU hit for a patch with all FX running. It's quite light on CPU. Massive X now that's a CPU killer, but this is nothing.Mr_meee wrote: Sat Mar 14, 2020 8:22 pm First opinion and review:
All you read here is based on first hour experience, opinion may change with more contact with synth or more understanding of its problems:
General idea of the synth:
- strait forward architecture, nothing new, nothing ground breaking, but very interesting randomizing implementations that allow you to customize each preset into something completely different quite easily, some of this features would be insanely good in other vsti's and i hope other developers also learn from this.
- The CPU hit on this synth is huge, ok? and i mean HUGE... i have a Dual Xeon E5 2690v2, it has 40 cores and 128gb of ram, my computer will smash by piece in benchmarks 99% of computers on earth and still it gets a 25/30% hit only by loading this plugin in Flstudio, not in reaper, but reaper works diffently, the spikes and crackles everyone is complaining about comes from the CPU usage... its basically too heavy... why? because the developer had amazing ideas very good ideas indeed, but synthedit, its not by any means the way to do it... i just hope some big company like U-He or Native instruments gives this guy a chance to do a Fking genesis pro 2 version but written in proper c++ language... its possível, it wont take 8 or 10 years it just needs proper coding... because the architeture of the synth is very simple...
I get massive CPU spikes when changing patches, which happens, but nothing when playing it.
Don't trust those with words of weakness, they are the most aggressive
- Banned
- 4491 posts since 8 Jul, 2008 from UK
Is that the cure for Coronavirus ?Davidson A & M wrote: Sun Mar 15, 2020 5:06 am This guy is making SE look bad he needs to update to the current version and drop old modules and really release this plugin properly even if it is synth edit. Also apologize for disrespecting programmers that made there intellectual property "SEM'S" free for those that credit them.. here is an example sem cpp file this is not easy that is why he should credit..
#include "../se_sdk3/mp_sdk_audio.h"
#define _USE_MATH_DEFINES
#include <math.h>
#include <cmath>
#include <cstdint>
/*
PolyBLEP Waveform generator ported from the Jesusonic code by Tale
http://www.taletn.com/reaper/mono_synth/
Permission has been granted to release this port under the WDL/IPlug license:
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
using namespace gmpi;
const double TWO_PI = 2 * M_PI;
template<typename T>
inline T square_number(const T &x) {
return x * x;
}
// Adapted from "Phaseshaping Oscillator Algorithms for Musical Sound
// Synthesis" by Jari Kleimola, Victor Lazzarini, Joseph Timoney, and Vesa
// Valimaki.
// http://www.acoustics.hut.fi/publication ... seshaping/
inline double blep(double t, double dt) {
if (t < dt) {
return -square_number(t / dt - 1);
}
else if (t > 1 - dt) {
return square_number((t - 1) / dt + 1);
}
else {
return 0;
}
}
// Derived from blep().
inline double blamp(double t, double dt) {
if (t < dt) {
t = t / dt - 1;
return -1 / 3.0 * square_number(t) * t;
}
else if (t > 1 - dt) {
t = (t - 1) / dt + 1;
return 1 / 3.0 * square_number(t) * t;
}
else {
return 0;
}
}
template<typename T>
inline int64_t bitwiseOrZero(const T &t) {
return static_cast<int64_t>(t) | 0;
}
class Oscillator : public MpBase2
{
AudioInPin pinPitch;
AudioInPin pinPulseWidth;
IntInPin pinWaveform;
AudioInPin pinSync;
AudioInPin pinPhaseMod;
AudioOutPin pinAudioOut;
AudioInPin pinPMDepthdmy;
BoolInPin pinPolypodPW;
IntInPin pinOne_Shot;
BoolInPin pinBypass;
BoolInPin pinEconomymode;
IntInPin pinResetMode;
FloatInPin pinVoiceActive;
enum Waveform {
SINE,
COSINE,
TRIANGLE,
SQUARE,
RECTANGLE,
SAWTOOTH,
RAMP,
MODIFIED_TRIANGLE,
MODIFIED_SQUARE,
HALF_WAVE_RECTIFIED_SINE,
FULL_WAVE_RECTIFIED_SINE,
TRIANGULAR_PULSE,
TRAPEZOID_FIXED,
TRAPEZOID_VARIABLE
};
Waveform waveform = SQUARE;
double sampleRate = 44100;
double freqInSecondsPerSample;
double amplitude = 0.5; // Frequency dependent gain [0.0..1.0]
double pulseWidth = 0.5; // [0.0..1.0]
double t = 0.0; // The current phase [0.0..1.0) of the oscillator.
public:
Oscillator()
{
initializePin( pinPitch );
initializePin( pinPulseWidth );
initializePin( pinWaveform );
initializePin( pinSync );
initializePin( pinPhaseMod );
initializePin( pinAudioOut );
initializePin( pinPMDepthdmy );
initializePin( pinPolypodPW );
initializePin( pinOne_Shot );
initializePin( pinBypass );
initializePin( pinEconomymode );
initializePin( pinResetMode );
initializePin( pinVoiceActive );
/*
PolyBLEP::PolyBLEP(double sampleRate, Waveform waveform, double initialFrequency)
: waveform(waveform), sampleRate(sampleRate), amplitude(1.0), t(0.0) {
setSampleRate(sampleRate);
setFrequency(initialFrequency);
setWaveform(waveform);
setPulseWidth(0.5);
}
*/
setFrequency(400.0);
}
int32_t MP_STDCALL open() override
{
setSampleRate(getSampleRate());
return MpBase2::open();
}
const static int maxVolts = 10;
inline float SampleToVoltage(float s) const
{
return s * (float)maxVolts;
}
inline float SampleToFrequency(float volts) const
{
return 440.f * powf(2.f, SampleToVoltage(volts) - (float)maxVolts * 0.5f);
}
void subProcess( int sampleFrames )
{
// get pointers to in/output buffers.
auto pitch = getBuffer(pinPitch);
auto pulseWidth = getBuffer(pinPulseWidth);
auto sync = getBuffer(pinSync);
auto phaseMod = getBuffer(pinPhaseMod);
auto audioOut = getBuffer(pinAudioOut);
auto pMDepthdmy = getBuffer(pinPMDepthdmy);
setFrequency(SampleToFrequency(*pitch));
for( int s = sampleFrames; s > 0; --s )
{
// TODO: Signal processing goes here.
*audioOut = getAndInc();
// Increment buffer pointers.
++pitch;
++pulseWidth;
++sync;
++phaseMod;
++audioOut;
++pMDepthdmy;
}
}
void subProcessPitchMod(int sampleFrames)
{
// get pointers to in/output buffers.
auto pitch = getBuffer(pinPitch);
auto pulseWidth = getBuffer(pinPulseWidth);
auto sync = getBuffer(pinSync);
auto phaseMod = getBuffer(pinPhaseMod);
auto audioOut = getBuffer(pinAudioOut);
auto pMDepthdmy = getBuffer(pinPMDepthdmy);
for (int s = sampleFrames; s > 0; --s)
{
setFrequency(SampleToFrequency(*pitch));
// TODO: Signal processing goes here.
*audioOut = getAndInc();
// Increment buffer pointers.
++pitch;
++pulseWidth;
++sync;
++phaseMod;
++audioOut;
++pMDepthdmy;
}
}
virtual void onSetPins(void) override
{
// Check which pins are updated.
if( pinPulseWidth.isStreaming() )
{
}
if( pinWaveform.isUpdated() )
{
switch (pinWaveform)
{
case 0:
setWaveform(SINE);
break;
case 1:
setWaveform(SAWTOOTH);
break;
case 2:
setWaveform(RAMP);
break;
case 3:
setWaveform(TRIANGLE);
break;
case 4:
setWaveform(SQUARE);
break;
}
}
if( pinSync.isStreaming() )
{
}
if( pinPhaseMod.isStreaming() )
{
}
if( pinPMDepthdmy.isStreaming() )
{
}
if( pinPolypodPW.isUpdated() )
{
}
if( pinOne_Shot.isUpdated() )
{
}
if( pinBypass.isUpdated() )
{
}
if( pinEconomymode.isUpdated() )
{
}
if( pinResetMode.isUpdated() )
{
}
if( pinVoiceActive.isUpdated() )
{
}
// Set state of output audio pins.
pinAudioOut.setStreaming(true);
if (pinPitch.isStreaming())
{
// Set processing method.
setSubProcess(&Oscillator::subProcessPitchMod);
}
else
{
setSubProcess(&Oscillator::subProcess);
}
// Set sleep mode (optional).
// setSleep(false);
}
void setdt(double time) {
freqInSecondsPerSample = time;
}
void setFrequency(double freqInHz) {
setdt(freqInHz / sampleRate);
}
void setSampleRate(double sampleRate) {
const double freqInHz = getFreqInHz();
this->sampleRate = sampleRate;
setFrequency(freqInHz);
}
double getFreqInHz() const {
return freqInSecondsPerSample * sampleRate;
}
void setPulseWidth(double pulseWidth) {
this->pulseWidth = pulseWidth;
}
void sync(double phase) {
t = phase;
if (t >= 0) {
t -= bitwiseOrZero(t);
}
else {
t += 1 - bitwiseOrZero(t);
}
}
void setWaveform(Waveform waveform) {
this->waveform = waveform;
}
double get() const {
if (getFreqInHz() >= sampleRate / 4) {
return sin();
}
else switch (waveform) {
case SINE:
return sin();
case COSINE:
return cos();
case TRIANGLE:
return tri();
case SQUARE:
return sqr();
case RECTANGLE:
return rect();
case SAWTOOTH:
return saw();
case RAMP:
return ramp();
case MODIFIED_TRIANGLE:
return tri2();
case MODIFIED_SQUARE:
return sqr2();
case HALF_WAVE_RECTIFIED_SINE:
return half();
case FULL_WAVE_RECTIFIED_SINE:
return full();
case TRIANGULAR_PULSE:
return trip();
case TRAPEZOID_FIXED:
return trap();
case TRAPEZOID_VARIABLE:
return trap2();
default:
return 0.0;
}
}
void inc() {
t += freqInSecondsPerSample;
t -= bitwiseOrZero(t);
}
double getAndInc() {
const double sample = get();
inc();
return sample;
}
double sin() const {
return amplitude * std::sin(TWO_PI * t);
}
double cos() const {
return amplitude * std::cos(TWO_PI * t);
}
double half() const {
double t2 = t + 0.5;
t2 -= bitwiseOrZero(t2);
double y = (t < 0.5 ? 2 * std::sin(TWO_PI * t) - 2 / M_PI : -2 / M_PI);
y += TWO_PI * freqInSecondsPerSample * (blamp(t, freqInSecondsPerSample) + blamp(t2, freqInSecondsPerSample));
return amplitude * y;
}
double full() const {
double _t = this->t + 0.25;
_t -= bitwiseOrZero(_t);
double y = 2 * std::sin(M_PI * _t) - 4 / M_PI;
y += TWO_PI * freqInSecondsPerSample * blamp(_t, freqInSecondsPerSample);
return amplitude * y;
}
double tri() const {
double t1 = t + 0.25;
t1 -= bitwiseOrZero(t1);
double t2 = t + 0.75;
t2 -= bitwiseOrZero(t2);
double y = t * 4;
if (y >= 3) {
y -= 4;
}
else if (y > 1) {
y = 2 - y;
}
y += 4 * freqInSecondsPerSample * (blamp(t1, freqInSecondsPerSample) - blamp(t2, freqInSecondsPerSample));
return amplitude * y;
}
double tri2() const {
double pulseWidth = std::fmax(0.0001, std::fmin(0.9999, this->pulseWidth));
double t1 = t + 0.5 * pulseWidth;
t1 -= bitwiseOrZero(t1);
double t2 = t + 1 - 0.5 * pulseWidth;
t2 -= bitwiseOrZero(t2);
double y = t * 2;
if (y >= 2 - pulseWidth) {
y = (y - 2) / pulseWidth;
}
else if (y >= pulseWidth) {
y = 1 - (y - pulseWidth) / (1 - pulseWidth);
}
else {
y /= pulseWidth;
}
y += freqInSecondsPerSample / (pulseWidth - pulseWidth * pulseWidth) * (blamp(t1, freqInSecondsPerSample) - blamp(t2, freqInSecondsPerSample));
return amplitude * y;
}
double trip() const {
double t1 = t + 0.75 + 0.5 * pulseWidth;
t1 -= bitwiseOrZero(t1);
double y;
if (t1 >= pulseWidth) {
y = -pulseWidth;
}
else {
y = 4 * t1;
y = (y >= 2 * pulseWidth ? 4 - y / pulseWidth - pulseWidth : y / pulseWidth - pulseWidth);
}
if (pulseWidth > 0) {
double t2 = t1 + 1 - 0.5 * pulseWidth;
t2 -= bitwiseOrZero(t2);
double t3 = t1 + 1 - pulseWidth;
t3 -= bitwiseOrZero(t3);
y += 2 * freqInSecondsPerSample / pulseWidth * (blamp(t1, freqInSecondsPerSample) - 2 * blamp(t2, freqInSecondsPerSample) + blamp(t3, freqInSecondsPerSample));
}
return amplitude * y;
}
double trap() const {
double y = 4 * t;
if (y >= 3) {
y -= 4;
}
else if (y > 1) {
y = 2 - y;
}
y = std::fmax(-1, std::fmin(1, 2 * y));
double t1 = t + 0.125;
t1 -= bitwiseOrZero(t1);
double t2 = t1 + 0.5;
t2 -= bitwiseOrZero(t2);
// Triangle #1
y += 4 * freqInSecondsPerSample * (blamp(t1, freqInSecondsPerSample) - blamp(t2, freqInSecondsPerSample));
t1 = t + 0.375;
t1 -= bitwiseOrZero(t1);
t2 = t1 + 0.5;
t2 -= bitwiseOrZero(t2);
// Triangle #2
y += 4 * freqInSecondsPerSample * (blamp(t1, freqInSecondsPerSample) - blamp(t2, freqInSecondsPerSample));
return amplitude * y;
}
double trap2() const {
double pulseWidth = std::fmin(0.9999, this->pulseWidth);
double scale = 1 / (1 - pulseWidth);
double y = 4 * t;
if (y >= 3) {
y -= 4;
}
else if (y > 1) {
y = 2 - y;
}
y = std::fmax(-1, std::fmin(1, scale * y));
double t1 = t + 0.25 - 0.25 * pulseWidth;
t1 -= bitwiseOrZero(t1);
double t2 = t1 + 0.5;
t2 -= bitwiseOrZero(t2);
// Triangle #1
y += scale * 2 * freqInSecondsPerSample * (blamp(t1, freqInSecondsPerSample) - blamp(t2, freqInSecondsPerSample));
t1 = t + 0.25 + 0.25 * pulseWidth;
t1 -= bitwiseOrZero(t1);
t2 = t1 + 0.5;
t2 -= bitwiseOrZero(t2);
// Triangle #2
y += scale * 2 * freqInSecondsPerSample * (blamp(t1, freqInSecondsPerSample) - blamp(t2, freqInSecondsPerSample));
return amplitude * y;
}
double sqr() const {
double t2 = t + 0.5;
t2 -= bitwiseOrZero(t2);
double y = t < 0.5 ? 1 : -1;
y += blep(t, freqInSecondsPerSample) - blep(t2, freqInSecondsPerSample);
return amplitude * y;
}
double sqr2() const {
double t1 = t + 0.875 + 0.25 * (pulseWidth - 0.5);
t1 -= bitwiseOrZero(t1);
double t2 = t + 0.375 + 0.25 * (pulseWidth - 0.5);
t2 -= bitwiseOrZero(t2);
// Square #1
double y = t1 < 0.5 ? 1 : -1;
y += blep(t1, freqInSecondsPerSample) - blep(t2, freqInSecondsPerSample);
t1 += 0.5 * (1 - pulseWidth);
t1 -= bitwiseOrZero(t1);
t2 += 0.5 * (1 - pulseWidth);
t2 -= bitwiseOrZero(t2);
// Square #2
y += t1 < 0.5 ? 1 : -1;
y += blep(t1, freqInSecondsPerSample) - blep(t2, freqInSecondsPerSample);
return amplitude * 0.5 * y;
}
double rect() const {
double t2 = t + 1 - pulseWidth;
t2 -= bitwiseOrZero(t2);
double y = -2 * pulseWidth;
if (t < pulseWidth) {
y += 2;
}
y += blep(t, freqInSecondsPerSample) - blep(t2, freqInSecondsPerSample);
return amplitude * y;
}
double saw() const {
double _t = t + 0.5;
_t -= bitwiseOrZero(_t);
double y = 2 * _t - 1;
y -= blep(_t, freqInSecondsPerSample);
return amplitude * y;
}
double ramp() const {
double _t = t;
_t -= bitwiseOrZero(_t);
double y = 1 - 2 * _t;
y += blep(_t, freqInSecondsPerSample);
return amplitude * y;
}
};
namespace
{
auto r = Register<Oscillator>::withId(L"SE Oscillator");
}
Don't trust those with words of weakness, they are the most aggressive
-
- KVRian
- 909 posts since 7 Nov, 2017
In Bitwig Studio on an i9 9900K machine (8c/16t), the CPU usage is very light. Much lighter than most other synths. Maybe the people claiming it's heavy on CPU are seeing some byproduct of the bridging they're using? Bitwig has native 32-bit bridging and in this case it seems quite efficient and stable.
-
- KVRAF
- 5201 posts since 16 Nov, 2014
So anyone made a useful audio demo yet to show.
I saw a few now going trough some default presets and it sounded indeed all thin and lifeless compared to the "official" demos. Maybe they used as usual the best audio interfaces, mastering and whatever on top to mask the pure raw sound or just showcase the "impressive" presets.
So far even stock synths in Logic have more "meat".
But as usual its all Dr. Jekyll and Mr. Hype.
I still would try it for a dollar but it seems i not missed anything game changing yet
I saw a few now going trough some default presets and it sounded indeed all thin and lifeless compared to the "official" demos. Maybe they used as usual the best audio interfaces, mastering and whatever on top to mask the pure raw sound or just showcase the "impressive" presets.
So far even stock synths in Logic have more "meat".
But as usual its all Dr. Jekyll and Mr. Hype.
I still would try it for a dollar but it seems i not missed anything game changing yet
-
- KVRAF
- 2648 posts since 20 Jun, 2012
Now that most votes are in I guess we can conclude that it's better do-it-everything all around synth than Synthmaster?
No signature here!
- KVRist
- 262 posts since 16 Oct, 2016
Not even close. There are a few 'cute' features that make me smile a little (but serve almost no purpose), and some of the presets sound nice... and that's about it really.robotmonkey wrote: Sun Mar 15, 2020 12:57 pm Now that most votes are in I guess we can conclude that it's better do-it-everything all around synth than Synthmaster?
The thing is such a buggy mess (using Reaper64 with built-in 32bit bridge). If I try to open more than one instance in a project, Reaper freezes. Some stupid dialog window pops-up telling me to purchase a license whenever I launch the thing (I already have). The damn envelope icon in the main window keeps flashing, telling me I have a new message (I've read that message many times now).
I really wasn't expecting much from a $2 synthedit VST, but I've now given up on it... at least until they can iron out many of it's current bugs.
-
- KVRAF
- 1894 posts since 9 Jul, 2014 from UK
Apparantley you gotta run your daw as administrator to get over this problemSuburst wrote: Sun Mar 15, 2020 1:43 pm I can't load the synth anywhere. Win10 here, tried on many daws. Anyone knows why? it loads as a tiny blank window
I wonder what happens if I press this button...
-
- KVRAF
- 2648 posts since 20 Jun, 2012
So it's great for that Japanese style lo-fi glitch music in the style of Fennesz, David Sylvian, Sakamoto, Yukihiro Takahasi and such. Definitely a must buy for me thendarsho wrote: Sat Mar 14, 2020 10:36 pm I managed to get it to run now, but it crackles a lot. Even with 512 Samples for the Audio card. Even though the performance meter in Reaper shows that it only uses 5 % of my CPU.
No signature here!
