Giter Site home page Giter Site logo

attilammagyar / js80p Goto Github PK

View Code? Open in Web Editor NEW
84.0 6.0 4.0 198.42 MB

A MIDI driven, performance oriented, versatile synthesizer.

Home Page: https://attilammagyar.github.io/js80p/

License: GNU General Public License v3.0

Makefile 0.77% Batchfile 0.03% HTML 0.57% C 1.13% Python 1.52% Shell 1.31% C++ 85.26% CMake 2.54% Objective-C++ 5.99% Objective-C 0.78% R 0.08% PowerShell 0.01% Smarty 0.02%
audio gplv3 midi music sound synth synthesis synthesizer vst vst3

js80p's People

Contributors

aimixsaka avatar attilammagyar avatar zonderp avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

js80p's Issues

GUI redraw issues

When switching between tabs or out of the "modulation chooser" dialog, various parts of the GUI are often not immediately redrawn, and you need to drag the window off the screen and back to force a redraw.

Center switch for LFOs

Currently LFOs oscillate between min and min + amount * (max - min), which makes it cumbersome to use them for vibrato by assigning them to the Fine Detune parameter of an oscillator, especially if one wants to also control the amount of the modulation.

This could be simplified a lot by adding a toggle switch to each LFO which would make it oscillate between (min+max)/2 - (max-min)*amount/2 and (min+max)/2 + (max-min)*amount/2.

rethink passing `std::string` by value

I had the impression that move constructors, copy elision, small-string optimization, and other modern C++ features will take care of it, but as @ZonderP pointed out in issue #6, I never actually confirmed these assumptions. Maybe passing around string_view-s or const refs would actually be beneficial for most parts of the code.

Frequency controllers are linear

All the frequency (Hz) based controllers go from:

  • full off = 1Hz
  • Half on = 12kHz
  • Full on = 24 kHz

This is basically unusable for synthesis.

All manual adjustment needs to be done to these parameters on a logarithmic scale - 1 volt per octave.

All internal modulation should work like that on frequency parameters too.

Occasional sudden jumps in dynamic envelope controlled parameters when the same voice is triggered multiple times in quick succession (especially in monophonic mode) while the envelope is being changed

When a parameter is updating the ramps on its event queue for a dynamic envelope, it may cancel previously scheduled envelope end and subsequent start events if those happen to fall on the same rendering block.

