Changes

m
Line 27: Line 27:     
=== Files to touch/create ===
 
=== Files to touch/create ===
 +
 +
==== Engine XXX class file: zyngine/zynthian_engine_XXX.py ====
 +
 +
Implementing a new engine is not too difficult, but the details are a little bit tricky. Try studing the ''setBfree'' implementation. Probably it's the most simple. ''ZynAddSubFX'' is quite straightforward too.
 +
 +
* If you need to start the engine after knowing the MIDI channel, you should implement the add_layer function and "start" the engine there. In that case, don't call the "start" function from the constructor.
 +
 +
* If you want the layer can be moved to a different channel, you should implement the '''set_midi_chan'''. If your synth engine must be started with a fixed MIDI channel, you should restart the engine in the specified MIDI channel.
 +
 +
* For getting the presets, implement the '''get_preset_list''' function. It should return a list of "sets". Every preset "set" have this format:
 +
 +
(preset_file_path, (bank_msb, bank_lsb, program),  title, extra)
 +
 +
The file path is a string that will be used by set_preset for loading the preset. No need to be a real file path. The second element is a set that can be used by '''set_preset''' for loading the preset using MIDI messages (bank, program). If not used, it should be None. The title is the preset name as shown by the UI. The 4th parameter is optional. Use it for storing whatever you need, related with the preset.
 +
 +
* If there is no banks, you should return an empty list in the **get_bank_list** function. The UI will ignore the bank screen and go directly to the presets screen.
 +
 +
==== zyngui/zynthian_gui_engine.py ====
 +
 +
For getting the new engine listed in the engine selection screen, you need to add some lines to '''zyngui/zynthian_gui_engine.py'''.
 +
 +
* Probably you also want (in a first approach) to avoid the possibility of starting more than one Pianoteq layer. For getting this, you would need to tune the '''zyngui/zynthian_gui_engine::fill_list''' function.
 +
 +
==== zyngui/zynthian_gui_layer.py ====
 +
 +
If you prefer to remove the option of "moving a layer to a differet channel" from the UI, you should add some dirty code in the '''zyngui/zynthian_gui_layer::add_layer''' function.
    
=== How to test ===
 
=== How to test ===
 +
For testing your development, you should install your forked development version into your zynthian box. Something like this could do the job:
 +
 +
systemctl stop zynthian
 +
cd /zynthian
 +
mv zynthian-ui zynthian-ui.orig
 +
git clone https://github.com/#your_github_account#/zynthian-ui.git
 +
cd zynthian-ui
 +
git checkout #your_development_branch#
 +
/zynthian/zynthian-sys/sbin/zynthian.sh
 +
 +
For better debugging, i recommend to edit "/zynthian/zynthian-sys/sbin/zynthian.sh" and enable exception raising, like that:
 +
 +
ZYNTHIN_RAISE_EXCEPTIONS=1
 +
 +
For avoiding adding/commiting every time you change/fix something, i recommend copying the files directly to your zynthian box. This will avoid polluting the git history and simplify the development/test cycle. Once your changes are tested and your code stable, you can add/commit and sync your zynthian box from your development repo, like this:
 +
 +
cd /zynthian/zynthian-ui
 +
git checkout .
 +
git pull
 +
 +
This will overwrite your local changes and will take the latest changes from the repo.
    
=== How to get the software into Zynthian(-master) ===
 
=== How to get the software into Zynthian(-master) ===
 +
 +
If it's your first development for zynthian, you should get familiar with git and github. I recommend start "forking" in github the repository you want to work in (zynthian-ui) and creating a "branch" for your development. When you have a stable version of your work, you should make a "pull request" from your forked github repository.
 +
 +
See also: [[Zynthian_Devel_General|How to contribute to Zynthian development?]]