Reproduction

  1. Configure long audio buffers in the host (4196 samples or more - it's impractical, but long buffers make it easier to get multiple envelope events scheduled for the same block);
  2. Switch to monophonic mode to make sure that the envelope events will be assigned to the same voice;
  3. Use a dynamic envelope for e.g. the Volume parameter of an oscillator;
  4. Assign a MIDI controller (or a MIDI controller driven Macro) to one of the parameters of the envelope.
  5. Trigger short notes in quick succession.

Expected result

Envelope settings (especially attack and release) are honored in all notes, changed envelope settings are approached smoothly, and if release times are longer than how the new notes are triggered, then voice cancelling and retriggering is also smooth.

Actual result

Occasional sudden jumps at the beginning and end of notes.

FST plugin should expose (DAW-automatable) parameters for MIDI CC, like in VST 3

MIDI CC in the VST 3 standard is implemented by exposing virtual parameters which are automatically assigned to MIDI CC events, which has the side-effect that those parameters can also be conveniently controlled and automated in various ways using the DAW's automation lanes. The latter part is actually a nice little feature, which probably could, and if so, should be implemented in the FST plugin version as well. (See issue #6.) Feature parity is a good thing.

Motivation: let's say the plugin exposed all its parameters. But then what should happen if a parameter has an automation track in the DAW and at the same time, is assigned to a controller within the plugin? This ambiguity could be resolved by introducing a new controller named Host, which would mean that parameters which have this controller assigned to them, would be automated by the DAW. But this seems redundant, because DAWs can already send automated MIDI CC events to the plugin, and the plugin already supports automation by MIDI CC, so the basic functionality already exists, without a single line of new code. ("The best code is no code at all.") However, being able to use the automation track vs. having to edit automations in the MIDI editor are sometimes very different in terms of convenience, hence the issue.

Compile error

I'm getting this

C:/mingw64/bin/g++.exe -I./lib -I./src -D TEST_MAX_ARRAY_PRINT=20 -I./tests -g -D JS80P_VERSION_STR=dev -D JS80P_VERSION_INT=999000 -Wall -Werror -msse2 -ffast-math -O3 -o build/x86_64-w64-mingw32/test_gui.exe tests/test_gui.cpp
In file included from tests/gui_stubs.cpp:24,
                 from tests/test_gui.cpp:29:
./src/gui/gui.hpp:277:29: error: 'virtual JS80P::WidgetBase* JS80P::WidgetBase::own(JS80P::WidgetBase*)' was hidden [-Werror=overloaded-virtual=]
  277 |         virtual WidgetBase* own(WidgetBase* widget);
      |                             ^~~
In file included from tests/gui_stubs.cpp:107:
./src/gui/widgets.hpp:125:22: note:   by 'JS80P::ParamEditor* JS80P::TabBody::own(JS80P::ParamEditor*)'
  125 |         ParamEditor* own(ParamEditor* param_editor);
      |                      ^~~

when I try to build latest main branch with '\build.bat' on Windows.

g++ --version gives me this:

g++.exe (MinGW-W64 x86_64-msvcrt-mcf-seh, built by Brecht Sanders) 13.1.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Any ideas?

(I'm trying to add some FST ;-) features - like support for bank of programs, program name(s), switching of program etc. as well as support for parameter automation in a host...)

Filter cutoff frequencies still linear

#1 has been closed and the documentation says that logarithmic filter controls are "supported" but the actual controls are still linear. Do I have to switch the filters into a logarithmic mode? How? There is nothing in the docs.

Knob labels unclear

The labels are extremely terse - a way to see the full parameter name without clicking on the modulation source would be very helpful. Some sort of mouse-over "tool tip"? Or display the full name of a knob currently being manually adjusted?

LFO tempo sync

It would be nice to be able to synchronize the frequency of an LFO to the host's tempo.

(It could be just a small checkbox-like thing on the UI somewhere, which would make an LFO's frequency parameter to be interpreted as oscillations per beat instead of oscillations per second, Hz.)

LV2 support

This will require some decoupling between the GUI and the Synth, with a hint of ISP.

(The VST3 plugin could probably also benefit from it if the Controller and the Processor could be more separated, see Vst::kDistributable.)

Linux VST3 binary release should be in a folder

Thank you for this interesting plugin.

I noticed that the Linux binary release zip file contains among other files the plugin binary called either js80p.vst3 or js80p.so.

I can't use the file as it is in the binary release zip file.

To make it work with the plugin hosts/DAWs I use, mainly Bespoke Synth, Ardour and Carla it needs to be put inside a correct VST3 bundle folder structure ( Steinberg VST3 Plug-in Format Structure docs ).

In short, the zip files should contain a folder and files with this structure:

js80p.vst3/
└── Contents
    └── x86_64-linux
        └── js80p.so

EDIT: I see you already have a merged release with the correct structure, so this problem should be addressed only for the Linux VST3 single file?

VST3 folder path

thanks for making this synth available for Linux systems

for the VST3 a few tweaks are needed

rather than js80p.vst3 being the name of the binary it should be a folder with subfolders Contents and x86_64-linux

js80p.vst3/Contents/x86_64-linux/

the folder x86_64-linux would have the binary and presets
renaming the binary from js80p.vst3 to js80p.so would be the last step

image

strange preset handling in Savihost and energyXT

From #11:

But - when it comes to preset handling, something is not quite right.
It doesn't behave anymore as it did with my initial changes to support bank and preset handling.
Probably related to the changes you did, where - if I understand the code correctly - related 'work' somehow gets deferred to when audio processing takes place. Since I still can't debug, I'm not sure what's going on.
But with my changes js80p behaved well - the same way as does the majority of FST plugins which support banks and thus more than just one program.
I'm not sure if you know SaviHost? It's Windows only, but it is used by a lot of FST developers to easily check, if their bank and program handling works as it should. Basically it is not a DAW, but 'just' a host by which you can make any FST a standalone.
And it supports the standard FST stuff when it comes to loading and saving of banks and programs and stepping thru the programs either backwards or forwards or just jumping to (loading a program at) a specific position. Also Savihost remembers the last program index at exit (probably somewhere in the Windows registry) and on restarting with the same FST, it immediately tells the FST to load the program at that position.
Here some of my observations with Savihost together with js80p:
1.) If - whilst js80p is hosted by Savihost - I e.g. load the program at index 40 and then exit Savihost and then open js80p again with Savihost, then it always starts at index 0 (wrong!). But when I then click the 'next program arrow', it jumps to the index used at last exit (40 in this example) + 1. Very strange and unfortunately quite unexpected and wrong.
2.) Again with js80p loaded in Savihost. When I go to an empty slot - eg. at index 31 this time and then load a previously saved preset file (fxp) - it is just plain wrong - the GUI doesn't get updated and the sound is still the 'blank' sound there.
And then pressing 'Next program' makes Savihost somehow look like it was faulty, because then js80p goes to the previous index!
It's really a bit hard to describe - I just found out that if you use Savihost's PlugIn menu 'Programs n - m' entries then js80p just behaves super weired. It somehow always jumps to the position which was previously chosen.
Makes working with it impossible.
As said - I (re)tried with my old version - and everything works as it should. The same as e.g 'blooo' by 'fullbucket music' and most of all FSTs I know.

Edit:
Here the link to Savihost in case you want to try out: https://www.hermannseib.com/english/savihost.htm
And here the link where you could DL blooo FST to see how a well-behaving FST works with it: https://www.fullbucket.de/music/blooo.html

Also: I for sure also tried in energyXT, where there are the same resp. similar issues.

Edit 2:
And here my original version:
https://github.com/ZonderP/js80p-zp/commits/MyFSTBankAndPresetHandling

Add riscv64 support

Hello, I'm working on porting archlinux to riscv, and want to know are there any plans to add riscv64 support for this project?
I already did some job here: https://github.com/aimixsaka/js80p (stil not fully tested and may contains some breaking change).
If it's ok i will help to maintain this project on riscv for the long term.
Thank you :)

Compile directly with Visual Studio & Win 10/11

Instructions indicate that this project requires mingw toolchain to compile the VST3. Wondering if this could be modified to enable Microsoft toolchain / Visual Studio without mingw, as this is would be a more common development environment.

Much thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.