Compare commits

...

824 Commits

Author SHA1 Message Date
Jonathan Moore Liles cdad26211b Bump versions. 2021-01-27 17:50:26 -08:00
Jonathan Moore Liles ba30c91dad Update NTK 2021-01-27 17:46:38 -08:00
Jonathan Moore Liles 3aa5fc3c21 Mixer: Avoid some unnecessary reallocations when changing channel count. 2021-01-27 17:43:35 -08:00
Jonathan Moore Liles ce633212bb Timeline: Tweak style of loop point indicator. 2021-01-27 17:42:28 -08:00
Jonathan Moore Liles 0f8017a1ef Mixer: Cope with some plugins having insane numbers of parameters. 2021-01-27 17:41:19 -08:00
Jonathan Moore Liles e909d9594b Revert "Add 128x128 hicolor as possible icon path"
This PR was submitted in bad faith by a bad actor, didn't do anything useful, and was only accepted out of diplomacy. That was a mistake. Reverting.
This reverts commit 55de086026.
2021-01-26 17:05:13 -08:00
Jonathan Moore Liles f76de32c44 Update NTK. 2021-01-20 18:31:25 -08:00
Jonathan Moore Liles 181dd64689 Mixer: Fix export strip function. 2021-01-20 17:22:51 -08:00
Jonathan Moore Liles c83aa8ebd8 Update NTK. 2021-01-10 14:47:02 -08:00
Jonathan Moore Liles 0b23c871ee Mixer: Re-transmit the minimum amount of OSC/MIDI feedback messages when strips are rearranged. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles e7c85f1a37 Timeline: Fix region DND onto last track that was a connection DND source. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles 826bea3c30 Timeline: Fix rare issue where moving the mouse over a region while recording at just the right moment could cause a spurious SET action to be written to the history. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles 393684f376 Mixer: Enforce stability of module OSC path over close/open cycles.
Also, allow CV input of for multiple instances of the same plugin/parameter on the same strip.
2021-01-10 14:46:27 -08:00
Jonathan Moore Liles ab469f8a23 Mixer: Fix crash on save after group removal. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles cf03ea1562 Mixer: fix size of SM blinker. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles cda92589e9 Mixer: Fix meter falloff in chain view. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles f2aeb8a1f8 Mixer/DPM: Fix bug where peaks are sometimes not drawn. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles 9f3181b9c7 Mixer: Because disconnecting/connecting JACK ports is slow, when handling a change of strip auto input setting, avoid disconnecting a port and then reconnecting it later. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles 20dce6c6e6 Timeline: Don't assert if peakfile contains no blocks---it's probably just because it was just opened and hasn't been written into yet. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles 793a9c1d4b Mixer: Make port autoconnection during startup and shutdown more efficient. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles f6e3ca8831 Mixer: Automatically run in "noui" mode if DISPLAY environment variable unset (i.e. X11 not available). 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles 286dec338c Mixer: Fix JACK port disconnection when Auto Input/Output mode is changed. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles 00c02c7d74 Mixer: Fix settings menu layout issue. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles e46fac4470 Partially revert "Mixer: Avoid some unnecessary redraws when opening project."
This reverts commit e303cf093f32472ed582ec0cad1ff758278f71f6.
2021-01-10 14:46:27 -08:00
Jonathan Moore Liles e0402a3b99 Mixer: Fix glitch in redrawing of meter scales when scrolling. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles 7c071c7422 wscript: Use -mtune=native by default for performance boost benefiting those who build from source, packagers can disable. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles 9e82b28f07 dsp: code style tweak. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles a0fd557baf Timeline: fix crash when removing a track. 2021-01-10 14:46:27 -08:00
Jonathan Moore Liles 82f9610ca8 Mixer: Try to better cope with parameter feedback feedback cycles. 2021-01-10 14:46:20 -08:00
Jonathan Moore Liles 1f0f01c0ad Timeline: Don't send the same OSC control sequence value twice and so avoid messing with OSC learning in non-mixer when transport is stopped. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles e290c6ea60 Mixer: Fix crash if user messes with the window while project is loading. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 9aa275e0af Mixer: Fix crash when disabling strip auto output. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles f5b215066a Mixer: Implement slow fall off for meters. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles c808c53d6c Timeline: Acquire sequence lock for region split. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles ae773fbf62 Mixer: Tweak appearance. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 6bde5017f5 Mixer,Timeline: Fix port connection drag and drop between applications. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles da78618e5b Mixer: Make meters more efficient. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 368492f1c0 Sequencer: Use a 3 break gradient for velocity colors. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 5ea0c24468 Sequencer: Fix crash in event editor. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles d84416c196 Mixer/Module_Parameter_Editor: Tweak layout so that 4-Band Parametric Filter plugin is more legible. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles a59823e4c5 Mixer: Tweak strip highlighting. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 6673606262 Mixer: Tweak meter appearance. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 54e8737a90 Timeline: Don't forget to log changing takes after the fact. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 0157734a30 Timeline: Add "Disabled" fade type to disable both fade and declicking for cases where regions need to be abutted perfectly. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 655ccf94c3 Mixer: Avoid some unnecessary redraws when opening project. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles a9846d1fc3 Mixer: Tweak meter appearance. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles ad6dbba07c Timeline: Split OSC send and receive functionality into different threads. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 362a153412 nonlib/OSC/Endpoint: Work around for liblo/UDP layer dropping packets on bulk signal listing. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 830823a226 Mixer/DPM: Quick hack to add smoothing to meter values. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles dd274db49b Mixer/Module_Parameter_Editor: Tweak slider appearance. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 13c107ebcc Mixer: Tweak meter appearance to look better with light color schemes. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles b1d59fc68a Timeline,Mixer: Tweak colors for light themes. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles e42b50814a FL/Fl_Sometimes_Input: Allow user to abort edit with Escape key. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 628fef30e9 Mixer/Module_Parameter_Editor: Increase font sizes, tweak boxtypes. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 53ff9621ff Sequencer: Fix bug in fitting scale to viewport. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles ee872467fb Mixer: Make panner points more opaque. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 9987f78a72 Mixer: Dezipper spatializer azimuth and elevation automation. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 7895b5ec7e Mixer: Allow Mono Pan module to be added a stereo chain. This converts the signal to mono and then pans the result. Useful for auditioning a mix in mono. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 83f7aa87f0 Timeline: Tweak styling of selected regions. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 8d6885387b Mixer: Show strip number at top of each strip (eases mentally mapping onto hardware control surface). 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 4c14cdd350 Timeline: Redraw right hand child region on split. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles b13d2da674 Timeline: Fix rare segfault which occurred when region loop point is just beyond the end of a region and at the beginning of a buffer. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 5378bbbb27 Timeline: Improve error message for sf_open create. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles b0d850ff76 nonlib/MIDI: Cleanup some type signatures. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles e5c08b3b58 MIDI-Mapper: Require controls to be actuated/moved twice before mapping signal in order to detect whether value has 14, 7 or 1 significant bits.
Also, support non-motirzed faders/endless encoders by not transmitting control change until value of controller comes within 5% of value of signal.
Also, change file format (backwards compatible).
Also, fix some issues with NRPN decoding.
2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 572f94ad44 MIDI-Mapper: Preserve mapping creation order when loading/saving. This makes it possible to fiddle controls in a defined order and then edit the file to give them useful names. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles e36a053b84 Sequencer: Don't crash when user picks the branch instead of the leaf in scale chooser. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 10bcd0c2d7 Midi-Mapper: Don't get confused if user neglects to operate all controls on the first run. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles cd4896b762 Sequencer: Just use theme UP_BOX for note shape... 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 19b7927f08 Sequencer: Tweak appearance to look better with different color schemes. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles a2089421b1 Mixer: Give better visual feedback in control OSC/MIDI learning mode. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 5affbe4cef Mixer: Fix osc/midi by-number mode control for strips with names containing punctuation and spaces. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 9b87c089d0 Mixer: Improve contrast with light color scheme. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles cb3d4f9254 Mixer: Remove superfluous semicolon. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 9330b07d99 Mixer: Fix off by one bug in strip autoconnect affecting Auxes. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles a578cbb8e1 Sequencer: Add some missing items to GM Drum note map. 2021-01-09 15:00:35 -08:00
Jonathan Moore Liles 820298f4dd Timeline: Make clocks look more contrasty with light color scheme. 2021-01-09 15:00:23 -08:00
Jonathan Moore Liles 992e55bf0d Sequencer: Fix configuration bug causing error message "Couldn't open instrument directory". 2021-01-05 18:20:24 -08:00
Jonathan Moore Liles 81e24f4239 Sequencer: Fix off-by-one bug preventing notes from being inserted ahead of other notes. 2021-01-05 18:20:24 -08:00
Jonathan Moore Liles 6bee859f6f Timeline: Tweak style of measure lines. 2021-01-05 18:20:24 -08:00
Jonathan Moore Liles 455cc0f3ad Timeline: Tweak style of audio regions. 2021-01-05 18:20:24 -08:00
Jonathan Moore Liles 8109ff7bc0 Sequencer: Fix casting/sign related bug which could cause a hang during SMF writing. 2021-01-05 18:20:24 -08:00
Jonathan Moore Liles 1a07dda5d9 Sequencer: Save file to tmp file before overwriting original. 2021-01-05 18:20:24 -08:00
Jonathan Moore Liles b3ffef17b5 Mixer: Show strip number at top of each strip (eases mentally mapping onto hardware control surface). 2021-01-05 18:20:23 -08:00
Jonathan Moore Liles a7a7b967c8 Mixer: Tweak module colors. Show LADSPA plugins in a different color. 2021-01-05 18:20:23 -08:00
falkTX 55de086026 Add 128x128 hicolor as possible icon path
128 / 32 = 4, so it scales cleanly

Fixes showing icon for zynaddsubfx and carla
2021-01-05 18:12:32 -08:00
Jonathan Moore Liles 7565be85fb Session-manager: Work around for clients with stupidly large icons. 2021-01-03 18:35:37 -08:00
Jonathan Moore Liles 0106604073 Mixer: Fix crash when closing project containing certain configurations of modules. 2021-01-02 13:28:13 -08:00
Jonathan Moore Liles 97d12322f5 Revert "Merge remote-tracking branch 'diovudau/master'"
This reverts commit bbe8386499, reversing
changes made to d958df0486.

Change was poorly thought out, unnecessary, ill advised, and poorly implemented, but was accepted in the name of diplomacy. That was a mistake. Reverting.
2021-01-02 13:25:53 -08:00
Jonathan Moore Liles bbe8386499 Merge remote-tracking branch 'diovudau/master' 2020-03-06 21:48:57 -08:00
Nils aa940df662 Add message /nsm/gui/session/root to ask for the absolute path of the NSM directory 2020-03-02 18:29:27 +01:00
Jonathan Moore Liles d958df0486 Upgrade waf to 2.0.18
Closes #253
2019-09-25 00:03:13 -07:00
Olivier Humbert c15bfa85fd Update non-timeline.desktop.in 2018-09-16 11:14:52 -07:00
Olivier Humbert 7f0cc1d733 Update non-session-manager.desktop.in 2018-09-16 11:14:52 -07:00
Olivier Humbert 911a9bded4 Update non-sequencer.desktop.in 2018-09-16 11:14:52 -07:00
Olivier Humbert d280f9391f Update non-mixer.desktop.in 2018-09-16 11:14:52 -07:00
Jonathan Moore Liles ea6ff30cea wscript: Fix install error caused by upgrade to waf 2.0.9.
Closes #244
2018-08-25 13:16:36 -07:00
Jonathan Moore Liles d0432caa0b Update NTK submodule. 2018-08-21 18:10:14 -07:00
Jonathan Moore Liles 9e9f90f2f0 Upgrade waf to 2.0.9
Closes #244
2018-08-20 21:21:38 -07:00
Jonathan Moore Liles 5ae43bb27c nonlib/OSC: Don't try to send feedback to non-existent path.
Closes #227.
2018-02-14 17:28:39 -08:00
Jonathan Moore Liles 1904aba516 Non-Mixer: Tweak MIDI mapping section of doc and render MUP to HTML. 2017-07-08 10:11:23 -07:00
Jonathan Moore Liles 9fdf3a6ae3 Merge documentation patch. 2017-07-08 09:47:11 -07:00
Jonathan Moore Liles a2971c0718 wcsript: Fix syntax for Python3.
Closes #216
2017-05-14 12:06:51 -07:00
Jonathan Moore Liles 63a624414b wscript: Automatically disable SSE on platforms that don't support it (i.e. raspberry pi)
Closes: #213
2017-05-06 21:17:56 -07:00
non25 7f42caf789 Additional info
Added info about MIDI controller usage, and info on getting OSC paths for Module controls.
2017-04-24 15:53:08 +03:00
Jonathan Moore Liles 3d18cf37b9 Update NTK. 2017-04-23 10:38:07 -07:00
Jonathan Moore Liles 10c31e5729 Timeline: Add option to import source at mouse via timeline context menu (as an alternative to DND)
Closes #211.
2017-03-28 18:12:56 -07:00
Jonathan Moore Liles 1daf0f6150 Replace deprecated scanf %a modifier with %m. 2017-03-28 18:12:56 -07:00
Jonathan Moore Liles e7f4a1c4b9 Timeline: Rework region loop and loop declick logic. 2016-12-09 19:13:52 -08:00
Jonathan Moore Liles 754d113b0e Timeline: Rework region fade in/out and declick logic.
Closes #204
2016-12-06 17:19:12 -08:00
Jonathan Moore Liles a22f33f486 Merge pull request #201 from hilbrichtsoftware/master
Change 4 lines in the docs to reflect that the server sends server-co…
2016-10-13 15:26:29 -07:00
Nils Hilbricht 35d06de361 Change 4 lines in the docs to reflect that the server sends server-control in capabilities not server_control 2016-10-14 00:20:56 +02:00
martin f572e331ee Unblock SIGCHLD for launched processes 2016-05-30 20:41:26 +01:00
Daniel Appelt 16885e69fe Add missing first event to sequencer event editor 2016-04-05 23:21:45 +02:00
Jonathan Moore Liles 3946d39221 Mixer: Fix issues with port auto-connection
Closes #188
2016-03-05 15:02:54 -08:00
Jonathan Moore Liles 1ef382fbbe NSM: Fix mem/fd leaks
Closes: #187
2016-02-06 17:51:05 -08:00
Jonathan Moore Liles 5d274f430c Non-Sequencer: Don't die in event editor when inserting event with none selected.
Closes #182, #118
2015-12-16 17:57:09 -08:00
Jonathan Moore Liles 88fe7e7b97 Mixer/AUX_Module: Define can_support_inputs function.
Closes #181
2015-10-06 17:16:57 -07:00
Jonathan Moore Liles b57f891e6d OSC: Fix OSC method deletion upon signal deletion.
Closes #184
2015-10-05 17:58:49 -07:00
Jonathan Moore Liles 5984b12b1a Timeline: Fix invalid output of control sequence playback before initial and after final control point.
Closes #180
2015-10-03 20:23:09 -07:00
Jonathan Moore Liles f483957996 OSC: Fix dangling method on signal rename.
Closes #174
2015-10-02 17:38:54 -07:00
Jonathan Moore Liles cfe4aec158 Timeline: Fix segfault in control sequence playback
Closes #173
2015-10-02 17:38:45 -07:00
Jonathan Moore Liles fe51e322f3 OSC: Fix signal lookup in removal notification handler.
Closes #176
2015-09-30 17:37:34 -07:00
Jonathan Moore Liles c0113d1e7a Timeline: Don't let sequence widgets swallow events meant for track header.
Closes #177
2015-09-30 17:37:27 -07:00
Jonathan Moore Liles abde7f3bb5 Mixer/Controller_Module: Shutdown JACK port when switching off CV mode.
Closes #172
2015-09-29 22:11:49 -07:00
Jonathan Moore Liles 156fd6d453 Revert "Timeline: Fix bug in track right click handling."
This reverts commit 8a6772b6b9.

Closes #171
2015-09-29 22:11:49 -07:00
Jonathan Moore Liles aefc328c2d Timeline: Improve drag scrolling behavior. 2015-09-29 22:10:37 -07:00
Jonathan Moore Liles 97d149421f Timeline: Cleaner fix for resize behavior. 2015-09-29 22:10:29 -07:00
Jonathan Moore Liles 3e4c6e9a50 Timeline: Fix determination of project name from command-line.
Closes #169
2015-09-29 22:10:19 -07:00
Jonathan Moore Liles 640bfbb4d1 Timeline: Improve window resize behavior. 2015-09-22 17:44:14 -07:00
Jonathan Moore Liles 386d293650 Timeline: Hide spacer widget that was interfering with drag and drop event delivery.
Closes #165
2015-09-21 17:34:44 -07:00
Jonathan Moore Liles 83fa3637f6 Timeline/Control_Sequence: Use un-clamped X values for drawing curves. 2015-09-18 17:25:58 -07:00
Jonathan Moore Liles e42f0a9bd7 Timeline: Fix region box drawing error. 2015-09-18 17:25:48 -07:00
Jonathan Moore Liles 319a393cd6 Timeline: Fix region/fade drawing at tight zoom levels.
Closes #164
2015-09-17 19:34:22 -07:00
Jonathan Moore Liles 037ecb5d9f Mixer: Fix delayed OSC response in noui mode.
Closes #152
2015-09-14 17:24:49 -07:00
Jonathan Moore Liles dc25c750fb Timeline: Fix false region drag between tracks triggered by region context menu use. 2015-09-09 17:19:30 -07:00
Jonathan Moore Liles 40e7b77420 Timeline: Fix logging of region split at playhead. 2015-09-09 17:18:42 -07:00
Jonathan Moore Liles 8fbcb4eb79 Timeline: Ensure that pushed widget gets FL_RELEASE event even when being dragged unto a another track. 2015-09-08 17:28:47 -07:00
Jonathan Moore Liles cf8e553bb4 Timeline/Audio_Region: Ensure the region splits are logged as a group.
Closes #166
2015-09-08 17:27:51 -07:00
Jonathan Moore Liles 18a299cac7 Add track height "Enormous".
Closes #156
2015-04-04 14:53:18 -07:00
Jonathan Moore Liles 8a58591067 Timeline: Don't attempt to join thread that hasn't been created.
Closes: #154
2015-03-23 18:01:39 -07:00
Jonathan Moore Liles 0047df03fe Timeline: Don't die if punch-in frame is before first block of recorded audio. 2015-03-11 23:05:47 -07:00
Jonathan Moore Liles 60059f4005 Timeline: Fix assertion triggered by failure to join a diskthread which self-terminated due to punch-out. 2015-02-15 15:47:55 -08:00
Jonathan Moore Liles ab88b2d3ec nonlib/Thread: Separate running() logic from thread descriptor. 2015-02-14 16:13:48 -08:00
Jonathan Moore Liles 7934a71c70 nonlib/Thread: Don't clear _thread in exit(), because join() will need it later.
Closes: #134
2015-02-14 15:45:12 -08:00
Jonathan Moore Liles e230929a57 NSM Proxy: Detect, log, and display startup errors of proxied process. 2014-09-22 20:44:42 -07:00
Jonathan Moore Liles 6bd899f223 NSM: Fix typo in --help text.
Closes #137
2014-09-18 20:35:40 -07:00
Jonathan Moore Liles 57653d5cdf Timeline: Don't die when undo function is used when no project is open or when there is nothing left to undo. 2014-07-21 22:31:10 -07:00
Jonathan Moore Liles 686d830402 Mixer: Don't segfault when user right-clicks on channel number module.
Closes: #128
2014-06-18 20:55:00 -07:00
Jonathan Moore Liles 9d39699950 Timeline: Add more more keybindings, particularly of performing actions at the location of the playhead. 2014-06-07 16:44:36 -07:00
Jonathan Moore Liles 9790201fd8 Timeline: Fix bug where opening context menu on a region is equivalent to initiating a drag on that region.
Closes #126
2014-06-07 16:43:39 -07:00
Jonathan Moore Liles d881dce874 Timeline: Avoid deadlock in diskthread. 2014-06-07 14:24:24 -07:00
Jonathan Moore Liles 55bbce6d24 Timeline: Move punch logic to record diskthread. Punches are now sample accurate and work better in freewheeling mode. 2014-06-07 14:24:24 -07:00
Jonathan Moore Liles 6f3e96f311 Maybe silence -Wunused-result warnings on arch. 2014-05-29 18:03:27 -07:00
Hanspeter Portner 2d43a8abe7 Use new Jack Metadata API to mark CV ports.
By adding metadata key "http://jackaudio.org/metadata/signal-type" value "CV" pair to CV ports, patch bays can discriminate between audio and CV ports (SVN patchage e.g. can already do so).

Metadata API is only implemented in Jack1 for now, this patch will thus have no effect when linked to Jack1/2 without support for metadata.
2014-05-23 15:39:42 +02:00
Jonathan Moore Liles 467e369cd1 Timeline: Update syntax of impor-ardour-session script to work with python3. 2014-05-04 13:22:32 -07:00
Jonathan Moore Liles 5b0d6e6bd1 Upgrade waf. 2014-04-29 18:03:29 -07:00
Jonathan Moore Liles de7c7ae0b8 Timeline: Add capture formats for W64
Closes #114
2014-03-14 17:41:10 -07:00
Jonathan Moore Liles 5d5b22afd4 Mixer: Avoid operations that would attempt to open the X display when running in noui mode.
Closes #104
2014-02-10 21:32:43 -08:00
Jonathan Moore Liles 13c3ca8eb8 Timeline: Fix error in reference counting of newly recorded clips. 2013-10-25 18:35:30 -07:00
Jonathan Moore Liles d795a484f0 Mixer: Fix redundant operations in strip removal. 2013-10-21 17:30:50 -07:00
Jonathan Moore Liles f6c0e48a50 Mixer: Fix law hint on gain and aux module controls. 2013-10-21 17:30:44 -07:00
Jonathan Moore Liles 1aafc5330f Fix behavior of vertical sliders. 2013-10-12 15:38:45 -07:00
Jonathan Moore Liles 23107541c8 Mixer: Tweak spectrum view appearance. 2013-10-12 14:23:42 -07:00
Jonathan Moore Liles f3fdea50d6 Mixer: Don't leak spectrum view windows. 2013-10-12 14:23:06 -07:00
Jonathan Moore Liles de6c22ac46 Implement logarithmic slider mode. 2013-10-12 12:51:05 -07:00
Jonathan Moore Liles 50a5f66fff Mixer/SpectrumView: Add zero line and more dB levels. Also, remove Hz and Db labels. 2013-10-08 18:40:03 -07:00
Jonathan Moore Liles e6313394cd Timeline: Allow recording in punch mode when playhead is in the middle of a punch cursor. 2013-10-05 21:12:43 -07:00
Jonathan Moore Liles 7770610d32 Timeline: Defer creation of audio file for recording until blocks are ready to be written.
This prevents unnecessary file creation in punch mode.
2013-10-05 20:58:41 -07:00
Jonathan Moore Liles 45a33b8467 Mixer: Tweak spectrum view. 2013-10-05 19:50:37 -07:00
Jonathan Moore Liles 1b3994a5f1 Mixer/Panner: Add 3 meter range setting. 2013-10-04 18:10:30 -07:00
Jonathan Moore Liles 3628f08fbc Mixer: Fix bug with strip copy/paste due to groups. 2013-10-04 18:10:03 -07:00
Jonathan Moore Liles d332da3c39 Mixer: Fix some issues with the new spectrum view. 2013-10-01 18:08:35 -07:00
Jonathan Moore Liles 6673dcd28e Mixer: Implement plugin spectrum view. 2013-09-30 19:10:17 -07:00
Jonathan Moore Liles cf46b447d0 Mixer: Make slider value drag sensitivity the same regardless of range. 2013-09-28 17:10:15 -07:00
Jonathan Moore Liles 8109c20e5c Mixer: Fix direction of value dragging for vertical sliders. 2013-09-28 17:02:17 -07:00
Jonathan Moore Liles 8856216d86 Timeline: Fix normalization of multi-channel regions. 2013-09-26 22:54:06 -07:00
Jonathan Moore Liles 7c71faab1c Mixer: Fix compiler warning. 2013-09-24 21:40:09 -07:00
Jonathan Moore Liles 504b77f6c7 Mixer/Plugin_Chooser: Fix corruption of name display. 2013-09-24 21:39:10 -07:00
Jonathan Moore Liles 200bfe91ca Mixer: Effectively whitelist TAP plugins even though flagged as not RT safe. 2013-09-24 21:38:37 -07:00
Jonathan Moore Liles 83fceb23dc Timeline: Improve behavior of audio region gain adjustment mode. 2013-09-23 23:33:36 -07:00
Jonathan Moore Liles 2e49295320 Timeline: Fix some issues with audio region waveform alignment when drawing. 2013-09-23 23:33:24 -07:00
Jonathan Moore Liles 6bbe69e712 Timeline: Fix error in drawing of region fade outs. 2013-09-21 20:06:48 -07:00
Jonathan Moore Liles 52150723c6 NSM: Tweak GUI appearance. 2013-09-20 23:18:37 -07:00
Jonathan Moore Liles b85ba3c2d9 nonlib/Loggable: Get rid of some line length limitations. 2013-09-20 23:02:02 -07:00
Jonathan Moore Liles 51bce6124e Timeline: Tweak region appearance. 2013-09-20 17:40:20 -07:00
Jonathan Moore Liles 2ea366a409 Timeline: Order region finalization to ensure correct logging. 2013-09-20 17:39:19 -07:00
Jonathan Moore Liles 97573f0299 Mixer: Keep new sliders from swallowing Ctrl+V. 2013-09-19 23:13:34 -07:00
Jonathan Moore Liles 423a8428e1 Mixer: Fix focus issues with new sliders. 2013-09-19 21:28:02 -07:00
Jonathan Moore Liles 5ab7d7c410 Mixer: Fix OSC pathname generation when running without NSM. 2013-09-19 09:23:03 -07:00
Jonathan Moore Liles 55b020f3a0 Update NTK. 2013-09-18 23:29:35 -07:00
Jonathan Moore Liles b7b3d499e5 Mixer: Enable keyboard value input and mouse value dragging on slider controls. 2013-09-18 23:28:58 -07:00
Jonathan Moore Liles 47f15d9937 MIxer/Chain: Fix race condition. 2013-09-18 21:56:31 -07:00
Jonathan Moore Liles 4d20ed0f7b Mixer/Parameter Editor: Tweak appearance. 2013-09-18 17:26:23 -07:00
Jonathan Moore Liles ea0c2839c1 Mixer: Improve display of strip 'control' tab. 2013-09-18 17:10:23 -07:00
Jonathan Moore Liles d97a2ee7ba Mixer/Module_Parameter_Editor: Change default view from knobs to horizontal sliders. Make toggle buttons smaller. 2013-09-15 15:40:27 -07:00
Jonathan Moore Liles f3b73381d7 More latency compensation tweaks. 2013-09-14 19:50:38 -07:00
Jonathan Moore Liles 8675f7d31c Mixer: Fix typo in plugin error message. 2013-09-14 16:47:17 -07:00
Jonathan Moore Liles a9d547e794 Mixer/DPM: Avoid clipping topmost segment when drawing. 2013-09-14 11:17:14 -07:00
Jonathan Moore Liles 6d7a71636a Mixer: Fix issue with meter module eating ctrl+left click event. 2013-09-14 11:17:01 -07:00
Jonathan Moore Liles 9b634cf001 Tweak latency reporting/compensation. 2013-09-14 11:17:01 -07:00
Jonathan Moore Liles 758f7b86b4 Mixer: Include all outputs in autoconnect wildcard group. 2013-09-09 23:12:36 -07:00
Jonathan Moore Liles eb482d3a36 Timeline: Add option for per-track delay-free playback latency compensation. Disabled by default. 2013-09-09 18:46:28 -07:00
Jonathan Moore Liles 795249a612 Mixer: Adjust threshold of boolean control via OSC. 'On' state is triggered at > half of maximum value. 2013-09-09 17:28:31 -07:00
Jonathan Moore Liles cc7f6a93ab Mixer/midi-mapper: Fix range error in translation affecting toggle controls. 2013-09-09 17:26:53 -07:00
Jonathan Moore Liles a102d76912 Panner: Use appropriate backdrop when switching projections. 2013-09-09 17:25:34 -07:00
Jonathan Moore Liles 7f5e9f1e9b Mixer: Tweak appearance of group DSP meters. 2013-09-08 20:52:09 -07:00
Jonathan Moore Liles 19b19edf0e Mixer: Make panner widget scalable again. 2013-09-08 20:00:40 -07:00
Jonathan Moore Liles 17e7ad0ad6 Mixer: Add global command to swap signal and fader views, move signal/fader button to free up vertical space in layout. 2013-09-08 19:22:58 -07:00
Jonathan Moore Liles 3fad04c2d5 Mixer: Tweak appearance. 2013-09-08 13:59:52 -07:00
Jonathan Moore Liles 00ed29d6c2 Tweak DSP optimization. 2013-09-08 13:56:03 -07:00
Jonathan Moore Liles fc5c59c61d Mixer: Implement port autoconnection system. 2013-09-07 18:34:12 -07:00
Jonathan Moore Liles a05384a8c3 Mixer: Change the appearance/layout of slider modes in parameter editor. Also, add scroll widget. 2013-09-07 16:58:16 -07:00
Jonathan Moore Liles 7da3bb325f Add fancy new focus frame. 2013-09-06 23:42:21 -07:00
Jonathan Moore Liles 933bfe882a Mixer: Work around some quirks in hints of some plugins. 2013-09-06 23:08:46 -07:00
Jonathan Moore Liles 963d926659 Timeline: Fix diskstream flushing/shutdown. 2013-09-06 19:12:40 -07:00
Jonathan Moore Liles 3ca72b4ac6 Timeline: Change keybinding for track height adjustment. 2013-09-06 00:46:48 -07:00
Jonathan Moore Liles 58fdf7d914 Timeline: Fix numerous issues with diskstream. 2013-09-06 00:15:43 -07:00
Jonathan Moore Liles 9fba8a8577 Mixer: Make spatializer view options song global. 2013-09-02 12:11:10 -07:00
Jonathan Moore Liles cf5c557c2f Mixer: Don't lose panner settings when toggling Spatializer Advanced Options. 2013-09-02 11:35:32 -07:00
Jonathan Moore Liles b3a9d0be1d Mixer/Spatializer_Module:
Remove distance related frequency effects.
Add control to disable delay effects.
Add angle control with frequency and reflection effects.
Add advanced options for controlling early and late reverb send amounts.
2013-09-01 21:37:28 -07:00
Jonathan Moore Liles e927781ee0 Mixer: Add mute control to Gain module and Mute button to each mixer strip. 2013-09-01 21:35:35 -07:00
Jonathan Moore Liles 2cca17376a Mixer/Module: Clean up some focus issues, add tooltip, and focus keybinding. 2013-09-01 20:13:44 -07:00
Jonathan Moore Liles bf232b3928 Mixer/Spatialization_Console: If screen isn't large enough, use smaller window. 2013-09-01 18:57:28 -07:00
Jonathan Moore Liles 6f42e2b816 Mixer: Change default spatializer range from 10 to 5 meters. 2013-09-01 18:57:23 -07:00
Jonathan Moore Liles c662ff4332 Timeline: Lower opacity of cursor overlays. 2013-08-30 22:24:06 -07:00
Jonathan Moore Liles 1d9bd576f6 Sequencer: Fix uninitialized value. 2013-08-30 18:10:49 -07:00
Jonathan Moore Liles db2b1e0952 Mixer/Spatializer: Change default value of highpass to 0hz (bypassed) 2013-08-28 23:51:25 -07:00
Jonathan Moore Liles 89f62c13a4 Fix conditional compilation typo. 2013-08-27 23:02:52 -07:00
Jonathan Moore Liles f8f6bad322 Mixer: Fix copy and paste of spatializer module. 2013-08-27 23:02:36 -07:00
Jonathan Moore Liles 442003e61f Mixer: Further tweak plugin name abbreviation. 2013-08-26 23:05:27 -07:00
Jonathan Moore Liles a1336880b5 Timeline: Fix 'Vary Color' region drawing mode. Also, tweak appearance. 2013-08-26 21:43:20 -07:00
Jonathan Moore Liles 4bf4a1ef14 Timeline: Always wait for diskstreams when freewheeling. 2013-08-25 21:45:40 -07:00
Jonathan Moore Liles 55f54085c5 OSC: Escape pattern matching characters in signal names. 2013-08-25 19:12:53 -07:00
Jonathan Moore Liles 96a6709fe8 Update latency compensation code for new JACK latency API. 2013-08-25 13:24:33 -07:00
Jonathan Moore Liles 40352db651 Mixer: Fix aux module broken by group changes. 2013-08-24 17:45:42 -07:00
Jonathan Moore Liles d5741f9999 Clean up some compiler warnings. 2013-08-23 20:41:17 -07:00
Jonathan Moore Liles 2545510006 Mixer/Plugin_Module: Fix detection of INTEGER hint when default 1 hint is specified. 2013-08-23 17:05:27 -07:00
Jonathan Moore Liles 865a14b74b Mixer: Fix saving of JACK inputs setting as adjusted from buttons on JACK module. 2013-08-23 17:05:27 -07:00
Jonathan Moore Liles 4c5551ad8e Mixer: Fix opening project by relative pathname on commandline. 2013-08-23 17:05:23 -07:00
Jonathan Moore Liles 4bda8db1fd Mixer: Improve module name abbreviation. 2013-08-23 17:04:25 -07:00
Jonathan Moore Liles 839ed187d6 Mixer/Plugin_Module: Avoid unnecessary plugin reactivation. 2013-08-22 18:37:04 -07:00
Jonathan Moore Liles 8fe598eff4 Timeline: Fixes for flac and ogg/vorbis playback and recording. Add new Ogg capture formats at various quality levels. 2013-08-22 18:37:04 -07:00
Jonathan Moore Liles 2afec38a54 Timeline: Read interleaved blocks of samples from libsndfile, rather than processing one channel at a time. 2013-08-22 18:36:59 -07:00
Jonathan Moore Liles ff41fb9f81 wscript: Test for __builtin_assume_aligned which is new in GCC 4.7. 2013-08-16 17:34:04 -07:00
Jonathan Moore Liles ca7d95a92d Mixer: Update documentation 2013-08-15 21:46:19 -07:00
Jonathan Moore Liles f68232ab5c Sequencer: Cover up bug in gcc-4.8. 2013-08-14 18:10:42 -07:00
Jonathan Moore Liles 03fcf31311 Sequencer: GUI tweaks. Get rid of randomize row feature. 2013-08-14 18:08:46 -07:00
Jonathan Moore Liles 04c8e908e8 Sequencer: Implement simple undo. 2013-08-14 18:05:52 -07:00
Jonathan Moore Liles 451e948a17 Sequencer: GUI tweaks. 2013-08-14 18:05:43 -07:00
Jonathan Moore Liles 8055e08e9e Sequencer: Fix instrument path. 2013-08-14 18:03:28 -07:00
Jonathan Moore Liles a797093a58 Sequencer: Fix initial canvas display. 2013-08-14 18:03:28 -07:00
Jonathan Moore Liles 6e776faf24 Sequencer: Cleanup prototypes. 2013-08-14 18:03:28 -07:00
Jonathan Moore Liles b8184ac910 Sequencer: Fix pattern insertion trigger length on phrase. 2013-08-14 18:03:28 -07:00
Jonathan Moore Liles a30d065cb7 Sequencer: Tweak canvas drawing. 2013-08-14 18:03:28 -07:00
Jonathan Moore Liles 8001b1b2c1 Sequencer: Fix edit menu for phrase mode. 2013-08-14 18:03:28 -07:00
Jonathan Moore Liles 8101abafeb Work around another retarded bug in binutils-gold. 2013-08-14 18:03:28 -07:00
Jonathan Moore Liles a872d99e9b Sequencer: More simplification of pattern drawing. 2013-08-14 18:03:28 -07:00
Jonathan Moore Liles cec17e7990 Sequencer: Remove canvas optimizations in favor of simpler drawing. 2013-08-14 18:02:11 -07:00
Jonathan Moore Liles 09fe968264 Sequencer: Clean up event editor display/scrolling behavior. 2013-08-14 18:02:11 -07:00
Jonathan Moore Liles 68655cc599 Sequencer: Replace pattern number spinner with value slider. 2013-08-14 18:02:11 -07:00
Jonathan Moore Liles 46d2324446 Timeline/Fade: minor cleanup. 2013-08-14 17:55:14 -07:00
Jonathan Moore Liles e578deb112 Timeline: Avoid unaligned access. 2013-08-14 17:54:38 -07:00
Jonathan Moore Liles 1cb9f68cf1 Mixer: Limit rate of DSP meter updates. 2013-08-14 17:11:35 -07:00
Jonathan Moore Liles 19487a72e4 Tweak buffer ops for GCC auto vectorization. 2013-08-13 22:50:30 -07:00
Jonathan Moore Liles 9b8f02fbf3 NSM/NSM Proxy: Add two new options. Stop Signal and Config File. 2013-08-13 22:50:30 -07:00
Jonathan Moore Liles 21ab68d3e5 NSM/JackPatch: Replace mutex in callback handling with ringbuffer (may help with JACK1 which runs the callbacks in the RT thread). 2013-08-13 22:50:30 -07:00
Jonathan Moore Liles d1c4fe418b Midi-Mapper: Close gracefully on sigterm. 2013-08-13 22:50:30 -07:00
Jonathan Moore Liles b0fc87ec86 Mixer: Fix group membership of new strips. 2013-08-13 22:50:19 -07:00
Jonathan Moore Liles fab76b1c4f Set FTZ and DAZ flags by default for all JACK client threads. 2013-08-09 17:41:11 -07:00
Jonathan Moore Liles dd21a18c81 Mixer: Add group DSP meters. 2013-08-08 23:32:44 -07:00
Jonathan Moore Liles 5ccc6e7595 Mixer: Implement basic groups. 2013-08-08 12:57:26 -07:00
Jonathan Moore Liles d2b2c0808d Timeline: Fix double free in project open
Closes #71
2013-08-01 09:14:33 -07:00
Jonathan Moore Liles e6d153c13c Sequencer: Work around internal compiler error bug in GCC 4.8. 2013-07-31 21:26:06 -07:00
Jonathan Moore Liles 9837a8f3f7 Timeline: Fix typo. 2013-07-31 21:25:42 -07:00
Jonathan Moore Liles 0da98f95b8 Fix some memory leaks and other valgrind warnings. 2013-07-30 21:36:35 -07:00
Jonathan Moore Liles a3f1265ef3 Timeline: Reduce window minimum height. 2013-07-23 22:52:15 -07:00
Jonathan Moore Liles 612fdfe952 Mixer: Save/restore state of spatialization console. 2013-07-21 20:20:42 -07:00
Jonathan Moore Liles 0d42bf3483 wscript: tweak optimization options. 2013-07-20 17:41:53 -07:00
Jonathan Moore Liles 50d5411411 Mixer/Spatializer: Fade delay into non-interpolating mode when source is stationary. 2013-07-20 16:29:09 -07:00
Jonathan Moore Liles 2da6c503aa NSM/jackpatch: Sort connections before saving. 2013-07-19 18:13:50 -07:00
Jonathan Moore Liles 8d330997d1 Mixer/midi mapper: Use proper NSM client ID. 2013-07-18 00:26:48 -07:00
Jonathan Moore Liles 932a78c747 Mixer: Fix jack client rename on strip rename. 2013-07-18 00:26:42 -07:00
Jonathan Moore Liles e95fd10775 Mixer: Fix panner control connection to old ambisonics LADSPA plugins. 2013-07-17 19:13:33 -07:00
Jonathan Moore Liles be025b00b9 Mixer: Add cross hairs to panner plane backdrop. 2013-07-17 19:12:43 -07:00
Jonathan Moore Liles b31eef9c36 Mixer/DPM: Fix reposition interfering with optimized drawing. 2013-07-16 20:58:43 -07:00
Jonathan Moore Liles 123d45c1ae Update NTK. 2013-07-16 20:58:43 -07:00
Jonathan Moore Liles e88c255d45 Mixer: Fix initial size. 2013-07-16 20:58:42 -07:00
Jonathan Moore Liles 70856a6e8e OSC Signal cleanups. 2013-07-16 20:58:42 -07:00
Jonathan Moore Liles cfd451c4d6 Mixer: Implement Spatializer module. 2013-07-16 20:58:36 -07:00
Jonathan Moore Liles a59dad4204 nonlib: Fix bugs in JACK::Port. 2013-07-16 16:21:13 -07:00
Jonathan Moore Liles fd1207b75e Mixer: Clip children when drawing modules. 2013-07-16 16:21:13 -07:00
Jonathan Moore Liles a958276b06 Timeline: Mark ports as Terminal. 2013-07-16 16:21:13 -07:00
Jonathan Moore Liles 1a9741cb7f Mixer: Remove dead signal feedback code. 2013-07-16 16:21:13 -07:00
Jonathan Moore Liles 6d2aeaf405 Mixer: Implement Spatialization Console. 2013-07-16 16:21:13 -07:00
Jonathan Moore Liles aedbca82be Mixer: Avoid unecessary redraws (hidden widgets, when mixer strips are added). Also, draw fonts of inactive widgets in dimmed color. 2013-07-16 16:21:13 -07:00
Jonathan Moore Liles fd64b39fa4 Mixer: Tweaks to by-number learning. 2013-07-16 16:21:13 -07:00
Jonathan Moore Liles 0c6a3ea0f8 Mixer: Improve appearance of panner/spatialization widget with pixmap background. 2013-07-16 16:21:13 -07:00
Jonathan Moore Liles a3a8247b83 Mixer: Add connection/disconnection submenu to controller module context menu. 2013-07-16 16:21:12 -07:00
Jonathan Moore Liles 07161196bd Mixer: Use a four color gradient for meters. 2013-07-16 16:21:12 -07:00
Jonathan Moore Liles 6adf6a9389 OSC: Simplify OSC signal protocol. Add midi<->osc gateway program. 2013-07-16 16:21:08 -07:00
Jonathan Moore Liles 37d5dd87b9 Mixer: Implement two way mapping for OSC learning. 2013-07-14 18:06:01 -07:00
Jonathan Moore Liles d7d711807d FL/Fl_Scalepack: Fix resize bug. 2013-07-14 18:05:54 -07:00
Jonathan Moore Liles fad4f7938c NSM: Don't wait on clients that have died while executing a command. 2013-07-14 18:05:29 -07:00
Jonathan Moore Liles d9ba4bda2b Timeline/Control_Point: Don't draw with zero width. 2013-07-13 13:58:26 -07:00
Jonathan Moore Liles bc78302220 Mixer: Avoid unecessary redraws (hidden widgets, when mixer strips are added). Also, draw fonts of inactive widgets in dimmed color.
Conflicts:
	mixer/src/Mixer.C
2013-06-24 17:21:23 -07:00
Jonathan Moore Liles 3b8991c54c NSM_Proxy: save options upon 'start'. 2013-06-23 20:46:09 -07:00
Jonathan Moore Liles 582621edd2 Mixer: Fixes for consolidated timeout. 2013-06-17 19:54:39 -07:00
Jonathan Moore Liles bbffb98981 Mixer: Consolidate all GUI update timeouts into one to avoid unnecessary X events. 2013-06-17 19:26:04 -07:00
Jonathan Moore Liles 72a1e2a5cf Mixer: Implement de-zippering for controls of all built-in modules. 2013-06-15 17:51:50 -07:00
Jonathan Moore Liles 3e932c9930 OSC: Rename OSC method when signal is renamed. 2013-06-03 21:57:11 -07:00
Jonathan Moore Liles 02bb329551 Mixer: Fix connection DND. 2013-05-29 19:40:33 -07:00
Jonathan Moore Liles 54b8dfefb7 Mixer: Allow copy/paste of mixer strips (even between instances). 2013-05-29 18:27:43 -07:00
Jonathan Moore Liles fadeea8a33 Timeline: remove extra fl_pop_clip(). 2013-05-29 18:25:44 -07:00
Jonathan Moore Liles 550fb651c7 Mixer: Improve knob and slider appearance. 2013-05-28 22:11:07 -07:00
Jonathan Moore Liles 6adba68975 Timeline: Fix overlay drawing. 2013-05-28 21:03:59 -07:00
Jonathan Moore Liles b664d0ed04 Timeline: Allow drag and drop moving of tracks. 2013-05-22 23:50:10 -07:00
Jonathan Moore Liles 0552a9a7cf Mixer: Allow drag and drop for moving mixer strips. 2013-05-22 22:45:55 -07:00
Jonathan Moore Liles 960dc543c3 Mixer: Clean up connection DND behavior. 2013-05-22 20:11:41 -07:00
Jonathan Moore Liles 70e23f1994 Timeline: Draw punch/playback/edit cursors in the overlay plane. 2013-05-19 18:24:59 -07:00
Jonathan Moore Liles dafaebb0de NSM: Add quit button/keybinding. 2013-05-14 21:34:27 -07:00
Jonathan Moore Liles 4dcc011ca1 NSM: Write server unresponsiveness to status log instead of popping up an alert window. 2013-05-14 21:03:42 -07:00
Jonathan Moore Liles d0c4be1ff9 NSM: Add timestamp to status log. 2013-05-14 20:58:10 -07:00
Jonathan Moore Liles 5e958416cd Mixer: Save settings for 'Rows' with project.
Closes #48.
2013-05-13 18:02:01 -07:00
Jonathan Moore Liles d4f96fe762 Mixer: Allow creation of mix before creation of project.
Closes #10.
2013-05-13 17:21:57 -07:00
Jonathan Moore Liles 89f2633463 FL/New_Project_Dialog: Don't crash if aborted. 2013-05-13 17:21:50 -07:00
Jonathan Moore Liles d4c15e6fa7 wscript: Fix for Python3. 2013-05-07 18:51:47 -07:00
Jonathan Moore Liles f2bc2b5c9b NTK: Don't keep unneeded clients in session when switching. 2013-05-05 10:30:08 -07:00
Jonathan Moore Liles 8b5f5a76aa NSM: Command all unneeded 'switch' capable clients to exit when switching sessions.
Closes #60.
2013-05-02 23:05:58 -07:00
Jonathan Moore Liles 1c6add6c2b NSM/jackpatch: Rebuild patch network upon NSM save. 2013-05-02 22:18:44 -07:00
Jonathan Moore Liles 3084956664 Mixer: Don't process (dis)connection notifications from JACK while destroying chain. 2013-05-02 20:02:17 -07:00
Jonathan Moore Liles 973089890c Mixer: Clean up some issues with display of JACK connection lists. 2013-05-02 17:07:35 -07:00
Jonathan Moore Liles 899740c2f1 Timeline: Add freewheel button. 2013-05-01 22:04:16 -07:00
Jonathan Moore Liles c351700be0 Timeline: Fix peak display while recording. 2013-05-01 22:00:05 -07:00
Jonathan Moore Liles 1fc7c2eed2 Timeline: Tweak crossfade appearance. 2013-05-01 22:00:05 -07:00
Jonathan Moore Liles 97677c561e Timeline: Don't allow import attempt when no project is loaded. 2013-04-30 22:44:16 -07:00
Jonathan Moore Liles 875ef17575 TImeline: Add GUI for Ardour session import and corresponding menu entry. 2013-04-30 22:38:49 -07:00
Jonathan Moore Liles bf50334890 Timeline: Ardour input script now merges sources for multi-channel tracks instead of creating multiple mono tracks. 2013-04-30 17:26:57 -07:00
Jonathan Moore Liles 2f730acefb Timeline: Update ardour session importer to work with ardour3 sessions. 2013-04-30 12:58:13 -07:00
Jonathan Moore Liles a162876025 Timeline: Make ardour session importer work with ardour1 files. Also, don't fail if sample-rate is not specified. 2013-04-30 10:39:57 -07:00
Jonathan Moore Liles c839d690ab Timeline: Add script to convert Ardour session to Non-Timeline format. 2013-04-29 23:40:36 -07:00
Jonathan Moore Liles ea9d7b2420 Mixer: Fix resize issues with JACK module connection display list. 2013-04-29 23:39:38 -07:00
Roy Vegard Ovesen ec8bfcba63 Make sure that every highest peak value is drawn
As process is usually called more often than
update_cb, we should store the highest peak
value until it is consumed by update_cb.
2013-04-27 16:54:39 +02:00
Jonathan Moore Liles e6e101fc67 Tweak colors. 2013-04-26 21:25:00 -07:00
Jonathan Moore Liles 1945477b10 NSM: Specify window class for NSM-Proxy GUI. 2013-04-25 16:28:40 -07:00
Jonathan Moore Liles 45cf2f7135 Timeline: Fix control sequence highlighting. 2013-04-23 20:21:23 -07:00
Jonathan Moore Liles 5af9afdd8d Mixer: Fix some button handling. 2013-04-22 21:54:45 -07:00
Jonathan Moore Liles 455c93683c Implement drag and drop for making/breaking JACK connections in Non Mixer and Non Timeline.
(Drag jack output module and drop on jack input module of another strip)

In Non Mixer, all JACK modules (including Aux) will now list their connections.
2013-04-21 23:14:52 -07:00
Jonathan Moore Liles 52f016abed Timeline: Fix offset of drag and drop file imports. 2013-04-21 22:59:46 -07:00
Jonathan Moore Liles dcec3282a9 Mixer: Increase font size for fader value. 2013-04-21 22:56:39 -07:00
Jonathan Moore Liles 00a78fdb27 Mixer: Set a default upper bound on module parameters of 1 in case the module (LADSPA Plugins in particular) doesn't specify one. 2013-04-21 19:59:47 -07:00
Jonathan Moore Liles ea380f00f9 FL/Fl_Packscroller: Cleanup event behavior. Eliminate unnecessary vertical padding. 2013-04-21 19:01:47 -07:00
Jonathan Moore Liles 5d59a1d291 NSM: Redraw session list after refresh even if it's empty. 2013-04-19 21:14:31 -07:00
Jonathan Moore Liles 5ea31d47d7 NSM: Fix compiler warning. 2013-04-19 21:13:42 -07:00
Jonathan Moore Liles fc5ef8f9f9 Mixer: Add new module "Aux" to allow creation of "send" topology without requiring an extra strip to control the send gain. 2013-04-16 22:48:41 -07:00
Jonathan Moore Liles 7900ef6add Mixer: Fix segfault on attempt to make osc ports for module ports which shouldn't be controllable. 2013-04-16 22:48:41 -07:00
Jonathan Moore Liles eff5189638 Mixer: Add 'visible' property to port hints. 2013-04-16 22:48:38 -07:00
Roy Vegard Ovesen cbba71a0c8 Fix navigation when located left of 60 sec. 2013-04-15 21:46:13 -07:00
Jonathan Moore Liles 3f3f98b4ca NSM: Make log display one-line high by default.
Closes #51
2013-04-15 17:08:21 -07:00
Jonathan Moore Liles a3c1e806a9 NSM: Disallow adding clients by path name. 2013-04-15 17:06:34 -07:00
Jonathan Moore Liles 92932fb1b0 Mixer/Plugin chooser: Add shortcuts for all and favorites views. 2013-04-14 18:56:41 -07:00
Jonathan Moore Liles 90551b732d Mixer: When listing plugins, properly display mono compatibe plugins. 2013-04-14 18:46:59 -07:00
Jonathan Moore Liles b3830057cb Mixer: Don't list plugins which are unsuitable for RT use. 2013-04-14 18:46:06 -07:00
Jonathan Moore Liles f5eaf5bc2d Mixer: Don't die when spatialization plugin is removed. 2013-04-14 18:45:48 -07:00
Jonathan Moore Liles b4d811adf1 Mixer: Don't hang when terminated while modal window is open. 2013-04-14 15:10:57 -07:00
Jonathan Moore Liles 851be29d6a Mixer/Plugin_Chooser: Add a little padding in table cells. 2013-04-14 14:23:09 -07:00
Jonathan Moore Liles 171975b26b Mixer: Allow searching by category in plugin chooser. 2013-04-14 14:19:07 -07:00
Jonathan Moore Liles 07e40513c6 Minor cleanup. 2013-04-13 21:41:39 -07:00
Jonathan Moore Liles ae633840fb NSM: Add status message log display to GUI. 2013-04-13 21:07:06 -07:00
Jonathan Moore Liles 4ef20c0f71 NSM: Give clients a 5 second period in which to announce themselves--otherwise assume they are dumb clients. 2013-04-13 20:17:18 -07:00
Jonathan Moore Liles 5adba898ef Mixer: Tweak plugin chooser appearance. 2013-04-13 13:37:30 -07:00
Jonathan Moore Liles dd9eb35ab2 Implement plugin browser, with search and favorites. 2013-04-13 13:18:03 -07:00
Jonathan Moore Liles 5d35f37d4e Fix window icons. 2013-04-11 21:02:31 -07:00
Jonathan Moore Liles 6ec8f6e85e NSM/nsm-proxy: unset NSM_URL env var before launching child. 2013-04-11 18:01:29 -07:00
Jonathan Moore Liles 9501e52d54 Timeline: Don't die if user selects nonsense item from Control Sequence Connect To menu. 2013-04-11 17:44:34 -07:00
Jonathan Moore Liles ec09f027d6 FL: Fix layout error in flowpack. 2013-04-11 17:44:26 -07:00
Jonathan Moore Liles 29479f73c4 Mixer: Ensure that meters are drawn correctly before the first resize. 2013-04-10 22:40:58 -07:00
Jonathan Moore Liles cbf7df0e0d Mixer: Clean up strip layout. 2013-04-10 19:23:35 -07:00
Jonathan Moore Liles b531769184 Mixer: Move inputs control. 2013-04-10 19:16:59 -07:00
Jonathan Moore Liles ffcf1454d5 jackpatch: Avoid race condition for ports registered after start but before open. 2013-04-10 17:23:29 -07:00
Jonathan Moore Liles e69a124e27 jackpatch: Don't make unnecessary connection attempts on response to 'open'. 2013-04-10 17:23:20 -07:00
Jonathan Moore Liles 8f89e237e9 FL: Fix error in flowpack layout. 2013-04-10 17:22:51 -07:00
Jonathan Moore Liles e386d963aa Mixer: Tweak strip appearance. 2013-04-10 17:22:33 -07:00
Jonathan Moore Liles f879b9eab5 Mixer: Provide project load progress to NSM. 2013-04-09 17:51:47 -07:00
Jonathan Moore Liles bb26718834 NSM: Wait up to 60 seconds for all clients to close. 2013-04-09 17:50:56 -07:00
Jonathan Moore Liles 4d3e4ca4f1 jackpatch: Don't attempt to make JACK connection when one of the ports doesn't exist yet. 2013-04-09 16:58:41 -07:00
Jonathan Moore Liles ee09187089 Change debug CFLAGS. 2013-04-08 21:03:33 -07:00
Jonathan Moore Liles 0c4161ce85 nonlib: Use GNU extension program_invocation_short_name to get module name for debug output. 2013-04-08 21:03:33 -07:00
Jonathan Moore Liles c794617b30 Mixer: Silence valgrind warning. 2013-04-08 21:03:33 -07:00
Jonathan Moore Liles 9df0e9d665 nonlib: Clean up signals handshaking. 2013-04-08 21:03:29 -07:00
Jonathan Moore Liles d7cf8955b8 NSM: Add clarification to the API document. 2013-04-06 13:02:29 -07:00
Jonathan Moore Liles 5c6e9f8d37 NSM: Don't return false error message from duplicate function.
Closes #34
2013-04-05 19:48:59 -07:00
Jonathan Moore Liles 4103cd016b NSM: Clean up session selection behavior. 2013-04-05 19:06:50 -07:00
Jonathan Moore Liles 271eb2d331 NSM: Clean up GUI resize behavior.
Closes #47.
2013-04-05 18:36:31 -07:00
Jonathan Moore Liles 9230ab3d04 Timeline: Fix potential deadlock when stopping recording. 2013-04-05 17:13:51 -07:00
Jonathan Moore Liles 14b8507fcb NSM: Don't wait for replies from dumb clients! 2013-04-04 20:01:48 -07:00
Jonathan Moore Liles 299193dc60 NSM: Further clarify nsmd debugging output regarding client death. 2013-04-04 20:01:19 -07:00
Jonathan Moore Liles 7bbc97983b NSM: Show client icons in nsm GUI. 2013-04-03 22:06:58 -07:00
Jonathan Moore Liles acb38aca99 NSM: Clarify client X died message. 2013-04-03 19:38:54 -07:00
Jonathan Moore Liles 2c646deebf NSM: Oops. Add "optional-gui" server capability. 2013-04-03 19:36:48 -07:00
Roy Vegard Ovesen daf240d83e Add keyboard shortcut to refresh button 2013-04-01 11:57:33 +02:00
Roy Vegard Ovesen 31f05a7aac A button to refresh the sessions list 2013-04-01 11:49:03 +02:00
Jonathan Moore Liles 31c14150e7 NSM: Fix occasional deadlock of session manager GUI when displaying "Command failed with..." message.
Closes #44.
2013-03-31 16:47:27 -07:00
Jonathan Moore Liles a6a15e2a2d Timeline: Fix backwards navigation by bar and beat.
Simplification of a patch submitted by Roy Vegard Ovesen. Closes #43.
2013-03-30 18:48:41 -07:00
Jonathan Moore Liles 37b881b638 NSM: Add unknown message handler. 2013-03-28 17:19:38 -07:00
Jonathan Moore Liles 815a16f96f Sequencer: Allow saving while transport is running. Closes #40. 2013-03-24 11:49:56 -07:00
Jonathan Moore Liles f137629b93 NSM: Reactivate GUI if server becomes available again. 2013-03-24 01:23:03 -07:00
Jonathan Moore Liles 6a8a2d6e38 NSM: Tweak GUI appearance. Move 'Add client' button to avoid confusion. Closes #33. 2013-03-24 01:22:45 -07:00
Jonathan Moore Liles 92716b103d Mixer: Only display spatialization control when strip is in Fader view. Closes #36. 2013-03-19 18:37:00 -07:00
Jonathan Moore Liles ceb04569e9 FL/Fl_Flowpack: Include Fl_Pack header for value of Fl_Pack::HORIZONTAL. 2013-03-18 22:58:12 -07:00
Jonathan Moore Liles 1aa102a8e4 Update COPYING. 2013-03-18 22:57:52 -07:00
Jonathan Moore Liles 3939576b05 Fl_Flowpack: Fix flowdown alignment. 2013-03-18 22:33:36 -07:00
Jonathan Moore Liles b1586811f9 Fl_Flowpack: Set width appropriately in non-flow mode. Fixes #17. 2013-03-18 22:28:01 -07:00
Jonathan Moore Liles 7d5a0e13f6 nonlib: Use tmp file when generating snapshot. 2013-03-18 17:21:37 -07:00
Jonathan Moore Liles 14099b7cfc nonlib: Add assertions to catch multiple calls to log_create() which would result in duplicate log entries. 2013-03-18 17:21:29 -07:00
Jonathan Moore Liles 0f6d481f88 FL/Fl_Sometimes_Input: Run callback on defocus (including Tab key press). 2013-03-18 17:20:54 -07:00
Jonathan Moore Liles b855493014 Mixer: disable context menu on fader view meter indicators. 2013-03-18 17:20:46 -07:00
Jonathan Moore Liles d2668943e5 NSM: Tweak gui appearance. 2013-03-17 18:01:58 -07:00
Jonathan Moore Liles 7a5425beca Timeline: Fix insertion of control points and copying of all sequence widgets. 2013-03-17 07:05:11 -07:00
Jonathan Moore Liles f0757a09c8 Update NTK. 2013-03-16 21:18:13 -07:00
Jonathan Moore Liles 84e381529e Update NTK. 2013-03-15 18:11:23 -07:00
Jonathan Moore Liles c59554c774 Mixer: Reduce module spacing. 2013-03-15 17:54:49 -07:00
Jonathan Moore Liles e8892926fd Mixer/Chain: Don't block RT thread when printing debugging messages. 2013-03-15 17:54:49 -07:00
Jonathan Moore Liles 0e467993a2 Mixer: Tweak module appearance. 2013-03-15 17:54:49 -07:00
Jonathan Moore Liles d86cda8977 Mixer: Don't die if a plugin specified in the project can't be loaded. Requires storing plugin I/O config in project file. 2013-03-15 17:54:49 -07:00
Jonathan Moore Liles 42072343d3 Mixer: Fix persistence of bypass setting for LADSPA plugins. 2013-03-15 17:54:37 -07:00
Jonathan Moore Liles b1eb988257 Mixer: Refuse to bypass modules whose channel configuration makes bypassing illogical. 2013-03-15 00:05:23 -07:00
Jonathan Moore Liles f29a132dfc Get rid of FL/FL symlink. 2013-03-14 17:32:15 -07:00
Jonathan Moore Liles 63c4f68b3b Mixer: Fix plugin bypass and plugin insertion broken by 8b9ef85. 2013-03-14 17:31:46 -07:00
Jonathan Moore Liles 70e0db1c47 Mixer: change active/inactive coloring of modules to make deactivation more visible. 2013-03-14 17:30:50 -07:00
Jonathan Moore Liles a99f707bda Timeline: Fix bug causing occasional duplicate 'create' entries in snapshots. 2013-03-13 18:02:49 -07:00
Jonathan Moore Liles 8b9ef85c80 Mixer: Fix bypass for 1 IN 2 out modules. 2013-03-13 18:02:45 -07:00
Jonathan Moore Liles 0e66baaf21 Timeline: stabilize track order in snapshot output. 2013-03-13 18:02:35 -07:00
Jonathan Moore Liles eb639c9bfd Update NTK. 2013-03-12 17:58:28 -07:00
Jonathan Moore Liles 04d8bd6a8d Timeline: Fix sign warnings in grid snapping code. 2013-03-12 17:56:55 -07:00
Jonathan Moore Liles 252b105e67 Timeline: Fix sign error allowing the beginning of mutliple region selection to be dragged to a position earlier than frame 0. 2013-03-12 17:56:55 -07:00
Jonathan Moore Liles a25ea63389 Timeline: Report name as non-daw when invoked as such, as non-timeline otherwise. 2013-03-12 17:56:55 -07:00
Jonathan Moore Liles 801d1b20fb Timeline: Fix desktop file. 2013-03-12 17:56:55 -07:00
Jonathan Moore Liles 525470392a Timeline: Don't attempt to build peaks for dummy sources. 2013-03-12 17:56:50 -07:00
Jonathan Moore Liles 551ace4547 Fl_Blink_Button: Don't add a new timer if one already exists. 2013-03-12 17:56:43 -07:00
Jonathan Moore Liles b075c82dbd Update NTK. 2013-03-11 00:19:18 -07:00
Jonathan Moore Liles 8e5ccd9093 New icons! 2013-03-10 23:11:43 -07:00
Jonathan Moore Liles 626f79f8c9 Rename Non-DAW to Non-Timeline. Also, update copyright dates. 2013-03-10 17:52:40 -07:00
Jonathan Moore Liles 47874addb5 Mixer/wscript: Check for presence of ladspa.h. 2013-03-09 20:41:55 -08:00
Jonathan Moore Liles 8d282617e6 Timeline: More locking fixes. Also, build peaks cache levels in threads launched by UI thread, instead of in the record diskthreads. 2013-03-01 17:07:30 -08:00
Jonathan Moore Liles 88b552ea00 Fix typo in README.build. 2013-03-01 17:05:32 -08:00
Jonathan Moore Liles 25f2a55ce0 Timeline: Change style of master record button. 2013-03-01 17:04:36 -08:00
Jonathan Moore Liles ea33310f33 Timeline: Fix button responsiveness on control sequence headers. 2013-02-25 17:53:09 -08:00
Jonathan Moore Liles c7787c8ad6 Timeline: Don't add cursor regions to sequence before setting their start and length. 2013-02-24 19:52:17 -08:00
Jonathan Moore Liles b83c70175d Remove some unnecessary NTK calls. 2013-02-22 17:25:22 -08:00
Jonathan Moore Liles 98c5c196d4 Timeline: Rework locking. 2013-02-22 17:18:52 -08:00
Jonathan Moore Liles a228920ac1 Fl_Flowpack: Fix mixer usage. 2013-02-21 18:19:44 -08:00
Jonathan Moore Liles e4d08afc68 Timeline: Cancel unresponsive disk_threads. 2013-02-18 23:00:48 -08:00
Jonathan Moore Liles 51379e2e51 Timeline: Tweak clock display. 2013-02-18 22:48:00 -08:00
Jonathan Moore Liles e4d0945bf9 wscript: Use gccdeps module. 2013-02-18 22:47:41 -08:00
Jonathan Moore Liles f41cf07188 Timeline: Add 'loop' and 'new take' buttons to transport group so that these settings are more obvious to the user. 2013-02-12 16:50:19 -08:00
Jonathan Moore Liles 85e225810f Fl_Flowpack: Improve layout. 2013-02-12 16:49:35 -08:00
Jonathan Moore Liles 4f4698a12c Nonlib: Add (some) support for opening sessions readonly. 2013-02-09 18:19:40 -08:00
Jonathan Moore Liles 3756dea1d6 Timeline: Lock ordering fixes. 2013-02-09 18:19:07 -08:00
Jonathan Moore Liles 0c5a46422a nsmd: Permit trailing slash in session root. 2013-02-07 20:45:19 -08:00
Jonathan Moore Liles 5fc5ce0cc0 Update ntk. 2013-02-04 22:41:34 -08:00
Jonathan Moore Liles c2bf264120 FL: Remove now unnecessary override of mousewheel behavior in Fl_Value_SliderX 2013-02-04 22:18:18 -08:00
Jonathan Moore Liles 94d55bd4e1 Timeline: Fix waveform offset drawing. 2012-12-15 18:45:56 -08:00
Jonathan Moore Liles 8a6772b6b9 Timeline: Fix bug in track right click handling. 2012-12-15 18:45:25 -08:00
Jonathan Moore Liles 569ba81f42 Mixer: Explicitly link to libdl. 2012-12-15 17:59:50 -08:00
Jonathan Moore Liles d455621543 Timeline: Suppress measure line drawing at wide zoom levels. 2012-12-11 22:13:18 -08:00
Jonathan Moore Liles a985cb3168 Timeline: Add menu button to track and control sequence headers. 2012-12-11 18:07:28 -08:00
Jonathan Moore Liles be495a6ded Timeline: Fix right-click context menu for control sequences. 2012-12-11 18:07:19 -08:00
Jonathan Moore Liles ed3b5355a4 Timeline: Commit omitted Fl_Sometimes_Pack 2012-12-11 13:16:32 -08:00
Jonathan Moore Liles 102670cb31 Timeline: Fix input bugs caused by track layout changes. 2012-12-10 22:58:18 -08:00
Jonathan Moore Liles 1ff528c8bf Update NTK. 2012-12-10 22:07:23 -08:00
Jonathan Moore Liles e1d706b5ed Timeline: Rework widget hierarchy for track display. Also, adjust timeline locking. 2012-12-10 21:47:44 -08:00
Jonathan Moore Liles 44f0aa7f35 FL/Fl_Blink_Button: Add option to ignore input. 2012-12-10 21:39:04 -08:00
Jonathan Moore Liles 964a1c53a3 wscript: Attempt to set proper compile/link flags for pthreads. 2012-12-10 21:38:31 -08:00
Jonathan Moore Liles bae6e38504 Timeline: Don't swap order of takes when reloading. 2012-12-10 21:37:29 -08:00
Jonathan Moore Liles e0b9c34f45 Timeline: Limit fequency of project loading progress updates.
This drastically improves project load times.
2012-12-10 21:36:58 -08:00
Jonathan Moore Liles 63d6da1f2f Session Manager: Change boxtype for session list. 2012-12-10 21:36:48 -08:00
Jonathan Moore Liles 1b4ec17964 Timeline: Draw control points bigger. 2012-12-10 21:36:41 -08:00
Jonathan Moore Liles dd6f448d72 Timeline/Track: fix track header resize behavior. 2012-12-01 16:53:57 -08:00
Jonathan Moore Liles e77dbca085 Timeline/Track: fix track header resize behavior. 2012-12-01 16:47:19 -08:00
Jonathan Moore Liles 998760bac6 Update NTK. 2012-12-01 16:18:01 -08:00
Jonathan Moore Liles 753ac2b56a Timeline: Redesign track header and add option to overlay control sequences.
Also, assign random color to individual control sequence (which the user may edit).
2012-12-01 16:14:01 -08:00
Jonathan Moore Liles f089d61ee2 Timeline/Track: Make 'takes' menu a submenu of the Track context menu.
Also, change the appearance  of rec/mute/solo buttons.
2012-11-29 23:40:28 -08:00
Jonathan Moore Liles 781ec66510 FL/Fl_Scalepack: Don't draw background when box is FL_NO_BOX. 2012-11-29 23:36:28 -08:00
Jonathan Moore Liles 5ffe3d44b3 Restore installation of .desktop files lost in WAF conversion. 2012-11-20 18:01:35 -08:00
Jonathan Moore Liles 73ebd3534b Timeline: Fix double free of Sequence_Widget::_label. 2012-11-20 10:05:18 -08:00
Jonathan Moore Liles 360f4f2481 FL: remove ntk-chtheme. 2012-11-19 01:00:39 -08:00
Jonathan Moore Liles 3b25772788 session-manager: Silence compiler warning. 2012-11-18 13:23:56 -08:00
Jonathan Moore Liles 06be33b0cc wscript: define _GNU_SOURCE. 2012-11-18 13:22:02 -08:00
Jonathan Moore Liles fc34b88b50 session-manager: Don't install 'send_osc' test program (which conflicts with a program of the same name in pyliblo) 2012-11-18 13:19:16 -08:00
Jonathan Moore Liles 96c14ea75a Update NTK. 2012-11-16 17:20:59 -08:00
Jonathan Moore Liles c54738a502 Sequencer: rework visual metronome. 2012-11-16 17:20:30 -08:00
Jonathan Moore Liles d97d1556d6 Fix wscripts for python3 2012-11-16 17:20:20 -08:00
Jonathan Moore Liles 47b82f0c9a Update NTK. 2012-11-16 01:31:27 -08:00
Jonathan Moore Liles 9c1eb8276d Timeline: Fix scope of panzoomer when timeline is shorter than window width. 2012-11-16 01:28:09 -08:00
Jonathan Moore Liles 173ab99186 FL/Fl_Blink_Button: Fix CPU wasting bug introduced in afd354. 2012-11-16 01:01:53 -08:00
Jonathan Moore Liles 1c7a64e266 Update build instructions. 2012-11-15 18:42:33 -08:00
Jonathan Moore Liles b04e1395cf Update NTK. 2012-11-15 18:38:54 -08:00
Jonathan Moore Liles 63bfc927c6 Remove some old build system lint. 2012-11-15 18:38:40 -08:00
Jonathan Moore Liles d86b71cb2c Replace custom build system with WAF. 2012-11-14 01:54:03 -08:00
Jonathan Moore Liles afd354a5b8 Clean up some compiler warnings 2012-11-05 23:51:32 -08:00
Jonathan Moore Liles 46d1c9c72a Timeline: Clean up use of Fl_Panzoomer. 2012-11-01 17:41:08 -07:00
Jonathan Moore Liles 7c8eb777e5 Timeline: Add an Fl_Tile so that user can resize the panzoomer. 2012-11-01 17:39:34 -07:00
Jonathan Moore Liles f124316c4b Timeline: s/hscroll/panzoomer 2012-11-01 17:39:21 -07:00
Jonathan Moore Liles 3d3a248fe5 Timeline: display track names in panzoomer. 2012-11-01 17:39:13 -07:00
Jonathan Moore Liles b50766b7da Timeline: Replace the scrollbars with a new Pan/zoom widget. 2012-11-01 03:35:04 -07:00
Jonathan Moore Liles 455fb7e1b9 scripts: Don't automatically run configure script on make. 2012-10-31 17:22:52 -07:00
Jonathan Moore Liles 9897655a9e scripts: default to non-interactive mode. 2012-10-31 12:54:53 -07:00
Jonathan Moore Liles 31cbec8a16 scripts: Fix master configure file for NTK changes. 2012-10-30 13:06:43 -07:00
Jonathan Moore Liles 12ed651e13 scripts: More changes to support using system installed NTK. Don't automatically assume user wants to checkout/build NTK submodule. 2012-10-30 11:52:36 -07:00
Jonathan Moore Liles 21ba2e35e5 scripts: Dynamically link to system-wide NTK, if found. 2012-10-30 09:11:13 -07:00
Jonathan Moore Liles 3c01a8a72a Update NTK. 2012-10-27 14:15:43 -07:00
Jonathan Moore Liles cf0c53b443 Timeline: Improve appearance of progress bars. 2012-10-27 14:12:09 -07:00
Jonathan Moore Liles ada46d215b Timeline: Make coloration of tracks optional. 2012-10-27 14:12:02 -07:00
Jonathan Moore Liles ee063e003b Timeline/ControlSequence: Simplify drawing. 2012-10-25 00:25:23 -07:00
Jonathan Moore Liles 03fdc46f3c Remove dates from documentation. Update CSS. 2012-10-23 23:20:13 -07:00
Jonathan Moore Liles a7d2f2f213 Timeline: Update most screenshots in documentation. 2012-10-23 22:56:01 -07:00
Jonathan Moore Liles 3054e7ecbf Timeline: Update documentation on cursors. 2012-10-23 22:55:58 -07:00
Jonathan Moore Liles 2f06f509d7 Timeline: Implement new cursor system.
This adds new cursor rulers for edit, punch and playback.  P1/P2 are now known as the
Edit Cursor. Multiple Punch Cursors may be defined. The playback cursor affects Home and End
controls. New options are available for looping over the playback cursor (even while recording)
and automatically creating new takes at start of recording (or loop).

The new cursor objects bump the project file version. Older versions of non-daw will be
unable to load new/edited projects.
2012-10-23 22:55:52 -07:00
Jonathan Moore Liles bcfa3953b1 Remove website documents from repository. 2012-10-23 22:55:43 -07:00
Jonathan Moore Liles ddb5d4f7ab FL/Fl_Text_Edit_Window: Don't die if initial text is NULL. 2012-10-23 20:31:42 -07:00
Jonathan Moore Liles cfcf4cf1fb Update NTK. 2012-10-05 15:48:54 -07:00
Jonathan Moore Liles 15a78bbfb5 Timeline: Don't die when a punch recording is started with no range defined. 2012-10-05 14:19:50 -07:00
Jonathan Moore Liles 2861509b52 Update repository paths in documentation. 2012-10-02 16:58:06 -07:00
Jonathan Moore Liles 5cc6136f9c NSM: update API document. 2012-09-23 18:57:06 -07:00
Jonathan Moore Liles 9cebe116d1 Update NTK. 2012-09-07 18:35:34 -07:00
Jonathan Moore Liles a6f43250ae NSM: Fix argument order for new GCC. 2012-09-07 18:34:32 -07:00
Jonathan Moore Liles 5f7a29219e Mixer: fix bug in makefile. 2012-08-07 17:45:55 -07:00
Jonathan Moore Liles c4b4f49575 Merge branch 'next' into master 2012-08-06 20:10:45 -07:00
Jonathan Moore Liles fd3d294b8a Update NTK submodule. 2012-08-06 20:05:50 -07:00
Jonathan Moore Liles 14d189c939 Update Makefile to automatically checkout NTK submodule and add README.build file. 2012-08-06 20:03:30 -07:00
Jonathan Moore Liles ee8764495f Mixer: Add --no-ui commandline option and non-mixer-noui executable symlink to permit running an instance of non-mixer without connecting to an X display. 2012-07-28 15:22:31 -07:00
Jonathan Moore Liles 3a999ecc86 Mixer: Fix segfault in module paste. 2012-07-21 16:31:55 -07:00
James Morris 15e095092c Small fix for the ladspa plugin module to multiple the port hint by sample rate to give frequency ports the correct value range. 2012-07-16 01:07:18 -07:00
Jonathan Moore Liles c53cb2e7fe Mixer: Fix -3db error in meter display. 2012-06-28 18:01:44 -07:00
Jonathan Moore Liles 89d26989f3 Mixer: Panner: Don't mangle line-style. 2012-06-28 00:38:41 -07:00
Jonathan Moore Liles f4dace9983 NSM: const fix in NSM proxy. 2012-06-24 11:48:11 -07:00
Jonathan Moore Liles 7f8de0710a Mixer: Fix divide by zero in DPM. 2012-06-23 21:49:21 -07:00
Jonathan Moore Liles be3c9c6412 Timeline: declick loop boundaries. 2012-06-22 21:13:05 -07:00
Jonathan Moore Liles ee2d86a012 Timeline: Tweak drawing of basic sequence region label. 2012-06-20 01:03:21 -07:00
Jonathan Moore Liles 870203b3dd Mixer: Update for NTK transparency. 2012-06-20 00:55:58 -07:00
Jonathan Moore Liles 81217a8722 Timeline: Display selection state of basic sequence points and sequence regions. 2012-06-18 21:31:23 -07:00
Jonathan Moore Liles 44a0279e4c Timeline: Just redraw the whole waveform when recording... 2012-06-18 21:27:59 -07:00
Jonathan Moore Liles a480a93ba4 Tweak Timeline<->Mixer discovery handshake. 2012-06-18 21:25:41 -07:00
Jonathan Moore Liles 8cddccf6a4 Timeline: Require rectangle or CTRL+Click to select sequence widgets. 2012-06-17 02:31:01 -07:00
Jonathan Moore Liles 3cc14df756 Timeline: Allow reordering of tracks. 2012-06-16 22:08:49 -07:00
Jonathan Moore Liles 6f993eeb10 nonlib: Always get the latest unjournaled state when saving. 2012-06-16 22:07:47 -07:00
Jonathan Moore Liles 13b6537ee4 NSM: Fix up configure and makefile. Also, clear some compiler warnings. 2012-06-16 19:46:29 -07:00
Jonathan Moore Liles 94367a990c Sequencer: Fix some NTK transparency issues. 2012-06-16 18:59:26 -07:00
Jonathan Moore Liles 553db45e8b NSM: Fix uninitialized value error with client labels. 2012-06-16 17:51:02 -07:00
Jonathan Moore Liles 1f9c2bbb6a Timeline: Fix thread synchronization issues during recording. 2012-06-15 18:53:40 -07:00
Jonathan Moore Liles ab8f23f15d Timeline: Simplify drawing of crossfades by using NTK transparency. 2012-06-13 23:04:42 -07:00
Jonathan Moore Liles 7107cbbf4c Timeline: Add CTRL+L shortcut to force redraw. 2012-06-13 21:04:31 -07:00
Jonathan Moore Liles deb08d4b14 Timeline: Fix disappearing waveforms. 2012-06-13 21:02:25 -07:00
Jonathan Moore Liles a27d0b1718 Timeline: Add basic punch in/out support (may require latency compensation). 2012-06-13 18:28:49 -07:00
Jonathan Moore Liles e968d8190f Timeline: Fix waveform drawing during record and cumulative error in looped region drawing. Also, avoid redrawing already displayed parts of waveforms while recording. 2012-06-12 20:53:21 -07:00
Jonathan Moore Liles f04c36cae9 Timeline: Prevent segfault at shut down due to OSC output thread left running. 2012-06-12 20:39:33 -07:00
Jonathan Moore Liles 989b6f0e4b Timeline: Avoid uninitialized read when drawing waveforms. 2012-06-12 20:39:33 -07:00
Jonathan Moore Liles e219e6766e Timeline: Fix uninitialized value in Control_Sequence. 2012-06-12 20:37:15 -07:00
Jonathan Moore Liles af3698bebc Timeline: Fix sign error in region panning. 2012-06-09 19:46:08 -07:00
Jonathan Moore Liles 1d59665702 Timeline: Eliminate some unnecessary repeated drawing of measure lines. 2012-06-07 00:29:54 -07:00
Jonathan Moore Liles ee5e4958d3 Mixer: Use LDRF_CFLAGS in makefile. 2012-06-06 23:50:02 -07:00
Jonathan Moore Liles 65f33096c2 Timeline: Avoid more complete redraws. 2012-06-06 23:49:18 -07:00
Jonathan Moore Liles 183764e767 Timeline: Always draw waveforms using theme foreground color. 2012-06-06 23:45:07 -07:00
Jonathan Moore Liles f3505a84de Timeline: Simplify fade application/avoid cast to long type. 2012-06-06 23:43:36 -07:00
Jonathan Moore Liles c6f6c57c05 Timeline: Tweak label drawing of sequence widgets. 2012-06-05 19:00:48 -07:00
Jonathan Moore Liles 275878395f Revert "Indicate loop point by modifying waveform color." 2012-06-05 17:31:23 -07:00
Jonathan Moore Liles a5588f7ad4 Timeline: Prevent status info update from causing complete redraw due to new NTK transparency logic. 2012-06-05 17:31:18 -07:00
fundamental ab98b66f44 The changes needed to get "nsm.h" to work with C (or C++ where stdio.h has not been included) 2012-06-05 17:31:09 -07:00
Jonathan Moore Liles 8eef38f0cc Timeline: Fix graphics corruption. Also, indicate loop point by modifying waveform color. 2012-06-05 02:23:42 -07:00
Jonathan Moore Liles c0375e614a Timeline: Fix null pointer derefrence when copying sequence points. 2012-06-04 23:00:13 -07:00
Jonathan Moore Liles 2af46a1a0c Timeline: Fix locking behavior of Control Sequences. 2012-06-04 22:59:33 -07:00
Jonathan Moore Liles d249bb9bbd OSC: Properly encode/decode special characters in osc paths. 2012-06-04 22:58:57 -07:00
Jonathan Moore Liles 0fba0747fc OSC: Fix bug that wiped out Signal paths. 2012-06-04 22:57:58 -07:00
Jonathan Moore Liles e5e6925c2c Mixer: Fix OSC path naming for multiple instances of the same LADSPA plugin. 2012-06-04 22:55:26 -07:00
Jonathan Moore Liles 7217266f6b Timeline: Tweak measure line drawing. 2012-06-04 17:25:54 -07:00
Jonathan Moore Liles 72a0c0eb3e Timeline: Tweak fade drawing. 2012-06-04 17:25:21 -07:00
Jonathan Moore Liles 3cca1e48a5 Timeline: Add feature to adjust region gain/scale with mouse. 2012-06-04 17:24:57 -07:00
Jonathan Moore Liles e5875fa072 Fix runaway processing in peakfile generation. 2012-06-04 17:14:37 -07:00
Jonathan Moore Liles 3e73817155 Fix some clang warnings. 2012-05-30 22:58:35 -07:00
Jonathan Moore Liles a8a5638f6a Timeline: Add missing include of unistd.h. 2012-05-30 21:22:48 -07:00
Jonathan Moore Liles 66d7701655 Sequencer: Don't skip first note of repeating patterns in Phrase mode. 2012-05-29 23:33:10 -07:00
Jonathan Moore Liles 8df6acd540 FL: Clean up enter key press behavior of Fl_Sometimes_Input 2012-05-27 20:34:49 -07:00
Jonathan Moore Liles b1cbd4faa6 Timeline: Improve the appearance of measure lines. 2012-05-27 19:53:02 -07:00
Jonathan Moore Liles d7fc792839 Timeline: Improve the appearance of sequence widget labels. 2012-05-26 20:12:23 -07:00
Jonathan Moore Liles 5eb890d653 Fix problem performing initial build. 2012-05-22 17:57:29 -07:00
Jonathan Moore Liles 6ae771b297 Timeline: Transition to C NSM API header instead of C++ version. 2012-05-21 22:28:12 -07:00
Jonathan Moore Liles fa195cf817 Add C only NSM API header. 2012-05-21 22:28:04 -07:00
Jonathan Moore Liles 9b669e42e0 Fix NTK Makefile. 2012-05-21 21:23:02 -07:00
Jonathan Moore Liles fbef266be3 Update NTK submodule. 2012-05-21 21:23:02 -07:00
Jonathan Moore Liles a465c17e2a Timeline/Track: Change button appearance. 2012-05-21 21:23:02 -07:00
Jonathan Moore Liles c370130d2b Timeline: Avoid drawing fade curves when clipped or 0 width. 2012-05-21 21:23:02 -07:00
Jonathan Moore Liles fa5d739ac7 Timeline: Make entire window an Fl_Overlay_Window instead of using a subwindow for timeline. 2012-05-21 21:23:02 -07:00
Jonathan Moore Liles c9a7e56b80 Sequencer: Fix layering of controls. 2012-05-21 21:23:02 -07:00
Jonathan Moore Liles 0cc0bf2f00 Sequencer: Eliminate some unnecessary drawing. 2012-05-21 21:23:02 -07:00
Jonathan Moore Liles 73d2c2d396 Timeline: Use simpler boxtypes for audio regions. 2012-05-21 21:23:02 -07:00
Jonathan Moore Liles 0904809a05 FL: Fix configure. 2012-05-21 21:23:02 -07:00
Jonathan Moore Liles d23307ca53 Sequencer: Use double for ticks_t
This helps dealing with fractional errors resulting in dropped notes when running with
very small buffer sizes.
2012-05-21 21:23:02 -07:00
Jonathan Moore Liles 2c6b6b1a75 FLTK->NTK
FLTK fork gets Cairo and is renamed to NTK.

Themes are moved from FL into NTK core.

Fl_Arc_Dial is moved into NTK core.
2012-05-21 21:23:02 -07:00
Jonathan Moore Liles a588f4ae96 Timeline: Make display of box around audio regions optional. 2012-05-21 21:23:02 -07:00
Jonathan Moore Liles f5240cb2f4 Mixer: Improve panner drawing. 2012-05-21 21:23:02 -07:00
Jonathan Moore Liles 363f2f04bc Mixer: Allow controller modules to be removed. 2012-05-20 15:09:45 -07:00
Jonathan Moore Liles ac30a5a4e2 OSC: Fix some uninitialized values. 2012-05-03 22:57:54 -07:00
Jonathan Moore Liles f279f49b1e NSM: Don't accept an open command while one is still pending. 2012-05-02 18:38:11 -07:00
Jonathan Moore Liles f816742b65 OSC: Don't fail if peer scan callback is not set! 2012-04-27 10:17:37 -07:00
Jonathan Moore Liles 16a4c0f51d Mixer: Fix receiving of direct OSC messages. 2012-04-24 13:16:31 -07:00
Jonathan Moore Liles 9f28f7a1a8 Move -L flags after the object name in linker commands. 2012-04-24 09:44:56 -07:00
Jonathan Moore Liles be79c69161 Add a master configure script. 2012-04-16 21:29:34 -07:00
Jonathan Moore Liles da225ff64a nonlib: Remove sigc++ dependencey from OSC::Endpoint.
This also removes sigc++ as a dependency for mixer and timeline.
2012-04-16 21:29:34 -07:00
Jonathan Moore Liles c21e7b1381 Sequencer: Replace 'Circle' note shape with 'Box'. 2012-04-15 20:42:57 -07:00
Jonathan Moore Liles 272e87cbf8 NSM: Don't clear the 'stopped' status of dumb clients upon save. 2012-04-15 16:56:03 -07:00
Jonathan Moore Liles ae5879a20e NSM: Don't allow 'added' clients to replace stopped clients. 2012-04-15 16:55:32 -07:00
Jonathan Moore Liles 57ac27ecac Change the appearance of the "SM" indicator in mixer, daw, sequencer. Tweak GUIs. 2012-04-14 14:11:58 -07:00
Jonathan Moore Liles 61addce803 Add missing includes for unistd.h 2012-04-13 15:23:52 -07:00
Jonathan Moore Liles e662a7623b Add missing includes for unistd.h 2012-04-13 15:23:40 -07:00
Jonathan Moore Liles 5e63b25504 FL: Reset boxtypes before activating new theme. 2012-04-11 22:56:25 -07:00
Jonathan Moore Liles 25a0b8afc6 FL: Mute colors in Clean theme. 2012-04-11 22:48:47 -07:00
Jonathan Moore Liles 12532e1fbc NSM: Redraw Fl_Tree as sessions are added. 2012-04-11 01:15:48 -07:00
Jonathan Moore Liles 89c76fe0c9 nsm-proxy: Use common theme settings. 2012-04-11 00:56:45 -07:00
Jonathan Moore Liles 16f8956f8d nsm-proxy: Don't die if arguments are missing. 2012-04-11 00:49:58 -07:00
Jonathan Moore Liles 679e33d729 NSM: Automatically start nsm-proxy if user attempts to add a client with arguments. 2012-04-11 00:49:58 -07:00
Jonathan Moore Liles 11a0d40e86 NSM: Update documentation. 2012-04-11 00:49:58 -07:00
Jonathan Moore Liles d34ede74a6 NSM: Fix Fl_Tree selection. 2012-04-11 00:49:58 -07:00
Jonathan Moore Liles ffe5299da4 nsm-proxy: Save on 'start'. 2012-04-11 00:49:58 -07:00
Jonathan Moore Liles a66c041050 NSM: Use Fl_Tree for session list. 2012-04-11 00:49:57 -07:00
Jonathan Moore Liles 1d8d8b0548 NSM: Add stop/kill button for each client to GUI. 2012-04-11 00:49:57 -07:00
Jonathan Moore Liles 468c969162 nsm-proxy: Add more instructions to GUI. 2012-04-11 00:49:57 -07:00
Jonathan Moore Liles b48ca7c44b NSM: Implement nsm-proxy, which permits the use of 'dumb' clients with commandline arguments (which may also respond to Unix signals by saving their state). 2012-04-11 00:49:57 -07:00
Jonathan Moore Liles 885ef30a88 NSM: Add support for clients with optional GUIs. 2012-04-11 00:49:57 -07:00
Jonathan Moore Liles fdcf74ddbe Replace crappy Fl::scheme() thing with a more useful theme implementation in Fl_Theme and Fl_Color_Sheme classes.
Theme settings are now common between all Non-* programs.

Also adds a new 'Clean' theme.
2012-04-10 23:59:12 -07:00
Jonathan Moore Liles e424182dce Timeline: Fix false-positive incompatibility with old project files. 2012-04-04 18:59:34 -07:00
Jonathan Moore Liles eda11f56fe Timeline: Symlink to drag'n'drop'd files from the sources/ directory rather than including the absolute path in the journal. 2012-04-02 21:30:56 -07:00
Jonathan Moore Liles 9896970ed0 Timeline: Don't do FL_DAMAGE_SCROLL unless the viewport has actually moved... 2012-04-01 18:49:16 -07:00
Jonathan Moore Liles 9667f98995 Timeline: Don't fork to generate peak mipmaps, do it in the capture thread. Also, clean up related concurrency issues. 2012-04-01 18:27:27 -07:00
Jonathan Moore Liles f941d7c923 Clean up DESTDIR install behavior. 2012-03-30 17:24:22 -07:00
Jonathan Moore Liles 338e66c759 Cleanup locking for OSC playback. 2012-03-29 22:08:45 -07:00
Jonathan Moore Liles 792e6f280a Jackpatch: Use jack port registration callbacks instead of polling the port list. 2012-03-27 18:21:00 -07:00
Jonathan Moore Liles 95175c3e2b Sequencer: Save and restore settings from View menu. 2012-03-25 16:48:16 -07:00
Jonathan Moore Liles 713f3ef476 Sequencer: Clean up GUI. 2012-03-25 16:30:30 -07:00
Jonathan Moore Liles 91c8dd905f Jackpatch: Use jack port registration callbacks instead of polling the port list. 2012-03-25 15:05:17 -07:00
Jonathan Moore Liles 0a963f5c8a Timeline: Add keybindings for split region at mouse and crop region to range. 2012-03-18 13:21:57 -07:00
Jonathan Moore Liles bc6f94e769 Timeline: Use solid lines for drawing measure lines--they're way faster than dashed. 2012-03-17 21:16:02 -07:00
Nedko Arnaudov 0c9ad88b4f fix non-sequencer doc installation 2012-03-14 19:02:36 -07:00
Nedko Arnaudov 54c74d3de7 gitignore generated files 2012-03-14 19:02:32 -07:00
Nedko Arnaudov fa504e062d Remove broken open_url() hack.
The embedded fltk version works fine.
2012-03-14 19:02:28 -07:00
Jonathan Moore Liles d4900e10e5 Sequencer: Fix invalid queue state for duplicated patterns. 2012-03-14 18:28:35 -07:00
Jonathan Moore Liles 6673f7057a Mixer: Listen for OSC messages in a thread instead of polling. 2012-03-13 22:41:54 -07:00
Jonathan Moore Liles c74cd04bab Sequencer: Try to avoid excessive double buffer flips when the transport is rolling. 2012-03-13 19:50:17 -07:00
Jonathan Moore Liles e1495ba425 Update FLTK head. 2012-03-13 18:49:28 -07:00
Jonathan Moore Liles ced664baf2 FLTK: Disable XDBE, as it's generally slower than using pixmaps (because with a pixmap we can do partial copies) 2012-03-13 18:48:18 -07:00
Jonathan Moore Liles ca3076d2ec Timeline: Avoid triggering excessive redraws. 2012-03-13 18:47:53 -07:00
Jonathan Moore Liles a988b18062 Update FLTK. 2012-03-09 21:53:44 -08:00
Jonathan Moore Liles ce6a7f3ec3 Update FLTK submodule. 2012-03-09 13:29:05 -08:00
Jonathan Moore Liles 5a95b1a18f Add some more omitted symlinks. 2012-03-07 18:34:33 -08:00
Jonathan Moore Liles 9db488173b Don't include fltk-config in global sanity check. 2012-03-07 18:29:30 -08:00
Jonathan Moore Liles 376f863833 More build system tweaks. 2012-03-07 18:22:37 -08:00
Jonathan Moore Liles ed908d4bcb Sequencer: Add omitted makefile. 2012-03-07 18:03:37 -08:00
Jonathan Moore Liles 11c9a02687 Add some omitted symlinks required for the build. 2012-03-07 17:55:59 -08:00
Jonathan Moore Liles 2e80994cf5 More tweaking of build for static FLTK. 2012-03-06 20:01:37 -08:00
Jonathan Moore Liles 5336880bd4 Further tweak build system to work with private version of FLTK. 2012-03-06 17:38:52 -08:00
Jonathan Moore Liles 9a80f4c3f3 Sequencer: Don't leak from the output buffer when suppressing duplicate noteon/offs. 2012-03-06 17:33:32 -08:00
Jonathan Moore Liles 0f86ee6882 Use the same value for Fl::visual() everywhere. 2012-03-06 16:39:44 -08:00
Jonathan Moore Liles 0abfd44031 Sequencer: Fix signal handlers. 2012-03-06 16:39:36 -08:00
Jonathan Moore Liles e81270d74e Timeline: Workaround bug in FLTK 1.3 that prevented Control Sequences from displaying. 2012-03-06 00:42:51 -08:00
Jonathan Moore Liles 6a0b2d2069 Timeline: When waiting for peaks, only check again every 500ms. 2012-03-05 21:18:36 -08:00
Jonathan Moore Liles ad3d826493 Timeline: Account for new clipping behavior in FLTK 1.3 when drawing in the overlay plane. 2012-03-05 21:15:38 -08:00
Jonathan Moore Liles dd5aa2cdcf Add known-working FLTK revision as a submodule. Link to it statically. 2012-03-05 19:06:13 -08:00
Jonathan Moore Liles 6f19499a3c Add sequencer to master Makefile. 2012-03-04 22:52:43 -08:00
Jonathan Moore Liles 5672517caa Sequencer: Update appearance, begin to use FL/ helpers. 2012-03-04 22:45:40 -08:00
Jonathan Moore Liles ca64e0fef8 Bring Non-Sequencer's build system in line with Non-DAW and Non-Mixer. 2012-03-04 22:18:11 -08:00
Jonathan Moore Liles d4bacf444a Update from master. 2012-03-04 21:44:48 -08:00
Jonathan Moore Liles 670400cbf9 Handle SIGHUP. 2012-03-04 19:12:32 -08:00
Jonathan Moore Liles 92dfbbc6f6 Timeline: Clean up commandline handling. 2012-03-04 19:01:07 -08:00
Jonathan Moore Liles 2d5072c7d7 Mixer: Improve commandline handling. 2012-03-04 18:57:00 -08:00
Jonathan Moore Liles 676a98c17e Mixer: Implement NSM dirtiness notification. 2012-03-04 18:22:32 -08:00
Jonathan Moore Liles d67ee6605a NSM: Don't die when user clicks blank area of the session list. 2012-03-04 13:40:06 -08:00
Jonathan Moore Liles e4e546b849 Timeline: Add omitted header file change. 2012-03-04 12:55:16 -08:00
Jonathan Moore Liles ae6b78cf89 Timeline: Maybe be more accurate in reporting used disk space. 2012-03-04 03:50:52 -08:00
Jonathan Moore Liles 4f472c2a8e scripts: Fix alignment in compile output. 2012-03-04 00:16:16 -08:00
Jonathan Moore Liles f3b66982b7 scripts: Add test for unresolvable hostname to build. 2012-03-04 00:08:07 -08:00
Jonathan Moore Liles e0e593277f NSM: Make GUI a little prettier than the FLTK defaults. 2012-03-03 23:54:41 -08:00
Jonathan Moore Liles d295593e55 Fix tpyo in mkaefile. 2012-03-03 23:15:23 -08:00
Jonathan Moore Liles 0e5db66f16 Use one master makefile instead of having a different one per project. 2012-03-03 20:13:59 -08:00
Jonathan Moore Liles 7495731df6 Merge Non Sequencer history into the same repository as Non-Mixer and Non-DAW. 2012-03-03 19:47:36 -08:00
Jonathan Moore Liles a320232b66 Bring Non-Sequencer into the same repository as Non-DAW and Non-Mixer. 2012-03-03 19:26:58 -08:00
Jonathan Moore Liles 46bb1bf702 Add more flare to drawing. Also, default to square shape for notes. 2012-03-03 18:30:46 -08:00
Jonathan Moore Liles 8e01aec002 Actually do what the previous commit only claimed to. 2012-03-03 17:52:40 -08:00
Jonathan Moore Liles a93f620eb0 Oops. Don't forget to initialize JACK when not connected to NSM. 2012-03-03 17:48:08 -08:00
Jonathan Moore Liles ba45c07b04 Mixer: Restore display of module name in Module Parameter Editor. 2012-03-03 13:21:18 -08:00
Jonathan Moore Liles 60de871511 NSM: Clean up compiler warnings. 2012-03-03 12:40:25 -08:00
Jonathan Moore Liles 15cdc92125 Oops. Forgot to update NSM API version. 2012-03-03 11:17:42 -08:00
Jonathan Moore Liles 82b2c5e565 Oops. Forgot to update NSM API versions. 2012-03-03 11:16:20 -08:00
Jonathan Moore Liles 1baaed2e5d Oops. Remove mention of LASH (tsk, tsk) from overview. 2012-03-03 02:55:45 -08:00
Jonathan Moore Liles 6d938e77a2 Bump version. 2012-03-03 00:17:36 -08:00
Jonathan Moore Liles 3ac28ce0de Replace crappy LASH support with fancy new NSM support. 2012-03-02 19:29:14 -08:00
Jonathan Moore Liles f1dc015b08 Add some scrolling indicators to pattern view. 2012-03-01 08:51:04 -08:00
Jonathan Moore Liles d733de358e Enforce restriction on total number of patterns and phrases. 2012-03-01 08:50:55 -08:00
Jonathan Moore Liles f8221f51e8 Fix bug in drawing of long note names. 2012-03-01 08:50:54 -08:00
Jonathan Moore Liles 20fcfe436f Change mouse bindings...
MOUSEWHEEL and SHIFT+MOUSEWHEEL scroll verically and horizontally.

Alt+Mousewheel adjusts note velocity.

And Ctrl+Alt+LeftButton invokes randomize row.
2012-02-29 21:33:14 -08:00
Jonathan Moore Liles 877d08759d Center the pattern viewport. 2012-02-29 21:28:31 -08:00
Jonathan Moore Liles ca56b8c337 Make note shape (circle, square) optional.
Also, get rid of the canvas's ability to display different shapes on the same
canvas, since we never use that feature anyway.
2012-02-29 20:46:57 -08:00
Jonathan Moore Liles 9974e9bb47 Be more efficient when recording. 2012-02-29 19:57:23 -08:00
Jonathan Moore Liles 71e0583696 Improve queue playback mode. Flash pattern trigger with color of queued state.
Also, use Channel 0 CC 20 0-127 for pattern triggering instead of NOTE ONs.
2012-02-29 19:01:18 -08:00
Jonathan Moore Liles 0d62b91605 Non-Sequencer gets a new icon! Set icon on main window. Requires libXpm. Also, update config funcs. 2012-02-29 13:32:07 -08:00
Jonathan Moore Liles 0f19bf3c6b Fix output of non-note event types which was broken by 0e946a. 2012-02-29 13:31:12 -08:00
Jonathan Moore Liles 17e32e0282 Implement Queue playback mode.
Pattern muteing/unmuteing (via GUI or MIDI) takes effect the next time the
pattern loops.
2012-02-29 01:17:34 -08:00
Jonathan Moore Liles 802f4c572f Only attempt to fill the screen when the screen is smaller than the window. 2012-02-29 01:16:20 -08:00
Jonathan Moore Liles 6566626c7f Don't load garbage into song name due to uninitialized pointer. 2012-02-29 01:16:12 -08:00
Jonathan Moore Liles 8ac4b60928 Silence uninformative debug warning message. 2012-02-28 04:39:25 -08:00
Jonathan Moore Liles e98326103e MIDI input on 'control' port triggers patterns in Trigger playback mode.
Notes 1-128 on Channel 1 correspond to patterns. NOTE ON triggers the pattern
at the given moment, a second NOTE ON stops it at a given moment. NOTE OFF does
nothing. Also, patterns triggered via the GUI are no longer forced to be in
lock-step.
2012-02-27 19:47:42 -08:00
Jonathan Moore Liles e9aca6809e Keep number of rows on phrase canvas in sync with the number of patterns. 2012-02-27 17:42:42 -08:00
Jonathan Moore Liles c91f950612 Remove TODO file from repository. 2012-02-27 17:42:26 -08:00
Jonathan Moore Liles 0e946a9f73 Attempt to always emit the correct number of NOTE ONs and NOTE OFFs. 2012-02-27 00:48:00 -08:00
Jonathan Moore Liles 614fea7343 Don't drop the first notes of phrases when playing in sequence mode. 2012-02-26 22:39:26 -08:00
Jonathan Moore Liles 6ce2d2051c Previous commit for fluid update messed up some widget dimensions. Revert that part. 2012-02-26 21:05:04 -08:00
Jonathan Moore Liles aa6c6388d5 Replace "Fl" in include directives with "FL" 2012-02-26 20:39:44 -08:00
Jonathan Moore Liles 0631949d8a Fix fluid file for different behavior in the lastest version of FLUID. 2012-02-20 03:02:38 -08:00
Jonathan Moore Liles a84e6b8aca Bring some 'configure' script improvements over from Non-DAW. 2012-02-20 02:54:34 -08:00
Robert Wruck 6a09ce1c9c Fix division by zero on metronome update 2011-06-21 22:21:51 -07:00
Robert Wruck c7a54f2c4d Fix list corruption in insert_time and fix sort(), too 2011-06-21 21:58:15 -07:00
Jonathan Moore Liles ba94d2c354 UI: Clean up layout of BPM/metronome/transport controls area. 2010-01-03 01:17:06 -06:00
Jonathan Moore Liles b1d349532a Transport: Respond to meter changes initiated by GUI the same way as those initiated by JACK. 2010-01-03 01:15:49 -06:00
Jonathan Moore Liles 5e78c98cae Try to fill the screen at startup. 2009-12-31 02:33:56 -06:00
Jonathan Moore Liles d156972be6 Fix event editor display with less than N events. 2008-11-28 18:57:19 -06:00
Jonathan Moore Liles 32e801f268 Don't segfault when loading a song specified on the command line. 2008-11-26 15:33:12 -06:00
Jonathan Moore Liles ab3f1037ef Makefile: Apply patch for Gentoo sandbox compliance. 2008-09-05 17:36:43 -05:00
Jonathan Moore Liles 211e45bc1b Lower the minimum size hint for the main window. 2008-08-11 21:18:43 -05:00
Juuso Alasuutari e1d13ce083 Fix ordering of LASH/JACK initialization.
Signed-off-by: Jonathan Moore Liles <j.liles@unix.net>
2008-07-29 18:50:25 -05:00
Jonathan Moore Liles 7d8423bbaf Minor updates to documentation. 2008-07-15 23:38:48 -05:00
Jonathan Moore Liles 1d79326c1b Fix tpyos in documentation. 2008-07-06 22:10:33 -05:00
Jonathan Moore Liles 9948b9e307 Add table of contents to manual. 2008-06-27 17:37:49 -05:00
Jonathan Moore Liles 21a42171a4 Bump version. 2008-06-25 21:54:20 -05:00
Jonathan Moore Liles 7ce661c3a4 Include git HEAD in about dialog for non-releases. 2008-06-25 21:53:59 -05:00
Jonathan Moore Liles dcb690d7e1 Add proper GPL header to Makefile 2008-06-24 23:49:38 -05:00
Jonathan Moore Liles d70dd3a517 Change the way patterns are triggered in sequence mode.
Now patterns should be triggered properly even if we come in in the
middle of a phrase, as happens when randomly relocating the transport.
2008-06-15 17:27:04 -05:00
Jonathan Moore Liles 81f504f88b Don't always clobber the viewport Y when changing canvas grid. 2008-06-15 12:45:57 -05:00
Jonathan Moore Liles c71283fb85 Include event type number in warning for unhandled LASH events. 2008-06-15 09:48:14 -05:00
Jonathan Moore Liles f440223d20 Add shortcuts to 'modified since last save' dialog. 2008-06-14 11:41:00 -05:00
Jonathan Moore Liles 530960e14d Use an Fl_Box for status line instead of Fl_Output. 2008-06-14 11:37:56 -05:00
Jonathan Moore Liles f7e6e50666 Update canvas view when row compaction setting is changed. 2008-06-14 11:29:10 -05:00
Jonathan Moore Liles 70a3049bca Oops. Fix event selection broken by 1a400d0. 2008-06-14 08:32:38 -05:00
Jonathan Moore Liles 25842b89a7 Minor cleanup. 2008-06-13 23:53:20 -05:00
Jonathan Moore Liles 148b313b31 Makefile: fix FLUID rule. 2008-06-13 23:35:27 -05:00
Jonathan Moore Liles f3c9c99ceb Clean up messages. 2008-06-13 23:35:04 -05:00
Jonathan Moore Liles b5c1ebb200 Move sources into src/ directory. 2008-06-13 23:15:44 -05:00
Jonathan Moore Liles ba10714be3 Canvas widget no longer need be a subwindow. 2008-06-13 23:00:58 -05:00
Jonathan Moore Liles accd94a465 Rename and prioritize TODO list. 2008-06-10 12:22:26 -05:00
Jonathan Moore Liles 0367019e60 Makefile: fix makedepend rule. 2008-06-08 22:10:16 -05:00
Jonathan Moore Liles de54a267f3 configure: Pull enhancements over from Non-DAW. 2008-06-08 17:55:38 -05:00
Jonathan Moore Liles cc96a2bb2b configure: Fix version comparision function. 2008-06-08 16:10:58 -05:00
Jonathan Moore Liles 8ca002d200 Don't print all messages to stderr (only warnings, assertions, and fatal errors) 2008-06-08 09:16:21 -05:00
Jonathan Moore Liles 3bbb91f5d1 Update overview. 2008-06-06 22:42:51 -05:00
Jonathan Moore Liles 2988781ec3 Remove unnecessary message. 2008-05-29 10:15:23 -05:00
Jonathan Moore Liles 9cc59e10ed Makefile: Fix typo. Add notice about `make config` 2008-05-21 10:21:11 -05:00
Jonathan Moore Liles d68f09691e configure: Pull from Non-DAW. 2008-05-20 23:35:46 -05:00
Jonathan Moore Liles cdcd6516e7 Use the logo.png installed with the documentation rather than including the XPM in the binary. 2008-05-20 23:31:36 -05:00
Jonathan Moore Liles 19cc44ef07 Change the production optimization level. 2008-05-20 23:31:23 -05:00
Jonathan Moore Liles 1a400d076a Clean up some compiler warnings. 2008-05-20 00:18:10 -05:00
Jonathan Moore Liles 60ae9ce8b7 Bump version. 2008-05-18 12:16:24 -05:00
Jonathan Moore Liles 767a845a28 Maybe strip binary when installing. 2008-05-18 12:15:24 -05:00
Jonathan Moore Liles 7bf271c456 Change program name to non-sequencer to avoid confusion (ha!) 2008-05-18 12:15:11 -05:00
Jonathan Moore Liles e78b3f14e7 Bring build system improvements over from Non-DAW. 2008-05-18 11:56:25 -05:00
Jonathan Moore Liles 257aeb116d Update TODO. 2008-05-18 11:37:12 -05:00
Jonathan Moore Liles a772347501 Add message to the Makefile suggesting the user may need to run 'make install'. 2008-05-14 11:10:31 -05:00
Jonathan Moore Liles 72ae9470d3 Don't crash when song cannot be loaded via LASH.
Consider invalid song path given via command line a fatal error.
2008-05-03 12:15:02 -05:00
Jonathan Moore Liles 8ae4e4f40c SMF: clear running status at track start and after meta events. 2008-04-10 19:47:42 -05:00
Jonathan Moore Liles 4f186d9acb SMF: fix breakage when instrument names contain spaces. 2008-04-10 19:09:02 -05:00
Jonathan Moore Liles 047a003df1 Attempt to address interaction between jack buffer size and tempo. 2008-03-24 20:52:41 -05:00
Jonathan Moore Liles dce2463cb8 Rename DEBUG macro. Avoid printing some debugging messages in the RT thread of the production build. 2008-03-23 14:47:19 -05:00
Jonathan Moore Liles 98aab77917 Update documentation. 2008-03-23 01:35:07 -05:00
Jonathan Moore Liles cfd27f88ed Ensure that song dirtiness is cleared by 'new'. 2008-03-23 01:26:39 -05:00
Jonathan Moore Liles c307a3443c Do notes_on math in integer instead of floating point to avoid denormal issues on some CPUs.
Avoid scanning notes_on for ports on which there are no notes playing.
2008-03-23 01:23:06 -05:00
Jonathan Moore Liles fbe232fcfb Show transport timebase state on status line.
Since there doesn't appear to be anything in the JACK API to either
examine the current timebase master, or inform the master that it has
been relieved, it will still require some timing hackery in order to
display "slave" when another client forcefully takes over as timebase
master.
2008-03-23 00:51:02 -05:00
Jonathan Moore Liles cb5960d298 Set song dirtiness more often/more consistently. 2008-03-22 23:43:40 -05:00
Jonathan Moore Liles 93f51f33ea Update TODO 2008-03-22 20:27:45 -05:00
Jonathan Moore Liles c9b604502c Make event debugging a separate option. 2008-03-22 15:20:34 -05:00
Jonathan Moore Liles 7e22c27576 Bump version. 2008-03-19 19:28:52 -05:00
Jonathan Moore Liles a8cdb739e1 Provide alternative error message. 2008-03-18 21:21:19 -05:00
Jonathan Moore Liles 529a003fe3 Display an error message when the JACK transport is broken. 2008-03-18 20:54:31 -05:00
Jonathan Moore Liles eca26e797c Don't depend on fl_open_uri, which is new in FLTK 1.1.8 2008-03-17 14:01:33 -05:00
Jonathan Moore Liles c5ff8f6159 Update for the new fluid in 1.1.8rc2 2008-03-14 13:38:58 -05:00
Jonathan Moore Liles 72ba000470 Use fl_open_uri() for homepage URL in about window. 2008-03-04 19:31:38 -06:00
Jonathan Moore Liles bbd49089a1 Oops. Fix regression in instrument loader resulting in a confusing error message. 2008-02-22 18:37:46 -06:00
Jonathan Moore Liles 7421e646df Clean up a few inconsistencies with sequence tab detaching. 2008-02-15 01:40:33 -06:00
Jonathan Moore Liles 6765c3faea Oops. Fix bug introduced in mapping note exclusion commit
that resulted in all non-note events being dropped.
2008-02-15 00:10:28 -06:00
Jonathan Moore Liles 5cb724cecc Correct off-by-one in drawing of selection rectangle. 2008-02-14 23:29:12 -06:00
Jonathan Moore Liles 4515a3d9a4 Draw playhead the same way, regardless of selection flag. 2008-02-14 23:24:49 -06:00
Jonathan Moore Liles db1b2f63e7 Make 'crop' command crop to rectangle too. 2008-02-14 23:14:15 -06:00
Jonathan Moore Liles d8fe1ad003 Add new rectangular selection to canvas.
Add commands to invert selection.
Make middle click toggle note selection instead of set it.
2008-02-14 22:21:08 -06:00
Jonathan Moore Liles 5f8d98cb92 Update TODO. 2008-02-14 20:11:07 -06:00
Jonathan Moore Liles 3713bf9629 Add Jack MIDI section to manual. 2008-02-14 17:42:15 -06:00
Jonathan Moore Liles 9d0689a8fa Make 'install' rule depend on 'all' 2008-02-14 13:33:06 -06:00
Jonathan Moore Liles 3ab70175da Don't depend on {foo,bar} expansion support in shell in Makefile. 2008-02-14 10:09:15 -06:00
Jonathan Moore Liles 90e0853e91 Actually commit rendered HTML doc from previous doc fix commit. 2008-02-13 16:51:58 -06:00
Jonathan Moore Liles 0b2b55281f Make sure notes are redrawn when mapping is changed. 2008-02-13 13:48:50 -06:00
Jonathan Moore Liles 742679c5ad Actually mute notes outside of current mapping. 2008-02-13 13:42:00 -06:00
Jonathan Moore Liles 9bebbffd46 Fix tpyos in dcumentaion. 2008-02-13 11:41:55 -06:00
Jonathan Moore Liles 9f151de3e1 Add 'dist' target to Makefile. 2008-02-13 10:23:19 -06:00
Jonathan Moore Liles bc64b35d2a Make all objects depend on Makefile. 2008-02-13 10:12:40 -06:00
Jonathan Moore Liles 7b75e2b425 Move definition of VERSION to Makefile. 2008-02-13 10:10:41 -06:00
Jonathan Moore Liles 81fe5efb53 Make detached sequence window double-buffered too. 2008-02-13 01:06:48 -06:00
Jonathan Moore Liles 0953207188 Update documentation. 2008-02-12 20:19:33 -06:00
Jonathan Moore Liles 41eb6f4d7a Update playback mode widget when song is loaded via LASH. 2008-02-12 19:56:01 -06:00
Jonathan Moore Liles 65df570a30 Clean up some uninitialized values flagged by valgrind. 2008-02-12 19:37:26 -06:00
Jonathan Moore Liles 5ceed377fb Update phrase display when patterns are created/destroyed. 2008-02-12 17:04:38 -06:00
Jonathan Moore Liles d301578e54 Call Fl_Double_Window::resize in canvas widget resize method.. Apparently it matters. 2008-02-12 16:25:14 -06:00
Jonathan Moore Liles bb014f4a09 Switch canvas to double-buffering after all as it seems not to result
in any speed decrease, but leave canvas widget as subwindow.
2008-02-12 15:34:16 -06:00
Jonathan Moore Liles a71ba1cbba Use double-buffered visual for main_window, but keep canvas widget
single-buffered by placing it inside a subwindow
2008-02-12 15:25:11 -06:00
Jonathan Moore Liles 39423ef8de Fix error in ASSERT macro. 2008-02-12 13:25:07 -06:00
Jonathan Moore Liles 70d576a6e4 Clear status message after 5 seconds. 2008-02-12 12:29:00 -06:00
Jonathan Moore Liles 6447678a08 Add more status line output. 2008-02-12 12:21:42 -06:00
Jonathan Moore Liles 58c2dad706 Minor cleanup of debugging output. 2008-02-12 12:08:17 -06:00
Jonathan Moore Liles fe8fab22df Add signals for song dirty state. Make file menu entries context sensitive. 2008-02-12 00:06:08 -06:00
Jonathan Moore Liles e3a3d71404 Clean up tab focus handling and make Edit menu context sensitive. 2008-02-11 23:21:14 -06:00
Jonathan Moore Liles dfa3722ed0 Break instrument editor out into its own class. 2008-02-11 22:59:18 -06:00
Jonathan Moore Liles 835bbed0f8 Add new instrument definitions. 2008-02-11 22:18:21 -06:00
Jonathan Moore Liles 846413fee8 Support saving of instrument definitions. 2008-02-11 22:06:00 -06:00
Jonathan Moore Liles 00354529c7 Support loading of user defined instruments. 2008-02-11 18:22:04 -06:00
Jonathan Moore Liles c0c7f71830 Being to support saving of instrument definitions. 2008-02-11 17:42:15 -06:00
Jonathan Moore Liles 83e2cc45ad Allow editing of instrument row properties. 2008-02-11 16:59:54 -06:00
Jonathan Moore Liles 3607fb5693 Fix math error in timebase master code. 2008-02-11 00:18:45 -06:00
Jonathan Moore Liles 42f7242ba5 Add phrase and sequence progress bar widgets. 2008-02-11 00:16:31 -06:00
Jonathan Moore Liles 0af405908d Don't fail if instrument definitions cannot be found. Use C Major as default mapping. 2008-02-10 23:20:39 -06:00
Jonathan Moore Liles 8f3f02d9aa Initial public checkin. 2008-02-10 18:46:51 -06:00
427 changed files with 45911 additions and 20885 deletions

6
.gitignore vendored
View File

@ -4,6 +4,6 @@
*.[ao]
TAGS
.nfs*
make.conf
.deps
misc/
.waf*
build
attic

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "lib/ntk"]
path = lib/ntk
url = git://git.tuxfamily.org/gitroot/non/fltk.git

41
COPYING
View File

@ -1,12 +1,12 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@ -55,8 +55,8 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
@ -303,17 +303,16 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View File

@ -13,23 +13,16 @@ decl {\#include <FL/filename.H>} {private local
Function {open_url( const char *url )} {open return_type void
} {
code {\#if ! ( FL_MAJOR_VERSION >= 1 && FL_MINOR_VERSION >= 1 && FL_PATCH_VERSION >= 8 )
// FIXME: got a better idea?
char cmd[256];
snprintf( cmd, sizeof( cmd ), "x-www-browser '%s' &", url );
system( cmd );
\#else
fl_open_uri( url );
\#endif} {}
code {fl_open_uri( url );} {}
}
class About_Dialog {open
} {
Function {About_Dialog( const char *logo_filename )} {} {
Function {About_Dialog( const char *logo_filename )} {open
} {
code {make_window( logo_filename );} {}
}
Function {run()} {return_type void
Function {run()} {open return_type void
} {
code {window->show();
@ -48,8 +41,9 @@ if ( logo_box->image() )
{
((Fl_Shared_Image*)logo_box->image())->release();
logo_box->image( 0 );
}} open
private xywh {1183 305 560 695} type Double xclass {Non-DAW} visible
}} open selected
private xywh {879 215 560 695} type Double
visible
} {
Fl_Tabs {} {open
xywh {0 352 558 296}
@ -59,14 +53,7 @@ if ( logo_box->image() )
xywh {2 386 553 261}
} {
Fl_Box credits {
label {Non-DAW was written from scratch by
Jonathan Moore Liles for his own use
(see the manual).
Nobody planned. Nobody helped.
You can help now by donating time, money,
and/or replacing the rest of Linux Audio
with fast, light, reliable alternatives.}
label {}
xywh {5 389 545 249} box ROUNDED_BOX color 46 labelsize 18
}
}
@ -89,7 +76,7 @@ You should have received a copy of the GNU General Public License along with thi
}
}
Fl_Box logo_box {
label VERSION selected
label VERSION
xywh {5 5 550 305} color 48 labelfont 1 labelsize 18 align 16
code0 {o->image( Fl_Shared_Image::get( logo_filename ) );}
code1 {o->label( VERSION );}

View File

@ -1,385 +0,0 @@
/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#pragma GCC diagnostic ignored "-Wchar-subscripts"
#include "Crystal_Boxtypes.H"
#include <FL/fl_draw.H>
#include <string.h>
/* Crystal boxes, base (obviously) on the FLTK1 'plastic' boxes, but
* without the rude color blending and with a slightly enhanced
* appearance. */
extern uchar *fl_gray_ramp();
inline Fl_Color
shade_color ( uchar gc, Fl_Color bc )
{
return fl_color_average( ( Fl_Color ) gc, bc, 0.25f );
}
static void
frame_rect ( int x, int y, int w, int h, const char *c, Fl_Color bc )
{
uchar *g = fl_gray_ramp();
int b = strlen( c ) / 4 + 1;
for ( x += b, y += b, w -= 2 * b, h -= 2 * b; b > 1; b-- )
{
// Draw lines around the perimeter of the button, 4 colors per
// circuit.
fl_color( shade_color( g[*c++], bc ) );
fl_line( x, y + h + b, x + w - 1, y + h + b, x + w + b - 1, y + h );
fl_color( shade_color( g[*c++], bc ) );
fl_line( x + w + b - 1, y + h, x + w + b - 1, y, x + w - 1, y - b );
fl_color( shade_color( g[*c++], bc ) );
fl_line( x + w - 1, y - b, x, y - b, x - b, y );
fl_color( shade_color( g[*c++], bc ) );
fl_line( x - b, y, x - b, y + h, x, y + h + b );
}
}
static void
frame_round ( int x, int y, int w, int h, const char *c, Fl_Color bc )
{
uchar *g = fl_gray_ramp();
int b = strlen( c ) / 4 + 1;
if ( ! Fl::draw_box_active() )
bc = fl_inactive( bc );
if ( w == h )
{
for ( ; b > 1; b--, x++, y++, w -= 2, h -= 2 )
{
fl_color( shade_color( g[*c++], bc ) );
fl_arc( x, y, w, h, 45.0, 135.0 );
fl_color( shade_color( g[*c++], bc ) );
fl_arc( x, y, w, h, 315.0, 405.0 );
fl_color( shade_color( g[*c++], bc ) );
fl_arc( x, y, w, h, 225.0, 315.0 );
fl_color( shade_color( g[*c++], bc ) );
fl_arc( x, y, w, h, 135.0, 225.0 );
}
}
else if ( w > h )
{
int d = h / 2;
for ( ; b > 1; d--, b--, x++, y++, w -= 2, h -= 2 )
{
fl_color( shade_color( g[*c++], bc ) );
fl_arc( x, y, h, h, 90.0, 135.0 );
fl_xyline( x + d, y, x + w - d );
fl_arc( x + w - h, y, h, h, 45.0, 90.0 );
fl_color( shade_color( g[*c++], bc ) );
fl_arc( x + w - h, y, h, h, 315.0, 405.0 );
fl_color( shade_color( g[*c++], bc ) );
fl_arc( x + w - h, y, h, h, 270.0, 315.0 );
fl_xyline( x + d, y + h - 1, x + w - d );
fl_arc( x, y, h, h, 225.0, 270.0 );
fl_color( shade_color( g[*c++], bc ) );
fl_arc( x, y, h, h, 135.0, 225.0 );
}
}
else if ( w < h )
{
int d = w / 2;
for ( ; b > 1; d--, b--, x++, y++, w -= 2, h -= 2 )
{
fl_color( shade_color( g[*c++], bc ) );
fl_arc( x, y, w, w, 45.0, 135.0 );
fl_color( shade_color( g[*c++], bc ) );
fl_arc( x, y, w, w, 0.0, 45.0 );
fl_yxline( x + w - 1, y + d, y + h - d );
fl_arc( x, y + h - w, w, w, 315.0, 360.0 );
fl_color( shade_color( g[*c++], bc ) );
fl_arc( x, y + h - w, w, w, 225.0, 315.0 );
fl_color( shade_color( g[*c++], bc ) );
fl_arc( x, y + h - w, w, w, 180.0, 225.0 );
fl_yxline( x, y + d, y + h - d );
fl_arc( x, y, w, w, 135.0, 180.0 );
}
}
}
static void
shade_rect ( int x, int y, int w, int h, const char *c, Fl_Color bc )
{
uchar *g = fl_gray_ramp();
int i, j;
int clen = strlen( c ) - 1;
int chalf = clen / 2;
int cstep = 1;
if ( ! Fl::draw_box_active() )
bc = fl_inactive( bc );
if ( h < ( w * 2 ) )
{
// Horizontal shading...
if ( clen >= h )
cstep = 2;
for ( i = 0, j = 0; j < chalf; i++, j += cstep )
{
// Draw the top line and points...
fl_color( shade_color( g[c[i]], bc ) );
fl_xyline( x + 1, y + i, x + w - 2 );
fl_color( shade_color( g[c[i] - 2], bc ) );
fl_point( x, y + i + 1 );
fl_point( x + w - 1, y + i + 1 );
// Draw the bottom line and points...
fl_color( shade_color( g[c[clen - i]], bc ) );
fl_xyline( x + 1, y + h - i, x + w - 2 );
fl_color( shade_color( g[c[clen - i] - 2], bc ) );
fl_point( x, y + h - i );
fl_point( x + w - 1, y + h - i );
}
// Draw the interior and sides...
i = chalf / cstep;
// fl_color( shade_color( g[c[chalf]], bc ) );
fl_color( bc );
fl_rectf( x + 1, y + i, w - 2, h - 2 * i + 1 );
fl_color( shade_color( g[c[chalf] - 2], bc ) );
fl_yxline( x, y + i, y + h - i );
fl_yxline( x + w - 1, y + i, y + h - i );
}
else
{
// Vertical shading...
if ( clen >= w )
cstep = 2;
for ( i = 0, j = 0; j < chalf; i++, j += cstep )
{
// Draw the left line and points...
fl_color( shade_color( g[c[i]], bc ) );
fl_yxline( x + i, y + 1, y + h - 1 );
fl_color( shade_color( g[c[i] - 2], bc ) );
fl_point( x + i + 1, y );
fl_point( x + i + 1, y + h );
// Draw the right line and points...
fl_color( shade_color( g[c[clen - i]], bc ) );
fl_yxline( x + w - 1 - i, y + 1, y + h - 1 );
fl_color( shade_color( g[c[clen - i] - 2], bc ) );
fl_point( x + w - 2 - i, y );
fl_point( x + w - 2 - i, y + h );
}
// Draw the interior, top, and bottom...
i = chalf / cstep;
fl_color( shade_color( g[c[chalf]], bc ) );
fl_rectf( x + i, y + 1, w - 2 * i, h - 1 );
fl_color( shade_color( g[c[chalf] - 2], bc ) );
fl_xyline( x + i, y, x + w - i );
fl_xyline( x + i, y + h, x + w - i );
}
}
static void
shade_round ( int x, int y, int w, int h, const char *c, Fl_Color bc )
{
uchar *g = fl_gray_ramp();
int i;
int clen = strlen( c ) - 1;
int chalf = clen / 2;
if ( w > h )
{
int d = h / 2;
const int na = 8;
for ( i = 0; i < chalf; i++, d--, x++, y++, w -= 2, h -= 2 )
{
fl_color( shade_color( g[c[i]], bc ) );
fl_pie( x, y, h, h, 90.0, 135.0 + i * na );
fl_xyline( x + d, y, x + w - d );
fl_pie( x + w - h, y, h, h, 45.0 + i * na, 90.0 );
fl_color( shade_color( g[c[i] - 2], bc ) );
fl_pie( x + w - h, y, h, h, 315.0 + i * na, 405.0 + i * na );
fl_color( shade_color( g[c[clen - i]], bc ) );
fl_pie( x + w - h, y, h, h, 270.0, 315.0 + i * na );
fl_xyline( x + d, y + h - 1, x + w - d );
fl_pie( x, y, h, h, 225.0 + i * na, 270.0 );
fl_color( shade_color( g[c[clen - i] - 2], bc ) );
fl_pie( x, y, h, h, 135.0 + i * na, 225.0 + i * na );
}
// fl_color( shade_color( g[c[chalf]], bc ) );
fl_color( bc );
fl_rectf( x + d, y, w - h + 1, h + 1 );
fl_pie( x, y, h, h, 90.0, 270.0 );
fl_pie( x + w - h, y, h, h, 270.0, 90.0 );
}
else
{
int d = w / 2;
const int na = 8;
for ( i = 0; i < chalf; i++, d--, x++, y++, w -= 2, h -= 2 )
{
fl_color( shade_color( g[c[i]], bc ) );
fl_pie( x, y, w, w, 45.0 + i * na, 135.0 + i * na );
fl_color( shade_color( g[c[i] - 2], bc ) );
fl_pie( x, y, w, w, 0.0, 45.0 + i * na );
fl_yxline( x + w - 1, y + d, y + h - d );
fl_pie( x, y + h - w, w, w, 315.0 + i * na, 360.0 );
fl_color( shade_color( g[c[clen - i]], bc ) );
fl_pie( x, y + h - w, w, w, 225.0 + i * na, 315.0 + i * na );
fl_color( shade_color( g[c[clen - i] - 2], bc ) );
fl_pie( x, y + h - w, w, w, 180.0, 225.0 + i * na );
fl_yxline( x, y + d, y + h - d );
fl_pie( x, y, w, w, 135.0 + i * na, 180.0 );
}
// fl_color( shade_color( g[c[chalf]], bc ) );
fl_color( bc );
fl_rectf( x, y + d, w + 1, h - w + 1 );
fl_pie( x, y, w, w, 0.0, 180.0 );
fl_pie( x, y + h - w, w, w, 180.0, 360.0 );
}
}
static void
up_frame ( int x, int y, int w, int h, Fl_Color c )
{
frame_rect( x, y, w, h - 1, "KLDIIJLM", c );
}
static void
narrow_thin_box ( int x, int y, int w, int h, Fl_Color c )
{
if ( h <= 0 || w <= 0 )
return;
uchar *g = fl_gray_ramp();
fl_color( shade_color( g['R'], c ) );
fl_rectf( x + 1, y + 1, w - 2, h - 2 );
fl_color( shade_color( g['I'], c ) );
if ( w > 1 )
{
fl_xyline( x + 1, y, x + w - 2 );
fl_xyline( x + 1, y + h - 1, x + w - 2 );
}
if ( h > 1 )
{
fl_yxline( x, y + 1, y + h - 2 );
fl_yxline( x + w - 1, y + 1, y + h - 2 );
}
}
static void
thin_up_box ( int x, int y, int w, int h, Fl_Color c )
{
if ( w > 4 && h > 4 )
{
shade_rect( x + 1, y + 1, w - 2, h - 3, "RQOQSUWQ", c );
frame_rect( x, y, w, h - 1, "IJLM", c );
}
else
narrow_thin_box( x, y, w, h, c );
}
static void
up_box ( int x, int y, int w, int h, Fl_Color c )
{
if ( w > 8 && h > 8 )
{
shade_rect( x + 1, y + 1, w - 2, h - 3, "RVQNOPQRSTUVWVQ", c );
// shade_rect( x + 1, y + 1, w - 2, h - 3, "STUVWVQRWXVUVVQ", c );
// shade_rect( x + 1, y + 1, w - 2, h - 3, "FISPPQQRSSTTUPJ", c );
frame_rect( x, y, w, h - 1, "IJLM", c );
}
else
thin_up_box( x, y, w, h, c );
}
static void
up_round ( int x, int y, int w, int h, Fl_Color c )
{
shade_round( x, y, w, h, "RVQNOPQRSTUVWVQ", c );
frame_round( x, y, w, h, "IJLM", c );
}
static void
down_frame ( int x, int y, int w, int h, Fl_Color c )
{
frame_rect( x, y, w, h - 1, "LLLLTTRR", c );
}
static void
down_box ( int x, int y, int w, int h, Fl_Color c )
{
if ( w > 6 && h > 6 )
{
// shade_rect( x + 2, y + 2, w - 4, h - 5, "STUVWWWVT", c );
fl_rectf( x + 2, y + 2, w - 4, h - 5 , fl_darker( c ) );
down_frame( x, y, w, h, c );
}
else
{
narrow_thin_box( x, y, w, h, c );
}
}
static void
down_round ( int x, int y, int w, int h, Fl_Color c )
{
shade_round( x, y, w, h, "STUVWWWVT", c );
frame_round( x, y, w, h, "IJLM", c );
}
void
init_crystal_boxtypes ( void )
{
/* replace the plastic boxes... (is there a better way?) */
Fl::set_boxtype( FL_PLASTIC_UP_BOX, up_box, 4,4,8,8 );
Fl::set_boxtype( FL_PLASTIC_DOWN_BOX, down_box, 2,2,4,4 );
Fl::set_boxtype( FL_PLASTIC_UP_FRAME, up_frame, 2,2,4,4 );
Fl::set_boxtype( FL_PLASTIC_DOWN_FRAME, down_frame, 2,2,4,4 );
Fl::set_boxtype( FL_PLASTIC_THIN_UP_BOX, thin_up_box, 1,1,2,2 );
Fl::set_boxtype( FL_PLASTIC_THIN_DOWN_BOX, down_box, 1,1,2,2 );
Fl::set_boxtype( FL_PLASTIC_ROUND_UP_BOX, up_round, 1,1,2,2 );
Fl::set_boxtype( FL_PLASTIC_ROUND_DOWN_BOX, down_round, 1,1,2,2 );
}

1
FL/FL
View File

@ -1 +0,0 @@
.

View File

@ -1,332 +0,0 @@
/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#include "Fl_Arc_Dial.H"
#include <FL/fl_draw.H>
#include <FL/Fl.H>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <algorithm>
int Fl_Arc_Dial::_default_style = Fl_Arc_Dial::PLASTIC_DIAL;
/** This simple box is suitable for use with knob-type widgets. It
* comprises a border with shadow, and a cap with glare-lines akin
* to those seen on burnished aluminum knobs. */
static void
burnished_oval_box ( int x, int y, int w, int h, Fl_Color c )
{
/* draw background */
fl_color( fl_darker( c ) );
fl_pie( x, y, w, h, 0, 360 );
fl_color( fl_darker( fl_darker( c ) ) );
fl_pie( x, y, w, h, 180 + 215, 180 + 45 );
/* shrink */
x += 4;
y += 4;
w -= 7;
h -= 7;
/* draw cap */
fl_color( c );
fl_pie( x, y, w, h, 0, 360 );
/* draw glare */
const int a1 = 10;
const int a2 = 90;
fl_color( fl_color_average( FL_WHITE, c, 0.15f ) );
fl_pie( x, y, w, h, a1, a2 );
fl_pie( x, y, w, h, 180 + a1, 180 + a2 );
fl_color( fl_color_average( FL_WHITE, c, 0.25f ) );
const int d = (a2 - a1) / 2;
fl_pie( x, y, w, h, a1 + (d / 2), a2 - (d / 2) );
fl_pie( x, y, w, h, 180 + a1 + (d / 2), 180 + a2 - (d / 2) );
}
void
Fl_Arc_Dial::draw_box ( void )
{
}
int
Fl_Arc_Dial::handle ( int m )
{
/* Fl_Dial and friends should really handle mousewheel, but they don't in FTLK1 */
switch ( m )
{
case FL_MOUSEWHEEL:
{
if ( this != Fl::belowmouse() )
return 0;
int steps = 16;
if ( Fl::event_ctrl() )
steps = 128;
float step = fabs( maximum() - minimum() ) / (float)steps;
float d = ((float)Fl::event_dy()) * step;
double v = value() + d;
if ( maximum() > minimum() )
{
if ( v < minimum() )
v = minimum();
else if ( v > maximum() )
v = maximum();
}
else
{
if ( v > minimum() )
v = minimum();
else if ( v < maximum() )
v = maximum();
}
value( v );
do_callback();
return 1;
}
}
int X, Y, S;
get_knob_dimensions ( &X, &Y, &S );
return Fl_Dial::handle( m, X, Y, S, S );
}
void
Fl_Arc_Dial::draw ( void )
{
int X, Y, S;
get_knob_dimensions ( &X, &Y, &S);
draw_box();
draw_label();
double angle = ( angle2() - angle1() ) * ( value() - minimum()) / ( maximum() - minimum() ) + angle1();
if ( type() == ARC_DIAL )
{
/* fl_line_style( FL_SOLID, 0 ); */
if ( type() == ARC_DIAL )
fl_draw_box( FL_ROUNDED_BOX, X, Y, S, S, color() );
/* shrink a bit */
X += S / 8.0;
Y += S / 8.0;
S -= S / 4;
fl_line_style( FL_SOLID, S / 6 );
/* background arc */
fl_color( fl_darker( color() ) );
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle2() );
/* foreground arc */
fl_color( selection_color() );
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle );
fl_line_style( FL_SOLID, 0 );
fl_color( fl_contrast( labelcolor(), color() ) );
}
else if ( type() == PLASTIC_DIAL || type() == BURNISHED_DIAL )
{
draw_knob();
draw_cursor( X, Y, S);
}
/* Some strange bug in FLTK prevents us from always been able to draw text
* here, so don't even try for now. */
/* char s[10]; */
/* fl_font( FL_HELVETICA, 8 ); */
/* snprintf( s, sizeof( s ), "%.1f", value() ); */
/* /\* fl_rectf( X, Y + S, S, 14, FL_BACKGROUND2_COLOR ); *\/ */
/* fl_color( FL_WHITE ); */
/* fl_draw( s, X, Y + S, S, 14, FL_ALIGN_CENTER ); */
}
void
Fl_Arc_Dial::get_knob_dimensions ( int *X, int *Y, int *S )
{
int ox, oy, ww, hh, side;
ox = x();
oy = y();
ww = w();
hh = h();
if (ww > hh)
{
side = hh;
ox = ox + (ww - side) / 2;
}
else
{
side = ww;
oy = oy + (hh - side) / 2;
}
side = w() > h() ? hh : ww;
*X = ox;
*Y = oy;
*S = side;
}
void
Fl_Arc_Dial::draw_cursor ( int ox, int oy, int side )
{
double angle;
// fl_color(fl_color_average(FL_BACKGROUND_COLOR, FL_BLACK, .7f));
angle = ( angle2() - angle1() ) * ( value() - minimum()) / ( maximum() - minimum() ) + angle1();
fl_color( fl_contrast( selection_color(), FL_BACKGROUND_COLOR ) );
fl_line_style( FL_SOLID, side / 8 );
const int d = 6;
/* account for edge conditions */
angle = angle < angle1() + d ? angle1() + d : angle;
angle = angle > angle2() - d ? angle2() - d : angle;
ox += side / 4;
oy += side / 4;
side -= side / 2;
fl_arc( ox, oy, side, side, 270 - (angle - d), 270 - (angle + d) );
fl_line_style( FL_SOLID, 0 );
}
void
Fl_Arc_Dial::draw_knob ( void )
{
int ox, oy, ww, hh, side;
get_knob_dimensions ( &ox, &oy, &side );
ww = w();
hh = h();
draw_label();
fl_clip(ox, oy, ww, hh);
// background
/* fl_color(FL_BACKGROUND_COLOR); */
/* fl_rectf(ox, oy, side, side); */
/* scale color */
fl_color(fl_color_average(color(), FL_BACKGROUND2_COLOR, .6));
fl_pie(ox + 1, oy + 3, side - 2, side - 12, 0, 360);
// scale
draw_scale(ox, oy, side);
Fl_Color c = active_r() ? fl_color_average(FL_BACKGROUND_COLOR, FL_WHITE, .7) : FL_INACTIVE_COLOR;
if ( type() == BURNISHED_DIAL )
{
burnished_oval_box( ox + 5, oy + 5, side - 12, side - 12, c );
}
else
{
fl_color(FL_BACKGROUND_COLOR);
fl_pie(ox + 6, oy + 6, side - 12, side - 12, 0, 360);
// shadow
fl_color(fl_color_average(FL_BACKGROUND_COLOR, FL_BLACK, .8f));
fl_pie(ox + 8, oy + 12, side - 16, side - 16, 0, 360);
fl_color(fl_color_average(FL_BACKGROUND_COLOR, FL_BLACK, .2f));
fl_pie(ox + 9, oy + 12, side - 18, side - 18, 0, 360);
// knob edge
fl_color( c);
fl_pie(ox + 8, oy + 8, side - 16, side - 16, 0, 360);
fl_color(fl_color_average(FL_BACKGROUND_COLOR, FL_WHITE, .6));
fl_pie(ox + 10, oy + 10, side - 20, side - 20, 0, 360);
}
fl_pop_clip();
}
void
Fl_Arc_Dial::draw_scale ( int ox, int oy, int side )
{
float x1, y1, x2, y2, rds, cx, cy, ca, sa;
rds = side / 2;
cx = ox + side / 2;
cy = oy + side / 2;
if (_scaleticks == 0)
return;
double a_step = (10.0 * 3.14159 / 6.0) / _scaleticks;
double a_orig = -(3.14159 / 3.0);
for (int a = 0; a <= _scaleticks; a++)
{
double na = a_orig + a * a_step;
ca = cos(na);
sa = sin(na);
x1 = cx + (rds) * ca;
y1 = cy - (rds) * sa;
x2 = cx + (rds - 6) * ca;
y2 = cy - (rds - 6) * sa;
fl_color(FL_BACKGROUND_COLOR);
fl_line(x1, y1, x2, y2);
}
}
void
Fl_Arc_Dial::scaleticks ( int tck )
{
_scaleticks = tck;
if (_scaleticks < 0)
_scaleticks = 0;
if (_scaleticks > 31)
_scaleticks = 31;
if (visible())
damage(FL_DAMAGE_ALL);
}

162
FL/Fl_Blink_Button.H Normal file
View File

@ -0,0 +1,162 @@
/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#pragma once
#include <FL/Fl_Button.H>
#include <FL/Fl.H>
/* Kind of like Fl_Light_Button except that the whole thing is the
* indicator and it can optionally blink */
class Fl_Blink_Button : public Fl_Button
{
bool _on;
int _blink_interval;
bool _blinking;
bool _ignore_input;
static void
update_cb ( void *v )
{
((Fl_Blink_Button*)v)->update_cb();
}
float
blink_interval_as_fraction_of_seceond ( void ) const
{
return (float)_blink_interval / 1000;
}
void
update_cb ( void )
{
Fl::repeat_timeout( blink_interval_as_fraction_of_seceond(), update_cb, this );
_on = ! _on;
redraw();
}
public:
enum
{
SLOW=500,
MEDIUM=300,
FAST=100,
DEFAULT=500
};
Fl_Blink_Button ( int X, int Y, int W, int H, const char *L=0 )
: Fl_Button( X, Y, W, H, L )
{
_blinking = true;
_on = false;
_ignore_input = false;
_blink_interval = DEFAULT;
type( FL_TOGGLE_BUTTON );
}
virtual
~Fl_Blink_Button ()
{
if ( value() )
Fl::remove_timeout( update_cb, this );
}
void ignore_input ( bool b )
{
_ignore_input = b;
}
bool ignore_input ( void ) const
{
return _ignore_input;
}
void blink ( bool b )
{
_blinking = b;
if ( ! b )
_on = true;
}
bool blink ( void ) const
{
return _blinking;
}
void
blink_interval ( float v )
{
_blink_interval = v * 1000;
if ( value() )
{
Fl::remove_timeout( update_cb, this );
Fl::add_timeout( blink_interval_as_fraction_of_seceond(), update_cb, this );
}
}
virtual void value ( float v )
{
bool b = v;
if ( b != value() )
{
if ( b )
{
if ( _blinking )
{
/* just to be safe.. */
Fl::remove_timeout( update_cb, this );
Fl::add_timeout( blink_interval_as_fraction_of_seceond(), update_cb, this );
}
Fl_Button::value( b );
redraw();
}
else
{
Fl_Button::value( b );
Fl::remove_timeout( update_cb, this );
redraw();
}
}
}
virtual float value ( void ) { return (bool)Fl_Button::value(); }
virtual void
draw ( void )
{
draw_box( value() ? box() : down_box(), x(), y(), w(), h(),
( value() != 0 && _on ) ? selection_color() : color() );
draw_label();
}
virtual int handle ( int m )
{
if ( _ignore_input )
return 0;
else
return Fl_Button::handle( m );
}
};

124
FL/Fl_DialX.C Normal file
View File

@ -0,0 +1,124 @@
/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#include "Fl_DialX.H"
#include <FL/Fl.H>
#include <FL/fl_draw.H>
void
Fl_DialX::draw ( void )
{
int X,Y,S;
int act = active_r();
{
int ox, oy, ww, hh, side;
ox = x();
oy = y();
ww = w();
hh = h();
if (ww > hh)
{
side = hh;
ox = ox + (ww - side) / 2;
}
else
{
side = ww;
oy = oy + (hh - side) / 2;
}
side = w() > h() ? hh : ww;
X = ox;
Y = oy;
S = side;
}
draw_box();
draw_label();
double angle = ( angle2() - angle1() ) * ( value() - minimum()) / ( maximum() - minimum() ) + angle1();
fl_draw_box( box(), X, Y, S, S, color() );
/* shrink a bit */
int OX = x();
int OY = y();
X += S / 8;
Y += S / 8;
int OS = S;
S -= S / 4;
fl_line_style( FL_SOLID, S / 12 );
/* background arc */
Fl_Color c = fl_darker( color() );
if ( !act )
c = fl_inactive( c );
fl_color( c );
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle2() );
/* foreground arc */
c = selection_color();
if ( !act )
c = fl_inactive( c );
fl_color(c);
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle );
fl_line_style( FL_SOLID, 0 );
if ( act )
{
int W = OS;
int H = OS;
fl_push_matrix();
fl_translate(OX+W/2, OY+H/2);
fl_scale(W, H);
fl_rotate(310+angle);
fl_color( fl_color_add_alpha( FL_WHITE, 127 ));
fl_begin_polygon(); fl_circle(-0.26, 0.26, 0.12); fl_end_polygon();
fl_color( FL_WHITE );
fl_begin_polygon(); fl_circle(-0.26, 0.26, 0.06); fl_end_polygon();
fl_pop_matrix();
}
fl_color( fl_contrast( labelcolor(), color() ) );
if ( Fl::belowmouse() == this )
{
char s[128];
fl_font( FL_HELVETICA, 9 );
char buf[128];
format(buf);
snprintf( s, sizeof( s ), buf, value() );
fl_color( FL_FOREGROUND_COLOR );
fl_draw( s, X, Y, S, S, FL_ALIGN_CENTER );
}
}

36
FL/Fl_DialX.H Normal file
View File

@ -0,0 +1,36 @@
/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#pragma once
#include <FL/Fl_Dial.H>
class Fl_DialX : public Fl_Dial
{
public:
Fl_DialX ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Dial(X,Y,W,H,L)
{
}
virtual void draw ( void );
virtual ~Fl_DialX() { }
};

View File

@ -41,7 +41,7 @@ public:
Fl_Flip_Button ( int X, int Y, int W, int H, const char *L = 0 ) :
Fl_Button( X, Y, W, H, 0 )
{
sscanf( L, "%a[^/]/%as", &_off, &_on );
sscanf( L, "%m[^/]/%ms", &_off, &_on );
type( FL_TOGGLE_BUTTON );
}

View File

@ -20,13 +20,16 @@
#pragma once
#include <FL/Fl_Group.H>
#include <FL/Fl_Pack.H>
class Fl_Flowpack : public Fl_Group
{
int _hspacing;
int _vspacing;
int _max_width;
bool _flow;
bool _flowdown;
int _initial_height;
int _initial_width;
public:
@ -34,15 +37,17 @@ public:
: Fl_Group( X, Y, W, H, L )
{
resizable( 0 );
_max_width = _hspacing = _vspacing = 0;
_hspacing = _vspacing = 0;
_initial_width = W;
_initial_height = H;
_flow = true;
_flowdown = false;
}
virtual ~Fl_Flowpack ( )
{
}
int max_width ( void ) const { return _max_width; }
void vspacing ( int v ) { _vspacing = v; }
int vspacing ( void ) const { return _vspacing; };
@ -53,6 +58,9 @@ public:
bool flow ( void ) const { return _flow; }
void flow ( bool v ) { _flow = v; }
bool flowdown ( void ) const { return _flowdown; }
void flowdown ( bool v ) { _flowdown = v; }
void
add ( Fl_Widget *w )
{
@ -68,36 +76,55 @@ public:
}
void
resize ( int X, int Y, int W, int )
resize ( int X, int Y, int W, int H )
{
Fl_Group::resize( X, Y, W, layout( W ) );
_initial_width = W;
_initial_height = H;
layout();
Fl_Group::resize( X, Y, w(), h() );
}
void
draw ( void )
{
dolayout();
layout();
Fl_Group::draw();
}
void dolayout ( void )
{
int new_h = layout( w() );
if ( new_h != h() )
size( w(), new_h );
layout();
}
int
layout ( int W )
void
layout ( void )
{
resizable( 0 );
int W;
int H;
int X = 0;
int Y = 0;
int H = 0;
int LW = 0;
int LH = 0;
int LX = 0;
int LY = 0;
int RH = 0;
// int RY = 0;
int CW = 0;
_max_width = 0;
if ( _flow )
{
H = 0;
W = 0;
}
else
{
H = _initial_height;
W = _initial_width;
}
for ( int i = 0; i < children(); ++i )
{
@ -105,28 +132,106 @@ public:
if ( ! o->visible() )
continue;
H = o->h() > H ? o->h() : H;
if ( _flow && X + o->w() >= W )
if ( _flow )
{
if ( _flowdown )
{
if ( Y + o->h() <= _initial_height )
{
/* if it'll fit in this column, put it below the previous widget */
X = LX;
}
else
{
Y = H;
CW = 0;
}
Y += H + _vspacing;
H = o->h();
X = 0;
CW = o->w() > CW ? o->w() : CW;
RH = Y + o->h() > RH ? Y + o->h() : RH;
}
else
{
if ( X + o->w() >= _initial_width )
{
/* maybe wrap to the next row */
H += RH + _vspacing;
// RY = Y;
RH = 0;
if ( X > W )
W = X;
X = 0;
}
else
{
/* otherwise, put it in the next column */
Y = H;
}
RH = o->h() > RH ? o->h() : RH;
}
}
/* avoid bothering the control with lots of resize() calls */
if ( ! ( o->x() == x() + X &&
o->y() == y() + Y ) )
o->position( x() + X, y() + Y );
LW = o->w();
LH = o->h();
X += o->w() + _hspacing;
LX = X;
LY = Y;
if ( X > _max_width )
_max_width = X;
if ( _flow )
{
if ( _flowdown )
{
Y += LH + _vspacing;
X += CW + _hspacing;
}
else
{
Y += RH + _vspacing;
X += LW + _hspacing;
}
}
else
{
if ( type() == Fl_Pack::HORIZONTAL )
{
X += LW + _hspacing;
LH = _initial_height;
W = X;
}
else
{
Y += LH + _vspacing;
LW = _initial_width;
H = Y;
}
}
if ( ! ( o->x() == x() + LX &&
o->y() == y() + LY &&
o->w() == LW &&
o->h() == LH ) )
o->resize( x() + LX,
y() + LY,
LW,
LH);
}
return Y + H;
if ( _flow )
{
H += RH;
if ( X > W )
W = X;
/* if ( _flowdown ) */
/* H = _initial_height; */
}
Fl_Group::resize( x(), y(), W, H );
}
};

View File

@ -49,18 +49,27 @@ public:
measure_label( o, W, H );
// set size to contain widget
size( W > o->w() ? W : o->w(), o->h() + H );
if ( o->align() & ( FL_ALIGN_TOP | FL_ALIGN_BOTTOM ) )
size( W > o->w() ? W : o->w(), o->h() + H );
if ( o->align() & ( FL_ALIGN_LEFT | FL_ALIGN_RIGHT ) )
size( o->w() + W, H > o->h() ? H : o->h() );
// center widget in group
if ( o->align() & FL_ALIGN_TOP )
o->position( x() + w() / 2 - (o->w() / 2 ), y() + H );
else if ( o->align() & FL_ALIGN_BOTTOM )
o->position( x() + w() / 2 - (o->w() / 2 ), y() );
else if ( o->align() & FL_ALIGN_RIGHT )
o->position( x(), y() );
else if ( o->align() & FL_ALIGN_LEFT )
o->position( x() + W, y() );
else
{
/* TODO: other alignments */
}
resizable(o);
init_sizes();
}
virtual ~Fl_Labelpad_Group ( )

View File

@ -32,7 +32,6 @@
class Fl_Packscroller : public Fl_Group
{
int _increment;
int _yposition;
static const int sbh = 15; /* scroll button height */
@ -43,7 +42,6 @@ public:
{
_increment = 30;
_yposition = 0;
// color( FL_WHITE );
}
@ -60,7 +58,8 @@ public:
if ( Y > 0 )
Y = 0;
const int H = h() - (sbh * 2);
const int H = h();
// - (sbh * 2);
Fl_Widget *o = child( 0 );
@ -89,88 +88,103 @@ public:
void bbox ( int &X, int &Y, int &W, int &H )
{
X = x();
Y = y() + sbh;
Y = y() + ( sbh * top_sb_visible() );
W = w();
H = h() - (sbh * 2);
H = h() - ( sbh * ( top_sb_visible() + bottom_sb_visible() ) );
}
int top_sb_visible ( void )
{
return children() && child(0)->y() != y() ? 1 : 0;
}
int bottom_sb_visible ( void )
{
if ( children() )
{
Fl_Widget *o = child( 0 );
if ( o->h() > h() && o->y() + o->h() != y() + h() )
return 1;
}
return 0;
}
virtual void
draw ( void )
{
if ( damage() & FL_DAMAGE_ALL )
{
fl_rectf( x(), y(), w(), h(), color() );
}
if ( ! children() )
return;
if ( ! fl_not_clipped( x(), y(), w(), h() ) )
return;
// draw_box();
Fl_Widget *o = child( 0 );
o->position( x(), y() + sbh + _yposition );
if ( damage() != FL_DAMAGE_CHILD )
{
fl_rectf( x(), y(), w(), h(), color() );
fl_font( FL_HELVETICA, 12 );
if ( o->y() != y() + sbh )
{
fl_draw_box( box(), x(), y(), w(), sbh, color() );
fl_color( FL_BLACK );
fl_draw( "@2<", x(), y(), w(), sbh, FL_ALIGN_CENTER );
}
if ( o->h() > h() - (sbh * 2) && o->y() + o->h() != y() + h() - sbh )
{
fl_draw_box( box(), x(), y() + h() - sbh, w(), sbh, color() );
fl_color( FL_BLACK );
fl_draw( "@2>", x(), y() + h() - sbh, w(), sbh, FL_ALIGN_CENTER );
}
}
fl_push_clip( x(), y() + sbh, w(), h() - (sbh * 2 ) );
o->position( x(), y() + _yposition );
const int top_sb = top_sb_visible();
const int bottom_sb = bottom_sb_visible();
fl_push_clip( x(), y() + ( sbh * top_sb ), w(), h() - (sbh * (top_sb + bottom_sb) ));
draw_children();
fl_pop_clip();
fl_font( FL_HELVETICA, 12 );
if ( top_sb )
{
fl_draw_box( box(), x(), y(), w(), sbh, color() );
fl_color( fl_contrast( FL_FOREGROUND_COLOR, color() ) );
fl_draw( "@2<", x(), y(), w(), sbh, FL_ALIGN_CENTER );
}
if ( bottom_sb )
{
fl_draw_box( box(), x(), y() + h() - sbh, w(), sbh, color() );
fl_color( fl_contrast( FL_FOREGROUND_COLOR, color() ) );
fl_draw( "@2>", x(), y() + h() - sbh, w(), sbh, FL_ALIGN_CENTER );
}
}
virtual int
handle ( int m )
{
if ( Fl_Group::handle( m ) )
return 1;
switch ( m )
{
case FL_PUSH:
{
if ( Fl::event_button1() )
if ( top_sb_visible() &&
Fl::event_inside( x(), y(), w(), sbh ) )
{
if ( Fl::event_inside( x(), y(), w(), sbh ) )
{
yposition( yposition() + ( h() / 4 ) );
return 1;
}
else if ( Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) )
{
yposition( yposition() - (h() / 4 ) );
return 1;
}
return 0;
return 1;
}
else if ( bottom_sb_visible() &&
Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) )
{
return 1;
}
break;
case FL_RELEASE:
{
if ( top_sb_visible() &&
Fl::event_inside( x(), y(), w(), sbh ) )
{
yposition( yposition() + ( h() / 4 ) );
return 1;
}
else if ( bottom_sb_visible() &&
Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) )
{
yposition( yposition() - (h() / 4 ) );
return 1;
}
break;
}
return 0;
case FL_ENTER:
case FL_LEAVE:
return 1;
case FL_FOCUS:
case FL_UNFOCUS:
return 1;
case FL_KEYBOARD:
{
if ( Fl::event_key() == FL_Up )
@ -183,7 +197,7 @@ public:
yposition( yposition() - (h() / 4 ) );
return 1;
}
return 0;
break;
}
case FL_MOUSEWHEEL:
{
@ -193,6 +207,6 @@ public:
}
}
return 0;
return Fl_Group::handle( m );
}
};

View File

@ -53,7 +53,24 @@ Fl_Scalepack::resize ( int X, int Y, int W, int H )
{
/* Fl_Group's resize will change our child widget sizes, which
interferes with our own resizing method. */
long dx = X - x();
long dy = Y - y();
bool r = W != w() || H != h();
Fl_Widget::resize( X, Y, W, H );
Fl_Widget*const* a = array();
for (int i=children(); i--;)
{
Fl_Widget* o = *a++;
o->position( o->x() + dx, o->y() + dy );
}
if ( r )
redraw();
}
void
@ -72,10 +89,7 @@ Fl_Scalepack::draw ( void )
if ( damage() & FL_DAMAGE_ALL )
{
if ( box() == FL_NO_BOX )
fl_rectf( x(), y(), w(), h(), FL_BACKGROUND_COLOR );
else
draw_box();
draw_box();
draw_label();
}

341
FL/Fl_SliderX.C Normal file
View File

@ -0,0 +1,341 @@
/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#include "Fl_SliderX.H"
#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include <math.h>
void
Fl_SliderX::draw ( int X, int Y, int W, int H)
{
slider_size( horizontal() ? H / (float)W : W / (float)H );
int act = active_r();
if (damage()&FL_DAMAGE_ALL) draw_box();
int ww = (horizontal() ? W : H);
int hh = (horizontal() ? H : W);
int xx, S;
xx = slider_position( value(), ww );
S = (horizontal() ? H : W );
int xsl, ysl, wsl, hsl;
if (horizontal()) {
xsl = X+xx;
wsl = S;
ysl = Y + hh/2;
hsl = hh/4;
} else {
ysl = Y+xx;
hsl = S;
xsl = X + hh/2;
wsl = hh/4;
}
{
fl_push_clip(X, Y, W, H);
draw_box();
fl_pop_clip();
}
//draw_bg(X, Y, W, H);
fl_line_style( FL_SOLID, hh/6 );
Fl_Color c = fl_darker(color());
if ( !act )
c = fl_inactive(c);
fl_color(c);
if ( horizontal() )
fl_line ( X + S/2, Y + hh/2, X + W - S/2, Y + hh/2 );
else
fl_line ( X + hh/2, Y + S/2, X + hh/2, Y + H - S/2 );
c = selection_color();
if ( !act )
c = fl_inactive(c);
fl_color( c );
if ( horizontal() )
fl_line ( X + S/2, ysl, xsl + S/2, ysl );
else
fl_line ( X + S/2, Y + H - S/2, xsl, ysl + (S/2) );
fl_line_style( FL_SOLID, 0 );
if ( act )
{
fl_push_matrix();
if ( horizontal() )
fl_translate( xsl + (hh/2), ysl);
else
fl_translate( xsl, ysl + (hh/2) );
fl_color( fl_color_add_alpha( FL_WHITE, 127 ));
fl_begin_polygon(); fl_circle(0.0,0.0, hh/3); fl_end_polygon();
fl_color( FL_WHITE );
fl_begin_polygon(); fl_circle(0.0,0.0, hh/6); fl_end_polygon();
fl_pop_matrix();
}
draw_label(xsl, ysl, wsl, hsl);
if (Fl::focus() == this) {
draw_focus();
}
/* draw(x()+Fl::box_dx(box()), */
/* y()+Fl::box_dy(box()), */
/* w()-Fl::box_dw(box()), */
/* h()-Fl::box_dh(box())); */
}
/** return a value between 0.0 and 1.0 which represents the current slider position. */
int
Fl_SliderX::slider_position ( double value, int w )
{
double A = minimum();
double B = maximum();
if (B == A) return 0;
bool flip = B < A;
if (flip) {A = B; B = minimum();}
// if (!horizontal()) flip = !flip;
// if both are negative, make the range positive:
if (B <= 0) {flip = !flip; double t = A; A = -B; B = -t; value = -value;}
double fraction;
if (!log()) {
// linear slider
fraction = (value-A)/(B-A);
} else if (A > 0) {
// logatithmic slider
if (value <= A) fraction = 0;
else fraction = (::log(value)-::log(A))/(::log(B)-::log(A));
} else if (A == 0) {
// squared slider
if (value <= 0) fraction = 0;
else fraction = sqrt(value/B);
} else {
// squared signed slider
if (value < 0) fraction = (1-sqrt(value/A))*.5;
else fraction = (1+sqrt(value/B))*.5;
}
if (flip) fraction = 1-fraction;
w -= int(slider_size()*w+.5); if (w <= 0) return 0;
if (fraction >= 1) return w;
else if (fraction <= 0) return 0;
else return int(fraction*w+.5);
}
double
Fl_SliderX::slider_value ( int X, int w )
{
w -= int(slider_size()*w+.5); if (w <= 0) return minimum();
double A = minimum();
double B = maximum();
bool flip = B < A;
if (flip) {A = B; B = minimum();}
// if (!horizontal()) flip = !flip;
if (flip) X = w-X;
double fraction = double(X)/w;
if (fraction <= 0) return A;
if (fraction >= 1) return B;
// if both are negative, make the range positive:
flip = (B <= 0);
if (flip) {double t = A; A = -B; B = -t; fraction = 1-fraction;}
double value;
double derivative;
if (!log()) {
// linear slider
value = fraction*(B-A)+A;
derivative = (B-A)/w;
} else if (A > 0) {
// log slider
double d = (::log(B)-::log(A));
value = exp(fraction*d+::log(A));
derivative = value*d/w;
} else if (A == 0) {
// squared slider
value = fraction*fraction*B;
derivative = 2*fraction*B/w;
} else {
// squared signed slider
fraction = 2*fraction - 1;
if (fraction < 0) B = A;
value = fraction*fraction*B;
derivative = 4*fraction*B/w;
}
// find nicest multiple of 10,5, or 2 of step() that is close to 1 pixel:
if (step() && derivative > step()) {
double w = log10(derivative);
double l = ceil(w);
int num = 1;
int i; for (i = 0; i < l; i++) num *= 10;
int denom = 1;
for (i = -1; i >= l; i--) denom *= 10;
if (l-w > 0.69897) denom *= 5;
else if (l-w > 0.30103) denom *= 2;
value = floor(value*denom/num+.5)*num/denom;
}
if (flip) return -value;
return value;
}
int Fl_SliderX::handle(int event, int X, int Y, int W, int H) {
// Fl_Widget_Tracker wp(this);
switch (event) {
case FL_PUSH: {
Fl_Widget_Tracker wp(this);
if (!Fl::event_inside(X, Y, W, H)) return 0;
handle_push();
if (wp.deleted()) return 1; }
// fall through ...
case FL_DRAG: {
static int offcenter;
int ww = (horizontal() ? W : H);
if ( event == FL_PUSH )
{
int x = slider_position( value(), ww );
offcenter = (horizontal() ? (Fl::event_x()-X) - x : (Fl::event_y()-Y) - x );
}
try_again:
int mx = (horizontal() ? Fl::event_x()-X : Fl::event_y()-Y) - offcenter;
double v = slider_value( mx, ww );
if (event == FL_PUSH ) // && v == value()) {
{
int os = int(slider_size()*ww+0.5)/2;
if ( abs( offcenter ) > os )
{
offcenter = os;
event = FL_DRAG;
goto try_again;
}
}
handle_drag(clamp(v));
} return 1;
case FL_RELEASE:
handle_release();
return 1;
case FL_KEYBOARD:
{ Fl_Widget_Tracker wp(this);
switch (Fl::event_key()) {
case FL_Up:
if (horizontal()) return 0;
handle_push();
if (wp.deleted()) return 1;
handle_drag(clamp(increment(value(),-1)));
if (wp.deleted()) return 1;
handle_release();
return 1;
case FL_Down:
if (horizontal()) return 0;
handle_push();
if (wp.deleted()) return 1;
handle_drag(clamp(increment(value(),1)));
if (wp.deleted()) return 1;
handle_release();
return 1;
case FL_Left:
if (!horizontal()) return 0;
handle_push();
if (wp.deleted()) return 1;
handle_drag(clamp(increment(value(),-1)));
if (wp.deleted()) return 1;
handle_release();
return 1;
case FL_Right:
if (!horizontal()) return 0;
handle_push();
if (wp.deleted()) return 1;
handle_drag(clamp(increment(value(),1)));
if (wp.deleted()) return 1;
handle_release();
return 1;
default:
return 0;
}
}
// break not required because of switch...
case FL_FOCUS :
case FL_UNFOCUS :
if (Fl::visible_focus()) {
redraw();
return 1;
} else return 0;
case FL_ENTER :
case FL_LEAVE :
return 1;
case FL_MOUSEWHEEL :
{
if ( this != Fl::belowmouse() )
return 0;
if (Fl::e_dy==0)
return 0;
const int steps = Fl::event_ctrl() ? 128 : 16;
const float step = fabs( maximum() - minimum() ) / (float)steps;
int dy = Fl::e_dy;
/* slider is in 'upside down' configuration, invert meaning of mousewheel */
if ( minimum() > maximum() )
dy = 0 - dy;
handle_drag(clamp(value() + step * dy));
return 1;
}
default:
return 0;
}
}
int Fl_SliderX::handle(int event) {
if (event == FL_PUSH && Fl::visible_focus()) {
Fl::focus(this);
redraw();
}
return handle(event,
x()+Fl::box_dx(box()),
y()+Fl::box_dy(box()),
w()-Fl::box_dw(box()),
h()-Fl::box_dh(box()));
}

50
FL/Fl_SliderX.H Normal file
View File

@ -0,0 +1,50 @@
/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#pragma once
#include <FL/Fl_Slider.H>
class Fl_SliderX : public Fl_Slider
{
bool _log;
public:
void log ( bool v ) { _log = v; }
bool log ( void ) const { return _log; }
Fl_SliderX( int X, int Y, int W, int H, const char *L=0 ) : Fl_Slider(X,Y,W,H,L)
{
_log = 0;
}
virtual ~Fl_SliderX ( ) { };
virtual int slider_position ( double value, int w );
virtual double slider_value ( int X, int w );
virtual void draw ( int X, int Y, int W, int H );
virtual void draw ( void ) { draw(x(),y(),w(),h()); }
virtual int handle(int event, int X, int Y, int W, int H);
virtual int handle(int event);
};

View File

@ -22,14 +22,15 @@
/* Just like an Fl_Input, except that when not being edited it
* displays just like a label. */
#include <FL/fl_draw.H>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Input.H>
class Fl_Sometimes_Input : public Fl_Input
{
Fl_Boxtype _up_box;
char *_text;
public:
@ -38,7 +39,7 @@ public:
{
clear_visible_focus();
up_box( FL_NO_BOX );
when(FL_WHEN_ENTER_KEY_ALWAYS);
when(FL_WHEN_ENTER_KEY);
}
void up_box ( Fl_Boxtype b ) { _up_box = b; }
@ -52,7 +53,11 @@ public:
else
{
fl_draw_box( up_box(), x(), y(), w(), h(), color() );
fl_color( fl_contrast( textcolor(), color() ) );
Fl_Color c = textcolor();// fl_contrast( textcolor(), color() );
fl_color( active_r() ? c : fl_inactive( c ) );
fl_font( textfont(), textsize() );
fl_draw( value(), x(), y(), w(), h(), (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_CLIP) );
}
@ -69,26 +74,52 @@ public:
virtual int
handle ( int m )
{
int r = Fl_Input::handle( m );
int r = 0;
switch ( m )
{
case FL_KEYDOWN:
{
if ( ( Fl::event_key() == FL_Enter ||
Fl::event_key() == FL_Tab ) )
{
do_callback();
free( _text );
Fl::focus( NULL );
r = 1;
}
else if ( Fl::event_key() == FL_Escape )
{
value( _text );
Fl::focus( NULL );
r = 1;
}
break;
}
case FL_FOCUS:
_text = strdup( value() );
redraw();
return 1;
r = 1;
break;
case FL_UNFOCUS:
_text = NULL;
redraw();
r = 1;
break;
case FL_PUSH:
take_focus();
redraw();
return 1;
case FL_UNFOCUS:
if ( window() )
window()->damage( FL_DAMAGE_EXPOSE, x(), y(), w(), h() );
redraw();
return r;
r = 1;
break;
case FL_DND_ENTER:
return 0;
case FL_PASTE:
return 0;
default:
return r;
break;
}
return Fl_Input::handle( m ) | r;
}
};

76
FL/Fl_Sometimes_Pack.H Normal file
View File

@ -0,0 +1,76 @@
/*******************************************************************************/
/* Copyright (C) 2012 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#pragma once
#include <FL/Fl_Pack.H>
class Fl_Sometimes_Pack : public Fl_Pack
{
bool _pack;
public:
Fl_Sometimes_Pack ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Pack(X,Y,W,H,L)
{
_pack = true;
}
virtual ~Fl_Sometimes_Pack ( )
{
}
void pack ( bool b )
{
if ( b != _pack )
redraw();
_pack = b;
}
bool pack ( void ) const
{
return _pack;
}
virtual void draw ( void )
{
/* draw_box(); */
if ( _pack )
{
Fl_Pack::draw();
}
else
{
if ( children() )
{
for ( int i = 0; i < children(); i++ )
{
Fl_Widget *o = child( i );
o->resize( x(),y(),w(), o->h() );
}
resize( x(), y(), w(), child(0)->h() );
}
Fl_Group::draw();
}
}
};

View File

@ -1,20 +1,21 @@
# data file for the Fltk User Interface Designer (fluid)
version 1.0108
version 1.0300
header_name {.H}
code_name {.C}
decl {\#include <string.h>} {}
decl {\#include <string.h>} {private local
}
widget_class Fl_Text_Edit_Window {open selected
xywh {375 272 355 410} type Double resizable
widget_class Fl_Text_Edit_Window {open
xywh {377 295 355 410} type Double resizable
code0 {this->size_range( 0, 0, 400, 400 );}
class Fl_Window modal visible
class Fl_Double_Window modal visible
} {
Fl_Box title_box {
label {<title>}
xywh {5 7 345 45}
xywh {5 7 345 28}
}
Fl_Text_Editor text_editor {
xywh {5 58 345 320} resizable
Fl_Text_Editor text_editor {selected
xywh {5 37 345 341} resizable
code0 {o->buffer( new Fl_Text_Buffer );}
}
Fl_Group {} {open
@ -33,13 +34,15 @@ widget_class Fl_Text_Edit_Window {open selected
}
}
Function {fl_text_edit( const char *title, const char *button_text, const char *initial_text )} {open C return_type {char *}
Function {fl_text_edit( const char *title, const char *button_text, const char *initial_text, int W = 355, int H = 410 )} {open C return_type {char *}
} {
code {Fl_Text_Edit_Window tew( 355, 410, title );
tew.size( W, H );
tew.return_button->label( button_text );
tew.title_box->label( title );
tew.text_editor->buffer()->text( initial_text );
if ( initial_text )
tew.text_editor->buffer()->text( initial_text );
tew.show();

View File

@ -20,89 +20,215 @@
#include "Fl_Value_SliderX.H"
int Fl_Value_SliderX::_default_style = NICE_SLIDER;
#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include <math.h>
void
Fl_Value_SliderX::draw ( void )
{
switch ( _default_style )
{
case NICE_SLIDER:
void Fl_Value_SliderX::input_cb(Fl_Widget*, void* v) {
Fl_Value_SliderX& t = *(Fl_Value_SliderX*)v;
double nv;
if ((t.step() - floor(t.step()))>0.0 || t.step() == 0.0)
nv = strtod(t.input.value(), 0);
else
nv = strtol(t.input.value(), 0, 0);
if (nv != t.value() || t.when() & FL_WHEN_NOT_CHANGED) {
if ( ! t.soft())
nv = t.clamp(nv);
t.set_value(nv);
t.set_changed();
if (t.when())
{
if ( FL_HORIZONTAL == _type )
Fl_Value_Slider::type( FL_HOR_NICE_SLIDER );
else
Fl_Value_Slider::type( FL_VERT_NICE_SLIDER );
break;
}
case FILL_SLIDER:
{
if ( FL_HORIZONTAL == _type )
Fl_Value_Slider::type( FL_HOR_FILL_SLIDER );
else
Fl_Value_Slider::type( FL_VERT_FILL_SLIDER );
break;
}
case SIMPLE_SLIDER:
{
if ( FL_HORIZONTAL == _type )
Fl_Value_Slider::type( FL_HOR_SLIDER );
else
Fl_Value_Slider::type( FL_VERT_SLIDER );
break;
t.value_damage();
t.do_callback();
}
}
}
Fl_Value_Slider::draw();
void Fl_Value_SliderX::value_damage() {
char buf[128];
format(buf);
input.value(buf);
input.mark(input.position()); // turn off selection highlight
redraw();
}
int
Fl_Value_SliderX::handle ( int m )
Fl_Value_SliderX::~Fl_Value_SliderX ( void )
{
if (input.parent() == (Fl_Group *)this)
input.parent(0); // *revert* ctor kludge!
}
/* Fl_Value_Slider and friends should really handle mousewheel, but they don't in FTLK1 */
/**
Creates a new Fl_Value_SliderX widget using the given
position, size, and label string. The default boxtype is FL_DOWN_BOX.
*/
Fl_Value_SliderX::Fl_Value_SliderX(int X, int Y, int W, int H, const char*l)
: Fl_SliderX(X,Y,W,H,l),input(X, Y, W, H, 0) {
step(1,100);
soft_ = 0;
if (input.parent()) // defeat automatic-add
input.parent()->remove(input);
input.parent((Fl_Group *)this); // kludge!
input.callback(input_cb, this);
input.when(FL_WHEN_ENTER_KEY);
align(FL_ALIGN_LEFT);
value_damage();
textsize(9);
set_flag(SHORTCUT_LABEL);
switch ( m )
{
case FL_MOUSEWHEEL:
{
if ( this != Fl::belowmouse() )
return 0;
}
int steps = 16;
void Fl_Value_SliderX::draw() {
if ( Fl::event_ctrl() )
steps = 128;
int sxx = x(), syy = y(), sww = w(), shh = h();
int bxx = x(), byy = y(), bww = w(), bhh = h();
if (horizontal()) {
input.resize(x(), y(), 35, h());
bww = 35; sxx += 35; sww -= 35;
} else {
input.resize(x(), y(), w(), 25 );
syy += 25; bhh = 25; shh -= 25;
}
if (damage()&FL_DAMAGE_ALL) draw_box(box(),sxx,syy,sww,shh,color());
Fl_SliderX::draw(sxx+Fl::box_dx(box()),
syy+Fl::box_dy(box()),
sww-Fl::box_dw(box()),
shh-Fl::box_dh(box()));
draw_box(box(),bxx,byy,bww,bhh,color());
float step = fabs( maximum() - minimum() ) / (float)steps;
if (damage()&~FL_DAMAGE_CHILD) input.clear_damage(FL_DAMAGE_ALL);
input.box(box());
input.color(color(), selection_color());
Fl_Widget *i = &input; i->draw(); // calls protected input.draw()
input.clear_damage();
}
float d = ((float)Fl::event_dy()) * step;
int Fl_Value_SliderX::handle(int event) {
if (event == FL_PUSH && Fl::visible_focus()) {
Fl::focus(this);
redraw();
}
double v = value() + d;
int sxx = x(), syy = y(), sww = w(), shh = h();
if (horizontal()) {
sxx += 35; sww -= 35;
} else {
syy += 25; shh -= 25;
}
if ( maximum() > minimum() )
{
if ( v < minimum() )
v = minimum();
else if ( v > maximum() )
v = maximum();
}
double v;
int delta;
int mx = Fl::event_x_root();
static int ix, drag;
// input.when(when());
switch (event) {
case FL_ENTER:
return 1;
case FL_LEAVE:
if ( ! drag )
fl_cursor( FL_CURSOR_DEFAULT );
return 1;
case FL_MOVE:
if ( drag || Fl::event_inside( &input ) )
fl_cursor( FL_CURSOR_WE );
else
fl_cursor( FL_CURSOR_DEFAULT );
return 1;
case FL_PUSH:
// if (!step()) goto DEFAULT;
if ( Fl::event_inside(&input) )
{
if ( v > minimum() )
v = minimum();
else if ( v < maximum() )
v = maximum();
input.handle(event);
ix = mx;
drag = Fl::event_button();
handle_push();
return 1;
}
goto DEFAULT;
break;
case FL_DRAG:
{
if ( ! drag )
goto DEFAULT;
fl_cursor( FL_CURSOR_WE );
// if (!step()) goto DEFAULT;
delta = mx-ix;
if (!horizontal())
delta = -delta;
if (delta > 5) delta -= 5;
else if (delta < -5) delta += 5;
else delta = 0;
float S = fabs( maximum() - minimum() );
switch (drag) {
case 3: v = previous_value() + ( S * delta * 0.0100f); break;
case 2: v = previous_value() + ( S * delta * 0.0010f); break;
default:v = previous_value() + ( S * delta * 0.0005f); break;
}
value( v );
do_callback();
v = round(v);
v = soft()?softclamp(v):clamp(v);
handle_drag(v);
value_damage();
return 1;
}
case FL_RELEASE:
if ( ! drag )
goto DEFAULT;
// if (!step()) goto DEFAULT;
if (value() != previous_value() || !Fl::event_is_click())
handle_release();
drag = 0;
fl_cursor( FL_CURSOR_DEFAULT );
/* else { */
/* Fl_Widget_Tracker wp(&input); */
/* input.handle(FL_PUSH); */
/* if (wp.exists()) */
/* input.handle(FL_RELEASE); */
/* } */
return 1;
case FL_FOCUS:
return input.take_focus();
case FL_UNFOCUS:
{
input_cb(&input,this);
return 1;
}
case FL_PASTE:
return 0;
case FL_SHORTCUT:
return input.handle(event);
}
return Fl_Value_Slider::handle( m );
DEFAULT:
int r = Fl_SliderX::handle(event,
sxx+Fl::box_dx(box()),
syy+Fl::box_dy(box()),
sww-Fl::box_dw(box()),
shh-Fl::box_dh(box()));
if ( r )
{
return r;
}
else
{
input.type(((step() - floor(step()))>0.0 || step() == 0.0) ? FL_FLOAT_INPUT : FL_INT_INPUT);
return input.handle(event);
}
}

View File

@ -17,42 +17,84 @@
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
/* just like an Fl_Value_Slider, except that it responds to mousewheel events */
#ifndef Fl_Value_SliderX_H
#define Fl_Value_SliderX_H
#pragma once
#include "Fl_SliderX.H"
#include <FL/Fl_Input.H>
#include <FL/Fl_Value_Slider.H>
#include <FL/Fl.H>
#include <math.h>
/**
The Fl_Value_SliderX widget is a Fl_SliderX widget
with a box displaying the current value.
<P ALIGN=CENTER>\image html value_slider.png
\image latex value_slider.png "Fl_Value_SliderX" width=4cm
*/
class FL_EXPORT Fl_Value_SliderX : public Fl_SliderX {
/* This is the encapsulated Fl_input attribute to which
this class delegates the value font, color and shortcut */
Fl_Input input;
class Fl_Value_SliderX : public Fl_Value_Slider
{
static int _default_style;
int _type;
private:
char soft_;
static void input_cb(Fl_Widget*,void*);
virtual void value_damage(); // cause damage() due to value() changing
protected:
void draw();
public:
int handle(int);
Fl_Value_SliderX(int x,int y,int w,int h, const char *l = 0);
virtual ~Fl_Value_SliderX ( );
enum
{
NICE_SLIDER,
SIMPLE_SLIDER,
FILL_SLIDER
};
static void default_style ( int n ) { Fl_Value_SliderX::_default_style = n; }
int type ( void ) const { return _type; }
void type ( int v ) { _type = v; }
Fl_Value_SliderX ( int X, int Y, int W, int H, const char *L = 0 )
: Fl_Value_Slider( X, Y, W, H, L )
{
}
virtual ~Fl_Value_SliderX() { }
virtual int handle ( int m );
virtual void draw ( void );
/** See void Fl_Value_Input::soft(char s) */
void soft(char s) {soft_ = s;}
/**
If "soft" is turned on, the user is allowed to drag
the value outside the range. If they drag the value to one of
the ends, let go, then grab again and continue to drag, they can
get to any value. The default is true.
*/
char soft() const {return soft_;}
/**
Returns the current shortcut key for the Input.
\see Fl_Value_Input::shortcut(int)
*/
int shortcut() const {return input.shortcut();}
/**
Sets the shortcut key to \p s. Setting this
overrides the use of '&' in the label(). The value is a bitwise
OR of a key and a set of shift flags, for example FL_ALT | 'a'
, FL_ALT | (FL_F + 10), or just 'a'. A value
of 0 disables the shortcut.
The key can be any value returned by
Fl::event_key(), but will usually be an ASCII letter. Use
a lower-case letter unless you require the shift key to be held down.
The shift flags can be any set of values accepted by
Fl::event_state(). If the bit is on that shift key must
be pushed. Meta, Alt, Ctrl, and Shift must be off if they are not in
the shift flags (zero for the other bits indicates a "don't care"
setting).
*/
void shortcut(int s) {input.shortcut(s);}
/** Gets the typeface of the text in the value box. */
Fl_Font textfont() const {return input.textfont();}
/** Sets the typeface of the text in the value box. */
void textfont(Fl_Font s) {input.textfont(s);}
/** Gets the size of the text in the value box. */
Fl_Fontsize textsize() const {return input.textsize();}
/** Sets the size of the text in the value box. */
void textsize(Fl_Fontsize s) {input.textsize(s);}
/** Gets the color of the text in the value box. */
Fl_Color textcolor() const {return input.textcolor();}
/** Sets the color of the text in the value box.*/
void textcolor(Fl_Color n) {input.textcolor(n);}
/** Gets the color of the text cursor. The text cursor is black by default. */
Fl_Color cursor_color() const {return input.cursor_color();}
/** Sets the color of the text cursor. The text cursor is black by default. */
void cursor_color(Fl_Color n) {input.cursor_color(n);}
};
#endif

View File

@ -1,180 +0,0 @@
/*******************************************************************************/
/* Copyright (C) 2012 Jonathan Moore Liles */
/* Copyright (C) 2001-2005 by Colin Jones */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
/* Taken from the "Gleam" FLTK scheme, as modified by prodatum */
#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include "Gleam_Boxtypes.H"
static void gleam_color(Fl_Color c)
{
if (Fl::draw_box_active())
fl_color(c);
else
fl_color(fl_inactive(c));
}
static void frame_rect(int x, int y, int w, int h, Fl_Color bc)
{
// Draw the outline around the perimeter of the box
fl_color(fl_color_average(FL_BLACK, FL_BACKGROUND_COLOR, .1));
fl_line(x, y, x + w, y);
fl_line(x + w, y, x + w, y + h);
fl_line(x + w, y + h, x, y + h);
fl_line(x, y + h, x, y);
}
static void shade_rect_up(int x, int y, int w, int h, Fl_Color bc)
{
// Draws the shiny
float third = (float) h / 3;
gleam_color(bc);
fl_rectf(x, y, w, third + 1);
//gleam_color(fl_color_average(bc, FL_WHITE, .90f));
//fl_rectf(x, y, w, half + 1);
float step_size = 0.10 / ((float) h - third);
int j = 0;
//step_size = (.1 / (float) half);
//printf("1 / %i = %f \n", half, (1.0/half));
/**
* This loop generates the nice gradient at the bottom of the
* widget
**/
for (float k = 1; k >= .90; k -= step_size)
{
j++;
gleam_color(fl_color_average(bc, FL_WHITE, k));
fl_line(x, y + j + third - 1, x + w - 1, y + j + third - 1);
}
}
static void frame_rect_up(int x, int y, int w, int h, Fl_Color bc)
{
// Draw the outline around the perimeter of the box
gleam_color(bc);
fl_line(x, y, x + w, y); //Go across.
fl_line(x, y + (h / 2), x, y + 1); //Go to top
fl_line(x + w, y + (h / 2), x + w, y + 1); //Go to top
gleam_color(fl_darker(bc));
fl_line(x, y + h, x + w, y + h); //Go across again!
fl_line(x, y + (h / 2), x, y + h - 1); //Go to top
fl_line(x + w, y + (h / 2), x + w, y + h - 1); //Go to top
}
static void frame_rect_down(int x, int y, int w, int h, Fl_Color bc)
{
// Draw the outline around the perimeter of the box
gleam_color(fl_darker(bc));
fl_line(x, y, x + w, y); //Go across.
fl_line(x, y + (h / 2), x, y + 1); //Go to top
fl_line(x + w, y + (h / 2), x + w, y + 1); //Go to top
//gleam_color(bc);
fl_line(x, y + h, x + w, y + h); //Go across again!
fl_line(x, y + (h / 2), x, y + h - 1); //Go to top
fl_line(x + w, y + (h / 2), x + w, y + h - 1); //Go to top
}
static void shade_rect_down(int x, int y, int w, int h, Fl_Color bc)
{
gleam_color(bc);
Fl_Color color = fl_color();
fl_rectf(x, y, w, h);
gleam_color(fl_color_average(bc, fl_darker(color), 0.65));
fl_line(x, y + 1, x + w, y + 1);
fl_line(x, y + 1, x, y + h - 2);
gleam_color(fl_color_average(bc, fl_darker(color), 0.85));
fl_line(x + 1, y + 2, x + w, y + 2);
fl_line(x + 1, y + 2, x + 1, y + h - 2);
}
static void up_frame(int x, int y, int w, int h, Fl_Color c)
{
frame_rect_up(x, y, w - 1, h - 1, fl_darker(c));
}
static void thin_up_box(int x, int y, int w, int h, Fl_Color c)
{
shade_rect_up(x + 1, y, w - 2, h - 1, c);
frame_rect(x + 1, y + 1, w - 3, h - 3, fl_color_average(c, FL_WHITE, .25f));
frame_rect_up(x, y, w - 1, h - 1, fl_darker(c));
}
static void up_box(int x, int y, int w, int h, Fl_Color c)
{
shade_rect_up(x + 1, y, w - 2, h - 1, c);
frame_rect_up(x, y, w - 1, h - 1, fl_darker(c));
//draw the inner rect.
frame_rect(x + 1, y + 1, w - 3, h - 3, fl_color_average(c, FL_WHITE, .25f));
}
static void down_frame(int x, int y, int w, int h, Fl_Color c)
{
frame_rect_down(x, y, w - 1, h - 1, fl_darker(c));
}
static void down_box(int x, int y, int w, int h, Fl_Color c)
{
shade_rect_down(x + 1, y, w - 2, h, c);
down_frame(x, y, w, h, fl_darker(c));
//draw the inner rect.
//frame_rect(x + 1, y + 1, w - 3, h - 3, fl_color_average(c, FL_BLACK, .65));
}
static void thin_down_box(int x, int y, int w, int h, Fl_Color c)
{
down_box(x, y, w, h, c);
}
void
init_gleam_boxtypes ( void )
{
/* replace the gtk+ boxes... (is there a better way?) */
Fl::set_boxtype( FL_GTK_UP_BOX, up_box, 2,2,4,4 );
Fl::set_boxtype( FL_GTK_DOWN_BOX, down_box, 2,2,3,3 );
Fl::set_boxtype( FL_GTK_THIN_UP_BOX, up_box, 2,2,3,3 );
Fl::set_boxtype( FL_GTK_THIN_DOWN_BOX, down_box, 2,2,3,3 );
Fl::set_boxtype( FL_GTK_UP_FRAME, up_frame, 2,2,3,3 );
Fl::set_boxtype( FL_GTK_DOWN_FRAME, down_frame, 2,2,3,3 );
/* Fl::set_boxtype( FL_GTK_THIN_UP_BOX, thin_up_box, 1,1,1,1 ); */
/* Fl::set_boxtype( FL_GTK_THIN_DOWN_BOX, thin_down_box, 1,1,1,1 ); */
Fl::set_boxtype( FL_GTK_ROUND_UP_BOX, up_box, 2,2,3,3 );
Fl::set_boxtype( FL_GTK_ROUND_DOWN_BOX, down_box, 2,2,3,3 );
}

View File

@ -1,115 +0,0 @@
###############################################################################
# Copyright (C) 2008 Jonathan Moore Liles #
# #
# This program is free software; you can redistribute it and/or modify it #
# under the terms of the GNU General Public License as published by the #
# Free Software Foundation; either version 2 of the License, or (at your #
# option) any later version. #
# #
# This program is distributed in the hope that it will be useful, but WITHOUT #
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
# more details. #
# #
# You should have received a copy of the GNU General Public License along #
# with This program; see the file COPYING. If not,write to the Free Software #
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
###############################################################################
## Makefile for the Non-DAW.
##
## Do not edit this file; run `make config` instead.
##
VERSION := 1.0.0
PACKAGE := FL
all: .config
.config: configure
@ echo '<<< Configuring '$(PACKAGE)
@ ./configure
config:
@ echo '<<< Configuring '$(PACKAGE)
@ ./configure
-include .config
export SYSTEM_PATH:=$(prefix)/share/
export DOCUMENT_PATH:=$(prefix)/share/doc/
export PIXMAP_PATH:=$(prefix)/share/pixmaps/
# a bit of a hack to make sure this runs before any rules
ifneq ($(CALCULATING),yes)
TOTAL := $(shell $(MAKE) CALCULATING=yes -n 2>/dev/null | sed -n 's/^.*Compiling: \([^"]\+\)"/\1/p' > .files )
endif
ifeq ($(USE_DEBUG),yes)
CFLAGS := -pipe -ggdb -fno-inline -Wall -Wextra -O0
CXXFLAGS := -Wnon-virtual-dtor -Wno-missing-field-initializers -fno-rtti -fno-exceptions
else
CFLAGS := -pipe -O2 -DNDEBUG
CXXFLAGS := -fno-rtti -fno-exceptions
endif
CFLAGS+=-DVERSION=\"$(VERSION)\" \
-DINSTALL_PREFIX=\"$(prefix)\" \
-DSYSTEM_PATH=\"$(SYSTEM_PATH)\" \
-DDOCUMENT_PATH=\"$(DOCUMENT_PATH)\" \
-DPIXMAP_PATH=\"$(PIXMAP_PATH)\"
CXXFLAGS += $(SNDFILE_CFLAGS) $(FLTK_CFLAGS) $(JACK_CFLAGS)
CXXFLAGS := $(CFLAGS) $(CXXFLAGS)
INCLUDES := -I. -Iutil -IFL -Inonlib
include scripts/colors
ifneq ($(CALCULATING),yes)
COMPILING="$(BOLD)$(BLACK)$(PACKAGE) [$(SGR0)$(CYAN)`scripts/percent-complete .files "$<"`$(SGR0)$(BOLD)$(BLACK)]$(SGR0) $(BOLD)$(YELLOW)$<$(SGR0)"
else
COMPILING="Compiling: $<"
endif
.C.o:
@ echo $(COMPILING)
@ $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
%.C : %.fl
@ cd `dirname $<` && fluid -c ../$<
DONE := $(BOLD)$(GREEN)done$(SGR0)
include makefile.inc
SRCS:=$(FL_SRCS)
OBJS:=$(FL_OBJS)
# FIXME: isn't there a better way?
$(OBJS): .config Makefile
TAGS: $(SRCS)
etags $(SRCS)
.deps: .config $(SRCS)
ifneq ($(CALCULATING),yes)
@ echo -n Calculating dependencies...
@ makedepend -f- -- $(CXXFLAGS) $(INCLUDES) -- $(SRCS) 2>/dev/null > .deps && echo $(DONE)
@ # gcc -M $(CXXFLAGS) $(INCLUDES) $(SRCS) > .deps && echo $(DONE)
endif
clean_deps:
@ rm -f .deps
install:
@ echo ...
.PHONEY: clean config depend clean_deps
clean: FL_clean
-include .deps

View File

@ -54,17 +54,17 @@ while ( _window->shown() )
Function {make_window()} {open
} {
Fl_Window _window {
label {New Project} open
xywh {762 252 550 195} type Double hide modal xclass Non_DAW
label {New Project} open selected
xywh {743 696 550 105} type Double modal visible
} {
Fl_File_Input _name {
label {Named:}
xywh {75 140 375 35}
xywh {75 55 375 35}
}
Fl_Button {} {
label Browse
callback {_directory->value( fl_dir_chooser( "Directory for new project", NULL, 0 ) );}
xywh {455 100 80 35}
xywh {455 15 80 35}
}
Fl_Return_Button {} {
label Create
@ -83,7 +83,7 @@ while ( _window->shown() )
_window->hide();
}}
xywh {455 140 80 35}
xywh {455 55 80 35}
}
Fl_File_Input _directory {
label {Where:}
@ -95,36 +95,18 @@ while ( _window->shown() )
}
// write_line( user_config_dir, "default_path", o->value() );}
xywh {75 100 375 35}
xywh {75 15 375 35}
code0 {\#include <FL/filename.H>}
code1 {char *v = NULL;}
code2 {// read_line( user_config_dir, "default_path", &v );}
code3 {o->value( v );}
}
Fl_Box {} {
label {New Project}
xywh {15 8 520 33} box RSHADOW_BOX color 133 labelsize 20 labelcolor 32
}
Fl_Choice _template {
label {Template:} open
private xywh {310 60 225 25} down_box BORDER_BOX
} {
MenuItem {} {
label Default selected
xywh {0 0 40 25}
}
}
}
}
decl {char *path;} {public local
}
decl {char *_default_path} {private local
}
Function {templates( const char **templates )} {open return_type void
} {
code {for ( const char **s = templates; *s; ++s )
_template->add( *s );} {}
}
Function {default_path( char *s )} {open return_type void
} {
code {_default_path = s;} {}
@ -133,23 +115,18 @@ while ( _window->shown() )
} {
code {return _default_path;} {}
}
Function {selected_template()} {open return_type {const char *}
} {
code {return _template->text( _template->value() );} {}
}
}
Function {new_project_chooser( const char **templates, char **default_path, char **selected_template )} {open C return_type {char*}
Function {new_project_chooser( char **default_path)} {open C return_type {char*}
} {
code {New_Project_Dialog nsd;
nsd.templates( templates );
nsd.default_path( *default_path );
nsd.run();
*default_path = strdup( nsd.default_path() );
*selected_template = strdup( nsd.selected_template() );
if ( nsd.default_path() )
*default_path = nsd.default_path();
return nsd.path;} {}
}

View File

@ -1,81 +0,0 @@
/*******************************************************************************/
/* Copyright (C) 2010 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#include "color_scheme.H"
#include <FL/Fl.H>
#include <string.h>
static Fl_Color system_colors[3];
void
get_system_colors ( void )
{
Fl::get_system_colors();
system_colors[ 0 ] = (Fl_Color)Fl::get_color( FL_BACKGROUND_COLOR );
system_colors[ 1 ] = (Fl_Color)Fl::get_color( FL_FOREGROUND_COLOR );
system_colors[ 2 ] = (Fl_Color)Fl::get_color( FL_BACKGROUND2_COLOR );
}
void
color_scheme ( const char *name )
{
if ( !strcasecmp( name, "gray" ) )
{
Fl::background2( 127, 127, 127 );
Fl::background( 100, 100, 100 );
Fl::foreground( 255, 255, 255 );
}
if ( !strcasecmp( name, "dark" ) )
{
Fl::background2( 100, 100, 100 );
Fl::background( 50, 50, 50 );
Fl::foreground( 255, 255, 255 );
}
else if ( !strcasecmp( name, "light" ))
{
Fl::background2( 192, 192, 192 );
Fl::background( 220, 220, 220 );
Fl::foreground( 0, 0, 0 );
}
if ( !strcasecmp( name, "very dark" ) )
{
Fl::background2( 100, 100, 100 );
Fl::background( 20, 20, 20 );
Fl::foreground( 240, 240, 240 );
}
else if ( !strcasecmp( name, "system" ) )
{
unsigned char r, g, b;
Fl::get_color( system_colors[ 0 ], r, g, b );
Fl::background( r, g, b );
Fl::get_color( system_colors[ 1 ], r, g, b );
Fl::foreground( r, g, b );
Fl::get_color( system_colors[ 2 ], r, g, b );
Fl::background2( r, g, b );
}
Fl::scheme( Fl::scheme() );
}

21
FL/configure vendored
View File

@ -1,21 +0,0 @@
#!/bin/sh
#
# Copyright (C) 2008 Jonathan Moore Liles
# This file is licensed under version 2 of the GPL.
. scripts/config-funcs
begin
begin_options
ask "Build for debugging" USE_DEBUG no
begin_tests
require_FLTK 1.1.7 images
require_command FLUID fluid
require_command ar ar
require_command makedepend makedepend
end

103
FL/focus_frame.C Normal file
View File

@ -0,0 +1,103 @@
/*******************************************************************************/
/* Copyright (C) 2012 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#include <FL/Fl.H>
#include <FL/fl_draw.H>
void
draw_focus_frame ( int x, int y, int w, int h, Fl_Color c )
{
fl_push_clip( x, y, w, h );
// fl_color( fl_color_average( FL_GRAY, c, 0.50 ) );
/* fl_color( fl_color_add_alpha( c, 100 ) ); */
/* fl_line_style( FL_DASH, 2 ); */
/* fl_rect( x, y, w, h ); */
fl_line_style( FL_SOLID, 3 );
fl_color( c );
int l = 15;
fl_line( x, y, x + l, y );
fl_line( x, y + l, x, y );
fl_line( x + w - 1, y, x + w - l - 1, y );
fl_line( x + w - 1, y, x + w - 1, y + l - 1 );
fl_line( x, y + h - 1, x, y + h - l - 1);
fl_line( x, y + h - 1, x + l, y + h - 1 );
fl_line( x + w - 1, y + h - 1, x + w - 1, y + h - l - 1 );
fl_line( x + w - 1, y + h - 1, x + w - l, y + h - 1 );
fl_line_style( FL_SOLID, 0 );
fl_pop_clip();
}
void
draw_selection_frame ( int x, int y, int w, int h, Fl_Color c )
{
fl_push_clip( x, y, w, h );
fl_color( fl_color_average( FL_GRAY, c, 0.50 ) );
/// fl_color( fl_color_add_alpha( c, 100 ) );
fl_line_style( FL_DASH, 2 );
fl_rect( x, y, w, h );
fl_line_style( FL_SOLID, 3 );
fl_color( c );
int l = 15;
fl_line( x, y, x + l, y );
fl_line( x, y + l, x, y );
fl_line( x + w - 1, y, x + w - l - 1, y );
fl_line( x + w - 1, y, x + w - 1, y + l - 1 );
fl_line( x, y + h - 1, x, y + h - l - 1);
fl_line( x, y + h - 1, x + l, y + h - 1 );
fl_line( x + w - 1, y + h - 1, x + w - 1, y + h - l - 1 );
fl_line( x + w - 1, y + h - 1, x + w - l, y + h - 1 );
fl_line_style( FL_SOLID, 0 );
fl_pop_clip();
}
bool
focused_r ( Fl_Widget *w )
{
for ( Fl_Widget *p = Fl::focus(); p; p = p->parent() )
if ( p == w )
return true;
return false;
}

View File

@ -1,6 +1,6 @@
/*******************************************************************************/
/* Copyright (C) 2010 Jonathan Moore Liles */
/* Copyright (C) 2012 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
@ -17,5 +17,6 @@
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
void color_scheme ( const char *name );
void get_system_colors ( void );
void draw_focus_frame ( int x, int y, int w, int h, Fl_Color c );
void draw_selection_frame ( int x, int y, int w, int h, Fl_Color c );
bool focused_r ( Fl_Widget *w );

View File

@ -0,0 +1,61 @@
/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
static unsigned char img_io_input_connector_10x10_png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a,
0x08, 0x06, 0x00, 0x00, 0x00, 0x8d, 0x32, 0xcf, 0xbd, 0x00, 0x00, 0x00,
0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64,
0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00,
0x9e, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x22, 0xcb, 0xc6, 0x03, 0x00, 0x00,
0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63,
0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00,
0x00, 0x01, 0x51, 0x49, 0x44, 0x41, 0x54, 0x18, 0x95, 0x3d, 0xd0, 0xb1,
0x6a, 0xdb, 0x40, 0x1c, 0xc0, 0xe1, 0x9f, 0x72, 0x7f, 0xcc, 0x21, 0xbc,
0xc5, 0x87, 0xb0, 0xb7, 0x18, 0x6c, 0xa8, 0x49, 0x37, 0x1b, 0x8c, 0x26,
0xdb, 0x19, 0xfb, 0x0e, 0x7e, 0x82, 0xee, 0x21, 0x53, 0xe9, 0x14, 0x42,
0x37, 0x37, 0x7b, 0x9e, 0xa2, 0x63, 0x07, 0x6b, 0xd6, 0xec, 0xc5, 0xe0,
0x80, 0xc1, 0x08, 0xac, 0x66, 0xf0, 0xa0, 0xb3, 0x90, 0x4e, 0xa7, 0x4e,
0xed, 0xf6, 0xcd, 0x5f, 0xd0, 0xb6, 0x2d, 0x00, 0xfb, 0xfd, 0xfe, 0x4b,
0x59, 0x96, 0x8f, 0x4d, 0xd3, 0xdc, 0x01, 0x4e, 0x44, 0xf2, 0x30, 0x0c,
0x9f, 0x86, 0xc3, 0xe1, 0x6f, 0x80, 0xa0, 0x6d, 0x5b, 0x76, 0xbb, 0xdd,
0xb7, 0xf3, 0xf9, 0xfc, 0x35, 0x4d, 0xd3, 0x5e, 0x96, 0x65, 0x78, 0xef,
0x19, 0x0c, 0x06, 0x4c, 0xa7, 0xd3, 0x8f, 0x28, 0x8a, 0x7e, 0x4e, 0x26,
0x93, 0xef, 0x6a, 0xbd, 0x5e, 0x3f, 0x9c, 0x4e, 0xa7, 0x1f, 0x49, 0x92,
0xf4, 0x2e, 0x97, 0x0b, 0xdb, 0xed, 0x96, 0xe3, 0xf1, 0x88, 0x31, 0x86,
0x2c, 0xcb, 0x42, 0x63, 0xcc, 0x7d, 0x5d, 0xd7, 0xbb, 0x1b, 0x6b, 0xed,
0x73, 0x9a, 0xa6, 0xb7, 0x00, 0x4a, 0x29, 0x44, 0x04, 0x11, 0x41, 0x29,
0x05, 0x40, 0x9a, 0xa6, 0xbd, 0xb2, 0x2c, 0x1f, 0xc5, 0x39, 0x67, 0xac,
0xb5, 0x78, 0xef, 0x09, 0x82, 0x80, 0xd5, 0x6a, 0x45, 0x10, 0x04, 0xb4,
0x6d, 0x8b, 0x73, 0x8e, 0xa2, 0x28, 0x68, 0x9a, 0xe6, 0x4e, 0x00, 0xf1,
0xde, 0x93, 0x24, 0x09, 0x45, 0x51, 0x10, 0xc7, 0x31, 0x22, 0x42, 0x92,
0x24, 0x68, 0xad, 0x59, 0x2e, 0x97, 0x00, 0xee, 0x46, 0x29, 0xf5, 0xde,
0xed, 0x76, 0xb9, 0x5e, 0xaf, 0x78, 0xef, 0xa9, 0xaa, 0x8a, 0xaa, 0xaa,
0xfe, 0x5b, 0x6b, 0x8d, 0x88, 0xe4, 0xa2, 0xb5, 0x7e, 0x99, 0xcd, 0x66,
0x9f, 0xf2, 0x3c, 0xef, 0x59, 0x6b, 0x31, 0xc6, 0x00, 0x10, 0xc7, 0x31,
0x9d, 0x4e, 0x87, 0xf9, 0x7c, 0xfe, 0x11, 0x86, 0xe1, 0x93, 0xda, 0x6c,
0x36, 0x7b, 0x6b, 0x6d, 0xd8, 0xef, 0xf7, 0x3f, 0x5b, 0x6b, 0xc3, 0xba,
0xae, 0x01, 0x30, 0xc6, 0xb0, 0x58, 0x2c, 0xfe, 0x44, 0x51, 0xf4, 0x3a,
0x1e, 0x8f, 0xdf, 0x82, 0x7f, 0xe1, 0x87, 0xc3, 0xe1, 0xc1, 0x5a, 0xfb,
0xec, 0x9c, 0x33, 0x80, 0x28, 0xa5, 0xde, 0xb5, 0xd6, 0x2f, 0xa3, 0xd1,
0xe8, 0x17, 0xc0, 0x5f, 0xd1, 0x17, 0xa6, 0x12, 0x83, 0xc3, 0x30, 0x9b,
0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
};
static unsigned int img_io_input_connector_10x10_png_len = 468;

View File

@ -0,0 +1,63 @@
/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
static unsigned char img_io_output_connector_10x10_png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a,
0x08, 0x06, 0x00, 0x00, 0x00, 0x8d, 0x32, 0xcf, 0xbd, 0x00, 0x00, 0x00,
0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64,
0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00,
0x9e, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x22, 0xcb, 0xc6, 0x03, 0x00, 0x00,
0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63,
0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00,
0x00, 0x01, 0x61, 0x49, 0x44, 0x41, 0x54, 0x18, 0x95, 0x35, 0xd0, 0xbf,
0x6a, 0xc2, 0x40, 0x00, 0x07, 0xe0, 0xdf, 0xfd, 0x89, 0xe4, 0x32, 0xc4,
0x40, 0xed, 0x22, 0x9c, 0x50, 0x24, 0x99, 0x1c, 0xdc, 0x33, 0x38, 0x64,
0xec, 0x03, 0x14, 0x9c, 0xd4, 0xb9, 0x7b, 0xe9, 0x54, 0x3a, 0x95, 0xd2,
0xb1, 0x1d, 0x74, 0xeb, 0xe4, 0xec, 0xd2, 0x31, 0x01, 0x9f, 0x40, 0x04,
0xe9, 0x10, 0x85, 0x06, 0x1c, 0x6d, 0x40, 0x34, 0xe4, 0xd0, 0x0b, 0x5e,
0xa7, 0x7e, 0x8f, 0xf0, 0x11, 0x63, 0x0c, 0x00, 0x60, 0xbd, 0x5e, 0xdf,
0x96, 0x65, 0xf9, 0xa0, 0xb5, 0xbe, 0x21, 0x84, 0x54, 0x9c, 0xf3, 0x9d,
0x10, 0xe2, 0x31, 0x08, 0x82, 0x18, 0x00, 0x88, 0x31, 0x06, 0xab, 0xd5,
0xea, 0x69, 0xbb, 0xdd, 0xde, 0x27, 0x49, 0xd2, 0xb0, 0x6d, 0x1b, 0x8c,
0x31, 0x14, 0x45, 0x81, 0x28, 0x8a, 0x72, 0x29, 0xe5, 0x7b, 0xa7, 0xd3,
0x79, 0x66, 0xfd, 0x7e, 0x3f, 0xca, 0xb2, 0xec, 0x6d, 0x36, 0x9b, 0x35,
0x84, 0x10, 0x18, 0x8d, 0x46, 0xe8, 0x76, 0xbb, 0x58, 0x2e, 0x97, 0x58,
0x2c, 0x16, 0x4e, 0xb3, 0xd9, 0xec, 0x00, 0xf8, 0xa6, 0x4a, 0xa9, 0x97,
0x38, 0x8e, 0xaf, 0x00, 0x40, 0x6b, 0x8d, 0xf3, 0xf9, 0x8c, 0xd3, 0xe9,
0x04, 0xad, 0x35, 0x00, 0x20, 0x49, 0x92, 0x46, 0x59, 0x96, 0x0f, 0xbc,
0xaa, 0xaa, 0xeb, 0xe3, 0xf1, 0x08, 0xc6, 0x18, 0x2e, 0x97, 0x0b, 0xc6,
0xe3, 0x31, 0x8c, 0x31, 0xa0, 0x94, 0xa2, 0x56, 0xab, 0xe1, 0x70, 0x38,
0x40, 0x6b, 0x7d, 0xc3, 0x8d, 0x31, 0x9c, 0x52, 0x8a, 0xe1, 0x70, 0x08,
0xcf, 0xf3, 0x30, 0x9d, 0x4e, 0xa1, 0xb5, 0xc6, 0x60, 0x30, 0x40, 0x51,
0x14, 0x98, 0x4c, 0x26, 0x20, 0x84, 0x54, 0xd4, 0xb2, 0xac, 0x1f, 0xd7,
0x75, 0xe1, 0xba, 0x2e, 0x38, 0xe7, 0x70, 0x1c, 0x07, 0x42, 0x08, 0x30,
0xc6, 0x60, 0xdb, 0x36, 0x3c, 0xcf, 0x03, 0xe7, 0x7c, 0x47, 0xd2, 0x34,
0xbd, 0xdd, 0x6c, 0x36, 0x9f, 0xf3, 0xf9, 0xbc, 0x51, 0xaf, 0xd7, 0x91,
0x65, 0x19, 0x00, 0xa0, 0xd5, 0x6a, 0x41, 0x29, 0x85, 0x30, 0x0c, 0xf3,
0x76, 0xbb, 0x7d, 0x47, 0x7d, 0xdf, 0xff, 0x92, 0x52, 0x7e, 0xf4, 0x7a,
0xbd, 0x3c, 0xcf, 0x73, 0xfc, 0xdb, 0xef, 0xf7, 0x08, 0xc3, 0xf0, 0x57,
0x4a, 0xf9, 0x1e, 0x04, 0x41, 0x4c, 0xfe, 0xc3, 0xd3, 0x34, 0x8d, 0x94,
0x52, 0x2f, 0x55, 0x55, 0x5d, 0x1b, 0x63, 0xb8, 0x65, 0x59, 0x3f, 0x8e,
0xe3, 0xbc, 0xfa, 0xbe, 0xff, 0x05, 0x00, 0x7f, 0xb0, 0xa3, 0x9e, 0x20,
0x9c, 0xde, 0x99, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
0xae, 0x42, 0x60, 0x82
};
static unsigned int img_io_output_connector_10x10_png_len = 484;

1
FL/lib Symbolic link
View File

@ -0,0 +1 @@
../lib

View File

@ -1,20 +0,0 @@
# -*- mode: makefile; -*-
all: FL
FL_SRCS := $(wildcard FL/*.C FL/*.fl)
FL_SRCS:=$(FL_SRCS:.fl=.C)
FL_SRCS:=$(sort $(FL_SRCS))
FL_OBJS:=$(FL_SRCS:.C=.o)
all: FL/libfl_widgets.a
FL/libfl_widgets.a: $(FL_OBJS)
@ ar rcs $@ $(FL_OBJS)
.PHONEY: FL
FL: FL/libfl_widgets.a
FL_clean:
rm -f $(FL_OBJS) FL/libfl_widgets.a

View File

@ -18,7 +18,7 @@
/*******************************************************************************/
class Fl_Menu_;
class Fl_Menu_Item;
struct Fl_Menu_Item;
class Fl_Widget;
bool menu_popup ( Fl_Menu_ *m, int X, int Y );

View File

@ -1 +0,0 @@
../scripts

View File

@ -31,8 +31,10 @@ test_press ( unsigned long e )
if ( Fl::event_text()[0] )
((char *)Fl::event_text())[0] = '\0';
if ( ! ( e & FL_SHIFT ) )
return Fl::test_shortcut( e ) && ! Fl::event_shift();
const int mod_mask = FL_SHIFT | FL_ALT | FL_CTRL;
if ( ( e & mod_mask ) != ( Fl::event_state() & mod_mask ) )
return false;
else
return Fl::test_shortcut( e );
}

163
FL/util/ntk-perf.C Normal file
View File

@ -0,0 +1,163 @@
/*******************************************************************************/
/* Copyright (C) 2012 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Single_Window.H>
#include <FL/Fl_Pack.H>
#include <FL/Fl_Choice.H>
#include <FL/fl_draw.H>
#include <sys/time.h>
#include <stdio.h>
static Fl_Boxtype boxtype = FL_UP_BOX;
#include <unistd.h>
unsigned long long tv_to_ts ( timeval *tv )
{
return tv->tv_sec * 1e6 + tv->tv_usec;
}
unsigned long long get_ts ( void )
{
struct timeval then;
gettimeofday( &then, NULL );
return tv_to_ts( &then );
}
class PerfTest : public Fl_Widget
{
public:
PerfTest ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Widget( X, Y, W, H, L )
{
align(FL_ALIGN_TOP | FL_ALIGN_RIGHT |FL_ALIGN_INSIDE);
box(FL_UP_BOX);
labelcolor( FL_WHITE );
use_cairo = false;
}
bool use_cairo;
void draw ( void )
{
if ( use_cairo )
fl_push_use_cairo(true);
fl_rectf( x(), y(), w(), h(), FL_BLACK );
unsigned long long then = get_ts();
fl_push_clip( x(), y(), w(), h() );
int count = 400;
/* draw stuff */
int i = 0;
for ( ; i < count; ++i )
fl_draw_box( boxtype, x(), y(), w(), h(), fl_lighter( FL_BLACK ) );
fl_pop_clip();
unsigned long long now = get_ts();
double elapsedms = (now - then) / 1000.0;
static char text[256];
sprintf( text, "Drew %i boxes in in %fms", i, elapsedms );
fl_color( FL_RED );
fl_draw( text, x(), y(), w(), h(), FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
draw_label();
if ( use_cairo )
fl_pop_use_cairo();
}
};
void
boxtype_cb ( Fl_Widget *w, void *v )
{
const char *picked = ((Fl_Choice*)w)->mvalue()->label();
if ( !strcmp( picked, "UP_BOX" ) )
boxtype = FL_UP_BOX;
else if ( !strcmp( picked, "FLAT_BOX" ) )
boxtype = FL_FLAT_BOX;
else if ( !strcmp( picked, "ROUNDED_BOX" ) )
boxtype = FL_ROUNDED_BOX;
else if ( !strcmp( picked, "OVAL_BOX" ) )
boxtype = FL_OVAL_BOX;
w->window()->redraw();
}
int
main ( int argc, char **argv )
{
{
Fl_Single_Window *w = new Fl_Single_Window( 800, 600 );
{ Fl_Choice *o = new Fl_Choice( 0, 0, 200, 24, "Boxtype" );
o->align( FL_ALIGN_RIGHT );
o->callback( boxtype_cb, NULL );
o->add( "UP_BOX" );
o->add( "FLAT_BOX" );
o->add( "ROUNDED_BOX" );
o->add( "OVAL_BOX" );
}
{
Fl_Pack *o = new Fl_Pack( 0, 24, 800, 600 - 24 );
o->type( 0 );
{
PerfTest *o = new PerfTest( 0,0, 800, 400, "Xlib" );
}
{
PerfTest *o = new PerfTest( 0,0, 800, 400, "Cairo" );
o->use_cairo = true;
}
o->end();
}
w->end();
w->show();
}
/* { */
/* Fl_Single_Window *w = new Fl_Single_Window( 800, 600 ); */
/* PerfTest *o = new PerfTest( 0,0, 800, 600 ); */
/* w->end(); */
/* w->show(); */
/* } */
Fl::run();
}

29
FL/wscript Normal file
View File

@ -0,0 +1,29 @@
#!/usr/bin/env python
def options(opt):
pass
def configure(conf):
pass
def build(bld):
bld.stlib(
source =
'''
About_Dialog.fl
Fl_Menu_Settings.C
Fl_Scalepack.C
Fl_Text_Edit_Window.fl
Fl_Value_SliderX.C
Fl_DialX.C
Fl_SliderX.C
New_Project_Dialog.fl
event_name.C
menu_popup.C
test_press.C
focus_frame.C
''',
includes = '.',
export_incdirs = [ '.' 'FL' ],
uselib = 'PTHREAD NTK',
target = 'fl_widgets')

View File

@ -1,32 +0,0 @@
###############################################################################
# Copyright (C) 2008 Jonathan Moore Liles #
# #
# This program is free software; you can redistribute it and/or modify it #
# under the terms of the GNU General Public License as published by the #
# Free Software Foundation; either version 2 of the License, or (at your #
# option) any later version. #
# #
# This program is distributed in the hope that it will be useful, but WITHOUT #
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
# more details. #
# #
# You should have received a copy of the GNU General Public License along #
# with This program; see the file COPYING. If not,write to the Free Software #
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
###############################################################################
SUBDIRS=nonlib FL timeline mixer session-manager
all:
@ for dir in $(SUBDIRS); do $(MAKE) -s -C $$dir; done
clean:
@ for dir in $(SUBDIRS); do $(MAKE) -s -C $$dir clean; done
install:
@ for dir in $(SUBDIRS); do $(MAKE) -s -C $$dir install; done
config:
@ for dir in $(SUBDIRS); do $(MAKE) -s -C $$dir config; done

51
README.build Normal file
View File

@ -0,0 +1,51 @@
# -*- mode: org -*-
* Non-things build instructions
This repository contains all of the non-* software.
** Getting NTK
If you just cloned the non repository or just executed git pull, then
you should also run
git submodule update --init
to pull down the latest NTK code required by Non. Git does *not* do
this automatically.
** Building NTK
If you don't have NTK installed system-wide (which isn't very likely
yet) you *MUST* begin the build process by typing:
cd lib/ntk
./waf configure
./waf
Once NTK has been built you must install it system-wide before
attempting to build the non-* programs.
To install NTK type:
su -c './waf install'
** Build all projects
Typing:
./waf configure
./waf
su -c './waf install'
from the base of the checkout of the Non git repository will build and
install all of the non-* programs together.
** Build a single project
Typing:
./waf configure --project=[timline|sequencer|mixer|session-manager]
./waf
su -c './waf install'

View File

@ -1,8 +1,10 @@
# -*- mode: org -*-
Notes to packagers: Non-Mixer, Non-DAW, and Non-Session-Manager,
although stored in the same repository, are completely independent
programs which can be built and packaged separately by descending into
their respective sub-directories.
* Notes to Packagers
Non-Mixer, Non-DAW, and Non-Session-Manager, although stored in the
same repository, are completely independent programs which can be
built and packaged separately (see README.build)
If you're having trouble adapting to Non's build system, please
contact me directly or post to one of the Non mailing lists with your
@ -23,3 +25,4 @@ Thanks,
Jonathan Moore Liles <male@tuxfamily.net>
P.S. Furthermore, please quit listing crazy random stuff as dependencies.

1
lib/ntk Submodule

@ -0,0 +1 @@
Subproject commit 720d8d33200ebd030df700c6c7a5a9cdf4581c03

View File

@ -1 +0,0 @@
../FL

View File

@ -1,142 +0,0 @@
###############################################################################
# Copyright (C) 2008 Jonathan Moore Liles #
# #
# This program is free software; you can redistribute it and/or modify it #
# under the terms of the GNU General Public License as published by the #
# Free Software Foundation; either version 2 of the License, or (at your #
# option) any later version. #
# #
# This program is distributed in the hope that it will be useful, but WITHOUT #
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
# more details. #
# #
# You should have received a copy of the GNU General Public License along #
# with This program; see the file COPYING. If not,write to the Free Software #
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
###############################################################################
## Makefile for the Non-DAW.
##
## Do not edit this file; run `make config` instead.
##
VERSION := 1.1.0
PACKAGE := MIXER
all: .config
.config: configure
@ echo '<<< Configuring '$(PACKAGE)
@ ./configure
config:
@ echo '<<< Configuring '$(PACKAGE)
@ ./configure
-include .config
export SYSTEM_PATH:=$(prefix)/share/
export DOCUMENT_PATH:=$(prefix)/share/doc/
export PIXMAP_PATH:=$(prefix)/share/pixmaps/
export ICON_PATH:=$(prefix)/share/icons/
export DESKTOP_PATH:=$(prefix)/share/applications/
# a bit of a hack to make sure this runs before any rules
ifneq ($(CALCULATING),yes)
TOTAL := $(shell $(MAKE) CALCULATING=yes -n 2>/dev/null | sed -n 's/^.*Compiling: \([^"]\+\)"/\1/p' > .files )
endif
ifeq ($(USE_DEBUG),yes)
CFLAGS := -pipe -ggdb -fno-inline -Wall -Wextra -O0
CXXFLAGS := -Wnon-virtual-dtor -Wno-missing-field-initializers -fno-rtti -fno-exceptions
else
CFLAGS := -pipe -O2 -DNDEBUG
CXXFLAGS := -fno-rtti -fno-exceptions
endif
CFLAGS+=-DVERSION=\"$(VERSION)\" \
-DINSTALL_PREFIX=\"$(prefix)\" \
-DSYSTEM_PATH=\"$(SYSTEM_PATH)\" \
-DDOCUMENT_PATH=\"$(DOCUMENT_PATH)\" \
-DPIXMAP_PATH=\"$(PIXMAP_PATH)\"
CXXFLAGS := $(CFLAGS) $(CXXFLAGS)
INCLUDES := -I. -Iutil -IFL -Inonlib
include scripts/colors
ifneq ($(CALCULATING),yes)
COMPILING="$(BOLD)$(BLACK)MIXER [$(SGR0)$(CYAN)`scripts/percent-complete .files "$<"`$(SGR0)$(BOLD)$(BLACK)]$(SGR0) $(BOLD)$(YELLOW)$<$(SGR0)"
else
COMPILING="Compiling: $<"
endif
.C.o:
@ echo $(COMPILING)
@ $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
%.C : %.fl
@ cd `dirname $<` && fluid -c ../$<
DONE := $(BOLD)$(GREEN)done$(SGR0)
include FL/makefile.inc
#include nonlib/makefile.inc
include makefile.inc
SRCS:=$(Mixer_SRCS)
OBJS:=$(Mixer_OBJS)
CXXFLAGS += $(Mixer_CFLAGS)
# FIXME: isn't there a better way?
$(OBJS): .config Makefile
TAGS: $(SRCS)
etags $(SRCS)
.deps: .config $(SRCS)
ifneq ($(CALCULATING),yes)
@ echo -n Calculating dependencies...
@ makedepend -f- -- $(CXXFLAGS) $(INCLUDES) -- $(SRCS) 2>/dev/null > .deps && echo $(DONE)
@ # gcc -M $(CXXFLAGS) $(INCLUDES) $(SRCS) > .deps && echo $(DONE)
endif
install: all
@ echo -n "Installing..."
@ install src/mixer "$(DESTDIR)$(prefix)"/bin/non-mixer
@ mkdir -p "$(DESTDIR)$(SYSTEM_PATH)"/non-mixer
@ $(MAKE) -s -C doc install
@ install -d "$(DESTDIR)$(PIXMAP_PATH)/non-mixer"
@ install -m 644 icons/hicolor/256x256/apps/non-mixer.png "$(DESTDIR)$(PIXMAP_PATH)"/non-mixer/icon-256x256.png
@ install -d "$(DESTDIR)$(ICON_PATH)/hicolor"
@ cp -au icons/hicolor/ "$(DESTDIR)$(ICON_PATH)"
@ install -d "$(DESTDIR)$(DESKTOP_PATH)"
@ sed 's:@BIN_PATH@:$(prefix)/bin:' non-mixer.desktop.in > "$(DESTDIR)$(DESKTOP_PATH)/non-mixer.desktop"
@ echo "$(DONE)"
ifneq ($(USE_DEBUG),yes)
@ echo -n "Stripping..."
@ strip $(DESTDIR)$(prefix)/bin/non-mixer
@ echo "$(DONE)"
endif
clean_deps:
@ rm -f .deps
.PHONEY: clean config depend clean_deps
clean: FL_clean Mixer_clean
dist:
git archive --prefix=non-mixer-$(VERSION)/ v$(VERSION) | bzip2 > non-mixer-$(VERSION).tar.bz2
scan-gpl:
@ scripts/scan-gpl $(SRCS) || echo $(BOLD)$(RED)Some source files do not contain proper license information!
-include .deps

29
mixer/configure vendored
View File

@ -1,29 +0,0 @@
#!/bin/sh
#
# Copyright (C) 2008 Jonathan Moore Liles
# This file is licensed under version 2 of the GPL.
. scripts/config-funcs
begin
begin_options
ask "Installation prefix" prefix /usr/local
ask "Build for debugging" USE_DEBUG no
begin_tests
require_FLTK 1.1.7 images
require_command FLUID fluid
require_command ar ar
require_command makedepend makedepend
require_package JACK 0.103.0 jack
require_package lrdf 0.4.0 lrdf
require_package liblo 0.23 liblo
require_package sigcpp 2.0.0 sigc++-2.0
suggest_package XPM 2.0.0 xpm
test_version `version_of liblo` 0.26 || warn "Version $(version_of liblo) of liblo is slow to create servers. Consider upgrading to 0.26 or later"
end

View File

@ -6,52 +6,74 @@
<title>Non Mixer User Manual</title>
</head>
<body>
<div id=cover>
<h1>Non Mixer User Manual</h1>
<h3></h3>
<address>
Jonathan Moore Liles <a href="mailto:male@tuxfamily.org">&lt;male@tuxfamily.org&gt;</a><br>
January 21, 2010<br>
<br>
</address><hr></div>
<div id=body>
<div id=toc>
<h1 id=toc>Table Of Contents</h1>
<ul>
<li><a href="#n:1.">1. User Manual</a>
<ul><li><a href="#n:1.1.">1.1. The Mixer</a>
<li><a href="#n:1.">1. Non Mixer User Manual</a>
<ul><li><a href="#n:1.1.">1.1. Mixer Groups</a>
<ul><li><a href="#n:1.1.1.">1.1.1. Display Options</a>
<ul><li><a href="#n:1.1.1.">1.1.1. How to Choose Groupings</a>
<li><a href="#n:1.1.2.">1.1.2. Mixer Strips</a>
<li><a href="#n:1.1.2.">1.1.2. Considering JACK Overhead</a>
<ul><li><a href="#n:1.1.2.1.">1.1.2.1. Navigation</a>
<li><a href="#n:1.1.3.">1.1.3. Creating a New Group</a>
<li><a href="#n:1.1.2.2.">1.1.2.2. Control</a>
<li><a href="#n:1.1.4.">1.1.4. Adding a Strip to an Existing Group</a>
<li><a href="#n:1.1.2.3.">1.1.2.3. Signal Chain</a>
<li><a href="#n:1.1.5.">1.1.5. Removing a Strip from a Group</a>
<ul><li><a href="#n:1.1.2.3.1.">1.1.2.3.1. Modules</a>
<li><a href="#n:1.1.6.">1.1.6. Removing a Group</a>
<ul><li><a href="#n:1.1.2.3.1.1.">1.1.2.3.1.1. OSC Control</a>
<li><a href="#n:1.1.7.">1.1.7. Monitoring Group DSP Load</a>
<li><a href="#n:1.1.2.3.1.2.">1.1.2.3.1.2. Manipulation</a>
</ul><li><a href="#n:1.2.">1.2. Mixer Strips</a>
<li><a href="#n:1.1.2.3.1.3.">1.1.2.3.1.3. Module Parameter Editor</a>
<ul><li><a href="#n:1.2.1.">1.2.1. Navigation</a>
<li><a href="#n:1.1.2.3.1.4.">1.1.2.3.1.4. Controls</a>
<li><a href="#n:1.2.2.">1.2.2. Control</a>
<ul><li><a href="#n:1.1.2.3.1.4.1.">1.1.2.3.1.4.1. Control Voltages</a>
<li><a href="#n:1.2.3.">1.2.3. Signal Chain</a>
</ul><li><a href="#n:1.1.2.3.1.5.">1.1.2.3.1.5. Spatialization </a>
<ul><li><a href="#n:1.2.3.1.">1.2.3.1. Modules</a>
</ul></ul></ul><li><a href="#n:1.1.3.">1.1.3. Projects</a>
<ul><li><a href="#n:1.2.3.1.1.">1.2.3.1.1. OSC Control</a>
<ul><li><a href="#n:1.1.3.1.">1.1.3.1. JACK I/O</a>
<li><a href="#n:1.2.3.1.2.">1.2.3.1.2. MIDI Control</a>
</ul></ul></ul></ul></ul><hr></div>
<h1 id="n:1.">1. User Manual</h1>
<h2 id="n:1.1.">1.1. The Mixer</h2>
<li><a href="#n:1.2.3.1.3.">1.2.3.1.3. Manipulation</a>
<li><a href="#n:1.2.3.1.4.">1.2.3.1.4. Module Parameter Editor</a>
<li><a href="#n:1.2.3.1.5.">1.2.3.1.5. Controls</a>
<ul><li><a href="#n:1.2.3.1.5.1.">1.2.3.1.5.1. Control Voltages</a>
</ul><li><a href="#n:1.2.3.1.6.">1.2.3.1.6. Spatialization </a>
<ul><li><a href="#n:1.2.3.1.6.1.">1.2.3.1.6.1. Spatializer Module</a>
<ul><li><a href="#n:1.2.3.1.6.1.1.">1.2.3.1.6.1.1. Reverb Routing</a>
</ul><li><a href="#n:1.2.3.1.6.2.">1.2.3.1.6.2. LADSPA Plugins</a>
</ul></ul></ul></ul><li><a href="#n:1.3.">1.3. Spatialization Console</a>
<li><a href="#n:1.4.">1.4. Projects</a>
<ul><li><a href="#n:1.4.1.">1.4.1. JACK I/O</a>
</ul></ul></ul></ul><hr></div>
<h1 id="n:1.">1. Non Mixer User Manual</h1>
<center><div class="fig image"><table id="Fig.1.1" border=1>
<caption>
<strong>Fig. 1.1.</strong> Mixer
@ -75,11 +97,110 @@ Start by creating a new project (menu item <tt>Project/New</tt>).
<p>
After the project has been created. Hit <tt>a</tt> or choose <tt>Mixer/Add Strip</tt> from the menu to add a new strip to the mixer.
</p>
<h3 id="n:1.1.1.">1.1.1. Display Options</h3>
<h2 id="n:1.1.">1.1. Mixer Groups</h2>
<center><div class="fig image"><table border=1>
<tr><td><img src="group-dropdown.png" alt="fig. "></td></tr>
</table></div></center>
<p>
The display options, found in the <tt>Options/Display</tt> submenu may be adjusted to suit your needs. Set the color scheme, widget style, and other graphic options to your liking. These options are global and affect all projects.
Groups serve several purposes. Firstly, they allow for some organization of strips. Groups also allow parallel relationships of mixer strips to be made explicit. This has important performance implications in JACK2. Non Mixer supports an unlimited number of groups, each of which can contain an unlimited number of mixer strips.
</p>
<h3 id="n:1.1.2.">1.1.2. Mixer Strips</h3>
<h3 id="n:1.1.1.">1.1.1. How to Choose Groupings</h3>
<p>
All strips in a group should be completely parallel with no feedback loop connections. A typical group might be named 'Input' and contain all input strips (strips that accept input from Non Timeline and have outputs all connecting to some master bus).
</p>
<p>
To put it another way, if you have 100 inputs strips with identical output configurations (e.g. stereo or B-Format), that all connect to a master bus, then you have a candidate for a group.
</p>
<h3 id="n:1.1.2.">1.1.2. Considering JACK Overhead</h3>
<p>
JACK provides immense flexibility. But, as in most situations, that flexibility comes with a cost. In JACK the cost is a context switch per client. This applies <i>even for many clients which belong to the same process</i>, as in Non Mixer. Various factors go into determining the price of a context switch on any given system. It's not very expensive, but it does add up. It becomes problematic in sessions involving many clients (think 100s), each of which having a small DSP load (often smaller than the cost of JACK's context context switch). JACK <b>could</b> be smart enough to recognize that some clients belong to the same process and could be executed serially without requiring a context switch, but at the time of writing neither JACK1 nor JACK2's scheduling is that smart.
</p>
<p>
If you're mixing a normal song (couple of dozen tracks) at low latency, this overhead will probably account for less than 1% of the total DSP load. If you're mixing an entire orchestra at ultra-low latency, then it might account for a quarter or more of the total DSP load.
</p>
<p>
Groups mitigate this cost by reducing the number of JACK clients required for a mix. Strips in a group will execute serially without context switches or thread synchronization--reducing the total JACK overhead. However, if you have several groups, then they may all by run in parallel by JACK2.
</p>
<p>
<p>
To illustrate this point here are some figures from an actual song session including the whole Non suite plus a sampler, a synth and an ambisonics convolution reverb with a total of 13 strips in 4 groups in different configurations on the same system.
</p>
<p>
JACK's DSP load figures are interpreted thus: if at a 2.7ms software latency setting the average time a proces cycle takes to complete is 2.7ms, then the DSP load is 100%. The usable ceiling on DSP load is 80%. This is true for both JACK1 and JACK2. The difference is that JACK2 may use all available CPU cores to execute the graph (if there are enough clients in parallel signal flow).
</p>
<p>
32-bit Intel Core2 Duo @1.6Ghz -r 48000 -p 256 -n 2 (5.3ms)
</p>
<center><div class="fig table"><table border=1>
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr>
<tr><td>JACK1</td><td>N</td><td>39%</td></tr>
<tr><td>JACK1</td><td>Y</td><td>27%</td></tr>
<tr><td>JACK2</td><td>N</td><td>24%</td></tr>
<tr><td>JACK2</td><td>Y</td><td>31%</td></tr>
</table></div></center>
<p>
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 256 -n 2 (5.3ms)
</p>
<center><div class="fig table"><table border=1>
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr>
<tr><td>JACK1</td><td>N</td><td>28%</td></tr>
<tr><td>JACK1</td><td>Y</td><td>12%</td></tr>
<tr><td>JACK2</td><td>N</td><td>12%</td></tr>
<tr><td>JACK2</td><td>Y</td><td>11%</td></tr>
</table></div></center>
<p>
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 128 -n 2 (2.7ms)
</p>
<center><div class="fig table"><table border=1>
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr>
<tr><td>JACK1</td><td>N</td><td>29%</td></tr>
<tr><td>JACK1</td><td>Y</td><td>17%</td></tr>
<tr><td>JACK2</td><td>N</td><td>17%</td></tr>
<tr><td>JACK2</td><td>Y</td><td>17%</td></tr>
</table></div></center>
<p>
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 32 -n 2 (0.7ms)
</p>
<center><div class="fig table"><table border=1>
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr>
<tr><td>JACK1</td><td>N</td><td>x</td></tr>
<tr><td>JACK1</td><td>Y</td><td>x</td></tr>
<tr><td>JACK2</td><td>N</td><td>43%</td></tr>
<tr><td>JACK2</td><td>Y</td><td>41%</td></tr>
</table></div></center>
<p>
As you can see, for multiprocessor systems, JACK2 clearly has an advantage even without grouping.
</p>
<p>
Of course, results will vary depending on the system and the mix. On the dual core system, performance actually degraded with JACK2 when using groups--this is because the number of parallel flows that JACK2 detected was reduced and the second core was being under utilized. Similarly, the performance of the 8-core AMD system doesn't seem that great even in the ungrouped mode--this is because the DSP load of each individual client is around the same as the cost of the context switching. It's a wash either way (if each strip had more or more complex modules on it, then the ungrouped mode would probably perform better). Since JACK1 cannot take advantage of more than 1 CPU core, there is no benefit to parallelism and grouped mode always outperforms ungrouped mode.
</p>
<p>
So, for maximum capacity the combination of a multicore CPU with JACK2 and mixer groups is best.
</p>
<h3 id="n:1.1.3.">1.1.3. Creating a New Group</h3>
<p>
Groups can be created by selecting the group dropdown on any mixer strip and choosing 'New Group'. A window will popup asking for a group name. Group names must be unique. The group will then be created and the selected strip added to it.
</p>
<h3 id="n:1.1.4.">1.1.4. Adding a Strip to an Existing Group</h3>
<p>
To add a strip to an existing group, simply select a group name from the group dropdown on the strip.
</p>
<h3 id="n:1.1.5.">1.1.5. Removing a Strip from a Group</h3>
<p>
Select '---' from the group dropdown. The strip will be removed from the group and will run in an independent JACK client.
</p>
<h3 id="n:1.1.6.">1.1.6. Removing a Group</h3>
<p>
Groups are destroyed automatically as soon as they contain zero strips.
</p>
<h3 id="n:1.1.7.">1.1.7. Monitoring Group DSP Load</h3>
<p>
Above the grop dropdown on each strip is a DSP load meter for the selected group. For ungrouped strips or strips which are the only one in their group, this is simply the DSP load of the single strip.
</p>
<p>
If DSP usage goes up when strips are fed silence, then you're probably running a plugin which has denormal issues.
</p>
<h2 id="n:1.2.">1.2. Mixer Strips</h2>
<center><div class="fig image"><table id="Fig.1.3" border=1>
<caption>
<strong>Fig. 1.3.</strong> Mixer Strip
@ -100,19 +221,19 @@ The fader view comprises a large gain control and digital peak meter indicator.
<p>
To see how an audio signal traveling through this strip will be processed, switch to its <i>signal</i> view.
</p>
<h4 id="n:1.1.2.1.">1.1.2.1. Navigation</h4>
<h3 id="n:1.2.1.">1.2.1. Navigation</h3>
<p>
A strip is focused when you click on it. Focus can be moved among strips with the <tt>Tab</tt> and <tt>Shift-Tab</tt> keys.
</p>
<h4 id="n:1.1.2.2.">1.1.2.2. Control</h4>
<h3 id="n:1.2.2.">1.2.2. Control</h3>
<p>
The focused strip can be moved in the display order via the <tt>[</tt> and <tt>]</tt> keys. <tt>Delete</tt> removes a strip (with confirmation dialog). <tt>n</tt> and <tt>w</tt> set the focused strip's width to <i>narrow</i> or <i>wide</i>, respectively, and <tt>f</tt> and <tt>s</tt> switch between <i>fader</i> and <i>signal</i> views. The strip's context menu can be invoked without the mouse by hitting the <tt>Menu</tt> key (assuming your keyboard has one).
The focused strip can be moved in the display order via the <tt>[</tt> and <tt>]</tt> keys. <tt>Delete</tt> removes a strip (with confirmation dialog). <tt>n</tt> and <tt>w</tt> set the focused strip's width to <i>narrow</i> or <i>wide</i>, respectively, and <tt>f</tt> and <tt>s</tt> switch between <i>fader</i> and <i>signal</i> views. The strip's context menu can be invoked without the mouse by hitting the <tt>Menu</tt> key (assuming your keyboard has one).
</p>
<h4 id="n:1.1.2.3.">1.1.2.3. Signal Chain</h4>
<h3 id="n:1.2.3.">1.2.3. Signal Chain</h3>
<p>
The signal chain view of a mixer strip provides a way to view and manipulate the signal processing of a mixer strip.
</p>
<h5 id="n:1.1.2.3.1.">1.1.2.3.1. Modules</h5>
<h4 id="n:1.2.3.1.">1.2.3.1. Modules</h4>
<center><div class="fig image"><table id="Fig.1.4" border=1>
<caption>
<strong>Fig. 1.4.</strong> Modules
@ -144,10 +265,14 @@ Non Mixer has several built-in modules. They are:
<dd>Digital Peak Meter</dd>
<dt><em>Mono Pan</em></dt>
<dd>Performs intensity panning of a mono signal into a stereo signal.</dd>
<dt><em>Aux</em></dt>
<dd>Provides auxiliary outputs</dd>
<dt><em>Spatializer</em></dt>
<dd>Provides advanced Ambisonics spatialization with distance simulation.</dd>
<dt><em>Plugin</em></dt>
<dd>Hosts a LADSPA plugin</dd>
</dl>
<h6 id="n:1.1.2.3.1.1.">1.1.2.3.1.1. OSC Control</h6>
<h5 id="n:1.2.3.1.1.">1.2.3.1.1. OSC Control</h5>
<p>
The input parameters of all modules are controllable via OSC, regardless of whether the parameter is set as controllable.
</p>
@ -182,9 +307,25 @@ If same module/plugin is used twice in a signal chain (e.g. multiple Gain stages
For the second instance of the Gain module on the strip named 'Foo'.
</p>
<p>
There's a possibility to get exact OSC path for module controls. For this you need to switch strip mode to 'Signl', right click a module, for example 'Gain', and open 'Edit parameters' dialog. OSC path will be shown in a statusbar of the main window when you hover a parameter.
</p>
<p>
Non-DAW accesses these same signals via a more advanced signal routing layer on top of OSC. Any module parameter is easily controlled via Control Sequences in Non-DAW without the need to specify an OSC URL.
</p>
<h6 id="n:1.1.2.3.1.2.">1.1.2.3.1.2. Manipulation</h6>
<h5 id="n:1.2.3.1.2.">1.2.3.1.2. MIDI Control</h5>
<p>
Automatic translation between MIDI and Non's OSC Signals can be achieved by adding the headless program <tt>non-midi-mapper</tt> (included in the Non-Mixer distribution) to an NSM session.
</p>
<p>
Non-MIDI-Mapper provides JACK MIDI input and output ports that can be connected to a suitable controller device.
</p>
<p>
In Non-Mixer, the <tt>Remote Control/Start Learning</tt> menu item enters learning mode in which Non Mixer can be taught which controls to associated with which MIDI messages by clicking a control in Non-Mixer and moving the desired control on the MIDI device. <tt>Remote Control/End Learning</tt> ends the learning session.
</p>
<p>
The mapping will be saved with the NSM session.
</p>
<h5 id="n:1.2.3.1.3.">1.2.3.1.3. Manipulation</h5>
<p>
Left-clicking on a module brings up a Module Parameter Editor window for the selected module.
</p>
@ -200,41 +341,27 @@ Control+Right-clicking on a module causes it to be removed from the chain (modul
<p>
The focused module may also be controlled via the keyboard. <tt>Menu</tt> brings up the context menu for the focused module. <tt>Space</tt> opens the module parameter editor, <tt>b</tt> toggles the bypassed state, and <tt>Delete</tt> removes the module from the chain (without confirmation!). <tt>Control-X</tt>, <tt>Control-C</tt> and <tt>Control-V</tt>, cut, copy, and paste modules, respectively. Modules may be copied within or across chain boundaries. The normal module I/O constraints also apply to pasted modules.
</p>
<h6 id="n:1.1.2.3.1.3.">1.1.2.3.1.3. Module Parameter Editor</h6>
<h5 id="n:1.2.3.1.4.">1.2.3.1.4. Module Parameter Editor</h5>
<center><div class="fig image"><table id="Fig.1.5" border=1>
<caption>
<strong>Fig. 1.5.</strong> Module Parameter Editor
</caption>
<tr><td><img src="gverb-parameters-knobs.png" alt="fig. 1.5"></td></tr>
<tr><td><img src="module-parameter-editor.png" alt="fig. 1.5"></td></tr>
</table></div></center>
<p>
The Module Parameter Editor is used to alter the values of a module's parameters, and in addition, to bind its parameters to controls. A menu button in the upper left-hand corner allows you to select between knob, vertical slider and horizontal slider controls.
</p>
<center><div class="fig image"><table id="Fig.1.6" border=1>
<caption>
<strong>Fig. 1.6.</strong> Horizontal Sliders
</caption>
<tr><td><img src="gverb-parameters-hsliders.png" alt="fig. 1.6"></td></tr>
</table></div></center>
<center><div class="fig image"><table id="Fig.1.7" border=1>
<caption>
<strong>Fig. 1.7.</strong> Vertical Sliders
</caption>
<tr><td><img src="gverb-parameters-vsliders.png" alt="fig. 1.7"></td></tr>
</table></div></center>
<p>
Underneath each control is a bind button. Clicking adds a new control to the chain's <i>Controls</i> view and binds it to the parameter in question. For simplicity, only one control at a time may be bound to a given parameter.
</p>
<h6 id="n:1.1.2.3.1.4.">1.1.2.3.1.4. Controls</h6>
<center><div class="fig image"><table id="Fig.1.8" border=1>
<h5 id="n:1.2.3.1.5.">1.2.3.1.5. Controls</h5>
<center><div class="fig image"><table id="Fig.1.6" border=1>
<caption>
<strong>Fig. 1.8.</strong> Control View
<strong>Fig. 1.6.</strong> Control View
</caption>
<tr><td><img src="controls.png" alt="fig. 1.8"></td></tr>
<tr><td><img src="controls.png" alt="fig. 1.6"></td></tr>
</table></div></center>
<p>
The control view of a chain groups together all of the controls bound to parameters of modules in that chain. The default mode of controls is <i>Manual</i>. Right click on a control to bring up a menu which will allow you to select one of the available control I/O methods to use. When <i>Control Voltage</i> (CV) is selected, a CV input port will be created on the containing mixer strip's JACK client. The control will now accept values from that input. A control bound and configured in this way can then be connected to the output of a Non-DAW control sequence using your favorite connection manager.
@ -247,7 +374,7 @@ events. Hold down the `Ctrl` key while scrolling the mousewheel to
achieve finer resolution.
</td></table>
</div>
<h7 id="n:1.1.2.3.1.4.1.">1.1.2.3.1.4.1. Control Voltages</h7>
<h6 id="n:1.2.3.1.5.1.">1.2.3.1.5.1. Control Voltages</h6>
<p>
The control voltage concept should be familiar to anyone who has experience with analog modular synthesizers. MIDI, while having definite advantages in many respects, multiplexes control data in such a way as to make connecting one MIDI control to a parameter involve a significant inconvenience, usually requiring the adjustment of settings on both ends of the connection in order to separate the control data streams.
</p>
@ -266,23 +393,71 @@ of parameter automation, as LADSPA plugins are incapable of
processing Control Voltage signals at full audio resolution anyway.
</td></table>
</div>
<h6 id="n:1.1.2.3.1.5.">1.1.2.3.1.5. Spatialization </h6>
<center><div class="fig image"><table id="Fig.1.9" border=1>
<caption>
<strong>Fig. 1.9.</strong> Spatialization Control on a Strip
</caption>
<tr><td><img src="spatialization-on-strip.png" alt="fig. 1.9"></td></tr>
<h5 id="n:1.2.3.1.6.">1.2.3.1.6. Spatialization </h5>
<h6 id="n:1.2.3.1.6.1.">1.2.3.1.6.1. Spatializer Module</h6>
<center><div class="fig image"><table border=1>
<tr><td><img src="spatializer-module.png" alt="fig. "></td></tr>
</table></div></center>
<p>
Non-Mixer supports Ambisonic spatialization via the excellent amb-* LADSPA plugin set and others. Whenever a LADSPA plugin is added to a strip whose set of parameters include parameters named Azimuth and Elevation, Non-Mixer will detect this and automatically attach a Spatializer control to these parameters. The Spatializer will be displayed at the bottom of the mixer strip. A larger version of the control may also be found in the Module Parameter Editor.
The Spatializer Module included with Non Mixer allows one to not only control the position of a sound source (angle and elevation), but also to control it's apparent distance from the listener.
</p>
<center><div class="fig image"><table id="Fig.1.10" border=1>
<p>
Distance cues are based on physical properties--the speed of sound in air, the damping effect of humidity, the ratio of reverb early and late reflections, the volume of the sound.
</p>
<p>
In legacy mixers, all of these properties must be controlled individually by the engineer. This is nearly always a process of trial and error. Much of a studio engineers' skill lies in his ability to guess at these values and arrive at a reasonably realistic sounding result.
</p>
<p>
Non Mixer eliminates the guesswork and combines all of these controls into a single spatialization point encoding both a sound source's position relative to the listener and its distance. No matter where the point is placed, the result will be realistic.
</p>
<p>
Use of the Spatializer Modules eliminates much complexity from the mixing process. No more back and forth, no more guessing at values for reverb sends and predelay and EQ. The Spatializer does it all for you.
</p>
<p>
The B-Format outputs of the Spatializer Module are in the order standard order WXYZ.
</p>
<p>
All Spatializer Module instances will present controls and aziumuth, elevation, and radius. Additionally, a <i>Highpass</i> control is provided to compensate for the proximity effect in close-mic'd signals. The default cutoff is 200Hz. Adjust it according to the nature of the input signal.
</p>
<p>
A Spatializer Module fed stereo input will perform stereo encoding and will present a <i>Width</i> control.
</p>
<h7 id="n:1.2.3.1.6.1.1.">1.2.3.1.6.1.1. Reverb Routing</h7>
<p>
The Spatializer module is intended to work with an external reverb engine having Ambisonics B-Format inputs for early reflections and a Mono input for reverb tail (and, of course, B-Format outputs).
</p>
<center><div class="fig image"><table border=1>
<tr><td><img src="reverb-routing.png" alt="fig. "></td></tr>
</table></div></center>
<p>
The Spatializer Module has two sets auxiliary outputs for reverb send. One, consisting of a single mono signal, is intended to be connected to the input of a reverb tail, otherwise known as a diffuse field. Another set of outputs in B-Format is indended to be connected to the B-Format inputs of an early reflection reverb engine. The output of the reverb engine should be 100% 'wet'.
</p>
<p>
I have crafted several jconvolver config files that meet these specifications. They can be found in <a class=ext href="http://non.tuxfamily.org/ambiverb.tar.bz2">ambiverb.tar.bz2</a>
</p>
<p>
The main outputs of the strip should go to a master bus, into which the output of the reverb engine is also fed.
</p>
<h6 id="n:1.2.3.1.6.2.">1.2.3.1.6.2. LADSPA Plugins</h6>
<p>
There are several Ambisonics panners/encoders released as LADSPA plugins. When one of these plugins is added to a strip, Non Mixer will detect its parameter signature and create a Spatialization Control for it just as with the Spatializer Module.
</p>
<center><div class="fig image"><table id="Fig.1.7" border=1>
<caption>
<strong>Fig. 1.10.</strong> Larger Spatialization Control
<strong>Fig. 1.7.</strong> Spatialization Control on a Strip
</caption>
<tr><td><img src="spatialization-in-mpe.png" alt="fig. 1.10"></td></tr>
<tr><td><img src="spatialization-on-strip.png" alt="fig. 1.7"></td></tr>
</table></div></center>
<p>
Whenever a module is added to a strip whose set of parameters include parameters named Azimuth and Elevation (and perhaps Radius), Non-Mixer will detect this and automatically attach a Spatializer control to these parameters. The Spatializer will be displayed at the bottom of the mixer strip. A larger version of the control may also be found in the Module Parameter Editor.
</p>
<center><div class="fig image"><table id="Fig.1.8" border=1>
<caption>
<strong>Fig. 1.8.</strong> Spatialization Control in the Module Parameter Editor
</caption>
<tr><td><img src="spatialization-in-mpe.png" alt="fig. 1.8"></td></tr>
</table></div></center>
<p>
The spatialization control may be visualized as moving the sound source across the surface of a hemispherical dome enclosing the listener.
@ -290,7 +465,23 @@ The spatialization control may be visualized as moving the sound source across t
<p>
The output of the spatializing plugin may be routed into a decoding plugin following it the same strip or, more usefully, the output of a number of Ambisonic panning plugins on different strips may be routed (through JACK) into a single master decoder instance on a final strip.
</p>
<h3 id="n:1.1.3.">1.1.3. Projects</h3>
<h2 id="n:1.3.">1.3. Spatialization Console</h2>
<center><div class="fig image"><table border=1>
<tr><td><img src="spatialization-console.png" alt="fig. "></td></tr>
</table></div></center>
<p>
The Spatialization Console allows the user to view and control all of the source positions in an Ambisonics mix at once.
</p>
<p>
The visibility of the Spatialization Console may be toggled with the <tt>F8</tt> key.
</p>
<p>
The console will display a point for each Spatializer Module or other Ambisonics panner plugin contained in the mix.
</p>
<p>
There are two projections available, Planar and Spherical. The range of the view can be adjusted with the range dropdown in the lower lefthand corner.
</p>
<h2 id="n:1.4.">1.4. Projects</h2>
<p>
A Non-Mixer project is a directory where Non-Mixer keeps the strip settings, project specific settings, and some meta-data. A project is completely self-contained. You can rename a project as simply as:
</p>
@ -298,7 +489,7 @@ A Non-Mixer project is a directory where Non-Mixer keeps the strip settings, pro
$ mv Project-A Project-B
</pre></td></tr>
</table></div>
<h4 id="n:1.1.3.1.">1.1.3.1. JACK I/O</h4>
<h3 id="n:1.4.1.">1.4.1. JACK I/O</h3>
<p>
Each mixer strip is presented as a separate JACK "client". This helps to avoid the necessity of internally duplicating JACK's routing logic and, with JACK2, permits the possibility of parallel execution of mixer strip signal chains.
</p>
@ -312,12 +503,12 @@ The JACK API makes implementing this far more difficult and kludgey than it shou
Please petition your local JACK developer to accept jack_client_set_name() into the API.
</td></table>
</div>
<center><div class="fig image"><table id="Fig.1.11" border=1>
<center><div class="fig image"><table id="Fig.1.9" border=1>
<caption>
<strong>Fig. 1.11.</strong> Patchage
<strong>Fig. 1.9.</strong> Patchage
</caption>
<tr><td><img src="non-mixer-and-non-daw-in-patchage.png" alt="fig. 1.11"></td></tr>
<tr><td><img src="non-mixer-and-non-daw-in-patchage.png" alt="fig. 1.9"></td></tr>
</table></div></center>
</div>
</body>

View File

@ -1,13 +1,10 @@
! title Non Mixer User Manual
! author Jonathan Moore Liles #(email,male@tuxfamily.org)
! date January 21, 2010
-- Table Of Contents
: User Manual
:: The Mixer
: Non Mixer User Manual
/ Mixer
< non-mixer-complex.png
@ -26,13 +23,163 @@
After the project has been created. Hit `a` or choose `Mixer\/Add
Strip` from the menu to add a new strip to the mixer.
::: Display Options
:: Mixer Groups
The display options, found in the `Options\/Display` submenu may be adjusted
to suit your needs. Set the color scheme, widget style, and other graphic
options to your liking. These options are global and affect all projects.
< group-dropdown.png
::: Mixer Strips
Groups serve several purposes. Firstly, they allow for some
organization of strips. Groups also allow parallel relationships of
mixer strips to be made explicit. This has important performance
implications in JACK2. Non Mixer supports an unlimited number of
groups, each of which can contain an unlimited number of mixer
strips.
::: How to Choose Groupings
All strips in a group should be completely parallel with no feedback
loop connections. A typical group might be named 'Input' and contain
all input strips (strips that accept input from Non Timeline and
have outputs all connecting to some master bus).
To put it another way, if you have 100 inputs strips with identical
output configurations (e.g. stereo or B-Format), that all connect to
a master bus, then you have a candidate for a group.
::: Considering JACK Overhead
JACK provides immense flexibility. But, as in most situations, that
flexibility comes with a cost. In JACK the cost is a context switch
per client. This applies /even for many clients which belong to the
same process/, as in Non Mixer. Various factors go into determining
the price of a context switch on any given system. It's not very
expensive, but it does add up. It becomes problematic in sessions
involving many clients (think 100s), each of which having a small
DSP load (often smaller than the cost of JACK's context context
switch). JACK *could* be smart enough to recognize that some clients
belong to the same process and could be executed serially without
requiring a context switch, but at the time of writing neither JACK1
nor JACK2's scheduling is that smart.
If you're mixing a normal song (couple of dozen tracks) at low
latency, this overhead will probably account for less than 1% of the
total DSP load. If you're mixing an entire orchestra at ultra-low
latency, then it might account for a quarter or more of the total
DSP load.
Groups mitigate this cost by reducing the number of JACK clients
required for a mix. Strips in a group will execute serially without
context switches or thread synchronization--reducing the total JACK
overhead. However, if you have several groups, then they may all by
run in parallel by JACK2.
A mixer which uses a single JACK client (which is basically the way
everything other than Non Mixer has been designed) is not a viable
solution by this author's definition, because such a mixer cannot be
from/to any other JACK clients without introducing an extra period
of latency.
To illustrate this point here are some figures from an actual song
session including the whole Non suite plus a sampler, a synth and an
ambisonics convolution reverb with a total of 13 strips in 4 groups
in different configurations on the same system.
JACK's DSP load figures are interpreted thus: if at a 2.7ms software
latency setting the average time a proces cycle takes to complete is
2.7ms, then the DSP load is 100%. The usable ceiling on DSP load is
80%. This is true for both JACK1 and JACK2. The difference is that
JACK2 may use all available CPU cores to execute the graph (if
there are enough clients in parallel signal flow).
32-bit Intel Core2 Duo @1.6Ghz -r 48000 -p 256 -n 2 (5.3ms)
[[ JACK Ver, Groups, DSP Load
[[ JACK1, N, 39%
[[ JACK1, Y, 27%
[[ JACK2, N, 24%
[[ JACK2, Y, 31%
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 256 -n 2 (5.3ms)
[[ JACK Ver, Groups, DSP Load
[[ JACK1, N, 28%
[[ JACK1, Y, 12%
[[ JACK2, N, 12%
[[ JACK2, Y, 11%
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 128 -n 2 (2.7ms)
[[ JACK Ver, Groups, DSP Load
[[ JACK1, N, 29%
[[ JACK1, Y, 17%
[[ JACK2, N, 17%
[[ JACK2, Y, 17%
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 32 -n 2 (0.7ms)
[[ JACK Ver, Groups, DSP Load
[[ JACK1, N, x
[[ JACK1, Y, x
[[ JACK2, N, 43%
[[ JACK2, Y, 41%
As you can see, for multiprocessor systems, JACK2 clearly has an
advantage even without grouping.
Of course, results will vary depending on the system and the mix. On
the dual core system, performance actually degraded with JACK2 when
using groups--this is because the number of parallel flows that
JACK2 detected was reduced and the second core was being under
utilized. Similarly, the performance of the 8-core AMD system
doesn't seem that great even in the ungrouped mode--this is because
the DSP load of each individual client is around the same as the
cost of the context switching. It's a wash either way (if each strip
had more or more complex modules on it, then the ungrouped mode
would probably perform better). Since JACK1 cannot take advantage of
more than 1 CPU core, there is no benefit to parallelism and grouped
mode always outperforms ungrouped mode.
So, for maximum capacity the combination of a multicore CPU with
JACK2 and mixer groups is best.
# All strips in a group *MUST* have the same output configuration. All
# outputs will be mixed together by identity. That is, the 'AUX \(A\)'
# outputs of each strip will be mixed together into a single 'AUX \(A\)'
# output of the group. A strip within a group whose output
# configuration differs from the group configuration will be marked as
# invalid and will not be executed.
::: Creating a New Group
Groups can be created by selecting the group dropdown on any mixer
strip and choosing 'New Group'. A window will popup asking for a
group name. Group names must be unique. The group will then be
created and the selected strip added to it.
::: Adding a Strip to an Existing Group
To add a strip to an existing group, simply select a group name from
the group dropdown on the strip.
::: Removing a Strip from a Group
Select '---' from the group dropdown. The strip will be removed from
the group and will run in an independent JACK client.
::: Removing a Group
Groups are destroyed automatically as soon as they contain zero
strips.
::: Monitoring Group DSP Load
Above the grop dropdown on each strip is a DSP load meter for the
selected group. For ungrouped strips or strips which are the only
one in their group, this is simply the DSP load of the single strip.
If DSP usage goes up when strips are fed silence, then you're
probably running a plugin which has denormal issues.
:: Mixer Strips
/ Mixer Strip
< single-strip.png
@ -55,12 +202,12 @@
To see how an audio signal traveling through this strip will be
processed, switch to its /signal/ view.
:::: Navigation
::: Navigation
A strip is focused when you click on it. Focus can be moved among
strips with the `Tab` and `Shift-Tab` keys.
:::: Control
::: Control
The focused strip can be moved in the display order via the `[` and
`]` keys. `Delete` removes a strip (with confirmation dialog). `n`
@ -68,13 +215,13 @@
respectively, and `f` and `s` switch between /fader/ and /signal/
views. The strip's context menu can be invoked without the mouse by
hitting the `Menu` key (assuming your keyboard has one).
:::: Signal Chain
::: Signal Chain
The signal chain view of a mixer strip provides a way to view and
manipulate the signal processing of a mixer strip.
::::: Modules
:::: Modules
/ Modules
< modules.png
@ -108,10 +255,14 @@
= Digital Peak Meter
= Mono Pan
= Performs intensity panning of a mono signal into a stereo signal.
= Aux
= Provides auxiliary outputs
= Spatializer
= Provides advanced Ambisonics spatialization with distance simulation.
= Plugin
= Hosts a LADSPA plugin
:::::: OSC Control
::::: OSC Control
The input parameters of all modules are controllable via OSC,
regardless of whether the parameter is set as controllable.
@ -143,12 +294,35 @@
For the second instance of the Gain module on the strip named 'Foo'.
There's a possibility to get exact OSC path for module controls.
For this you need to switch strip mode to 'Signl', right click a
module, for example 'Gain', and open 'Edit parameters' dialog. OSC
path will be shown in a statusbar of the main window when you
hover a parameter.
Non-DAW accesses these same signals via a more advanced signal
routing layer on top of OSC. Any module parameter is easily
controlled via Control Sequences in Non-DAW without the need to
specify an OSC URL.
:::::: Manipulation
::::: MIDI Control
Automatic translation between MIDI and Non's OSC Signals can be
achieved by adding the headless program `non-midi-mapper` (included in the
Non-Mixer distribution) to an NSM session.
Non-MIDI-Mapper provides JACK MIDI input and output ports that can be
connected to a suitable controller device.
In Non-Mixer, the `Remote Control\/Start Learning` menu item enters learning
mode in which Non Mixer can be taught which controls to associated with which
MIDI messages by clicking a control in Non-Mixer and moving the desired control
on the MIDI device. `Remote Control\/End Learning` ends the learning session.
The mapping will be saved with the NSM session.
::::: Manipulation
Left-clicking on a module brings up a Module Parameter Editor window
for the selected module.
@ -172,28 +346,22 @@
boundaries. The normal module I\/O constraints also apply to pasted
modules.
:::::: Module Parameter Editor
::::: Module Parameter Editor
/ Module Parameter Editor
< gverb-parameters-knobs.png
< module-parameter-editor.png
The Module Parameter Editor is used to alter the values of a
module's parameters, and in addition, to bind its parameters to
controls. A menu button in the upper left-hand corner allows you to
select between knob, vertical slider and horizontal slider controls.
/ Horizontal Sliders
< gverb-parameters-hsliders.png
/ Vertical Sliders
< gverb-parameters-vsliders.png
Underneath each control is a bind button. Clicking adds a new
control to the chain's /Controls/ view and binds it to the parameter
in question. For simplicity, only one control at a time may be bound
to a given parameter.
:::::: Controls
::::: Controls
/ Control View
< controls.png
@ -214,7 +382,7 @@
{ events. Hold down the `Ctrl` key while scrolling the mousewheel to
{ achieve finer resolution.
::::::: Control Voltages
:::::: Control Voltages
The control voltage concept should be familiar to anyone who has
experience with analog modular synthesizers. MIDI, while having
@ -242,20 +410,87 @@
{ of parameter automation, as LADSPA plugins are incapable of
{ processing Control Voltage signals at full audio resolution anyway.
:::::: Spatialization
::::: Spatialization
:::::: Spatializer Module
< spatializer-module.png
The Spatializer Module included with Non Mixer allows one to not
only control the position of a sound source (angle and elevation),
but also to control it's apparent distance from the listener.
Distance cues are based on physical properties--the speed of sound
in air, the damping effect of humidity, the ratio of reverb early and
late reflections, the volume of the sound.
In legacy mixers, all of these properties must be controlled
individually by the engineer. This is nearly always a process of
trial and error. Much of a studio engineers' skill lies in his
ability to guess at these values and arrive at a reasonably
realistic sounding result.
Non Mixer eliminates the guesswork and combines all of these
controls into a single spatialization point encoding both a sound
source's position relative to the listener and its distance. No
matter where the point is placed, the result will be realistic.
Use of the Spatializer Modules eliminates much complexity from the
mixing process. No more back and forth, no more guessing at values
for reverb sends and predelay and EQ. The Spatializer does it all
for you.
The B-Format outputs of the Spatializer Module are in the order
standard order WXYZ.
All Spatializer Module instances will present controls and aziumuth,
elevation, and radius. Additionally, a /Highpass/ control is
provided to compensate for the proximity effect in close-mic'd
signals. The default cutoff is 200Hz. Adjust it according to the
nature of the input signal.
A Spatializer Module fed stereo input will perform stereo encoding
and will present a /Width/ control.
::::::: Reverb Routing
The Spatializer module is intended to work with an external reverb
engine having Ambisonics B-Format inputs for early reflections and a
Mono input for reverb tail (and, of course, B-Format outputs).
< reverb-routing.png
The Spatializer Module has two sets auxiliary outputs for reverb
send. One, consisting of a single mono signal, is intended to be
connected to the input of a reverb tail, otherwise known as a
diffuse field. Another set of outputs in B-Format is indended to be
connected to the B-Format inputs of an early reflection reverb
engine. The output of the reverb engine should be 100% 'wet'.
I have crafted several jconvolver config files that meet these
specifications. They can be found in #(url,http:\/\/non.tuxfamily.org\/ambiverb.tar.bz2,ambiverb.tar.bz2)
The main outputs of the strip should go to a master bus, into which
the output of the reverb engine is also fed.
:::::: LADSPA Plugins
There are several Ambisonics panners\/encoders released as LADSPA
plugins. When one of these plugins is added to a strip, Non Mixer
will detect its parameter signature and create a Spatialization
Control for it just as with the Spatializer Module.
/ Spatialization Control on a Strip
< spatialization-on-strip.png
Non-Mixer supports Ambisonic spatialization via the excellent amb-\*
LADSPA plugin set and others. Whenever a LADSPA plugin is added to a
strip whose set of parameters include parameters named Azimuth and
Elevation, Non-Mixer will detect this and automatically attach a
Spatializer control to these parameters. The Spatializer will be
displayed at the bottom of the mixer strip. A larger version of the
control may also be found in the Module Parameter Editor.
Whenever a module is added to a strip whose set of parameters
include parameters named Azimuth and Elevation (and perhaps Radius),
Non-Mixer will detect this and automatically attach a Spatializer
control to these parameters. The Spatializer will be displayed at
the bottom of the mixer strip. A larger version of the control may
also be found in the Module Parameter Editor.
/ Larger Spatialization Control
/ Spatialization Control in the Module Parameter Editor
< spatialization-in-mpe.png
The spatialization control may be visualized as moving the sound
@ -268,7 +503,23 @@
routed (through JACK) into a single master decoder instance on a
final strip.
::: Projects
:: Spatialization Console
< spatialization-console.png
The Spatialization Console allows the user to view and control all
of the source positions in an Ambisonics mix at once.
The visibility of the Spatialization Console may be toggled with the `F8` key.
The console will display a point for each Spatializer Module or
other Ambisonics panner plugin contained in the mix.
There are two projections available, Planar and Spherical. The range
of the view can be adjusted with the range dropdown in the lower
lefthand corner.
:: Projects
A Non-Mixer project is a directory where Non-Mixer keeps the strip
settings, project specific settings, and some meta-data. A project
@ -276,7 +527,7 @@
> $ mv Project-A Project-B
:::: JACK I/O
::: JACK I/O
Each mixer strip is presented as a separate JACK "client". This
helps to avoid the necessity of internally duplicating JACK's

View File

@ -12,13 +12,11 @@ OBJS=$(SRCS:.mu=.html)
all: $(OBJS)
upload: all
@ ln -sf OVERVIEW.html index.html
@ rsync -L mup.css MANUAL.html index.html *.png ssh.tuxfamily.org:/home/non/non-mixer.tuxfamily.org-web/htdocs
@ rm -f index.html
@ rsync -L mup.css MANUAL.html *.png ssh.tuxfamily.org:/home/non/non-mixer.tuxfamily.org-web/htdocs
install:
@ mkdir -p $(DOCUMENT_PATH)/non-mixer
@ cp $(OBJS) *.png mup.css ../../COPYING $(DOCUMENT_PATH)/non-mixer
@ install -d "$(DESTDIR)$(DOCUMENT_PATH)"/non-mixer
@ cp $(OBJS) *.png mup.css ../../COPYING "$(DESTDIR)$(DOCUMENT_PATH)"/non-mixer
# @ ln -sf $(PIXMAP_PATH)/logo.png $(DOCUMENT_PATH)
clean:

View File

@ -1,184 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<meta name="generator" content="Generated by MUP v3.5">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link type="text/css" rel="stylesheet" href="mup.css">
<title>The Non Mixer</title>
</head>
<body>
<div id=cover>
<h1>The Non Mixer</h1>
<h3></h3>
<address>
Jonathan Moore Liles <a href="mailto:male@tuxfamily.org">&lt;male@tuxfamily.org&gt;</a><br>
February 1, 2010<br>
</address><img src="icon.png" alt="icon"><hr></div>
<div id=body>
<div id=toc>
<h1 id=toc>Table Of Contents</h1>
<ul>
<li><a href="#n:1.">1. Overview</a>
<ul><li><a href="#n:1.1.">1.1. Description</a>
<li><a href="#n:1.2.">1.2. Why write another one?</a>
<li><a href="#n:1.3.">1.3. Features</a>
<ul><li><a href="#n:1.3.1.">1.3.1. Stand-alone Implementation</a>
<li><a href="#n:1.3.2.">1.3.2. Modular Signal Processing</a>
<li><a href="#n:1.3.3.">1.3.3. Parallel Processing</a>
<li><a href="#n:1.3.4.">1.3.4. Multiple Instances</a>
<li><a href="#n:1.3.5.">1.3.5. LADSPA Plugins</a>
<li><a href="#n:1.3.6.">1.3.6. Unlimited Strips</a>
<li><a href="#n:1.3.7.">1.3.7. Automation</a>
<li><a href="#n:1.3.8.">1.3.8. Spatialization</a>
</ul></ul><li><a href="#u:1.">What does freedom have to do with this software?</a>
<li><a href="#u:2.">Donations</a>
<li><a href="#u:3.">Distribution</a>
<li><a href="#u:4.">Requirements</a>
<li><a href="#u:5.">Community</a>
</ul></ul><hr></div>
<h1 id="n:1.">1. Overview</h1>
<center><div class="fig image"><table border=1>
<tr><td><img src="non-mixer-complex.png" alt="fig. "></td></tr>
</table></div></center>
<h2 id="n:1.1.">1.1. Description</h2>
<p>
The Non Mixer is a powerful, reliable and fast modular Digital Audio Mixer, released under the GNU General Public License (GPL). It utilizes the JACK Audio Connection Kit for inter-application audio I/O and the FLTK GUI toolkit for a fast and lightweight user interface.
</p>
<p>
Please see the <a class=ext href="MANUAL.html">Manual</a> for more information (and lots of screenshots).
</p>
<h2 id="n:1.2.">1.2. Why write another one?</h2>
<p>
At the time work began on Non Mixer, there was no other powerful, fast, and light stand-alone free-software JACK mixer available. There was (and is) LiveMix, however LiveMix is neither fast nor light, and it wasn't able to accept the necessary external control data. SpiralSynthModular, strangely enough, was the closest thing the author could find to the tool he needed (it has gain/mix modules and all modules accept Control Voltage input). SSM is truly an excellent, if neglected, program, but the modules-on-a-canvas model with manual routing is far too cumbersome of an arrangement for real world mixing tasks. Instead of creating another monolithic DAW with built-in routing and mixing, the author choose to follow the time tested Unix design philosophy of one tool per task. The most obvious point of division is between the timeline and the mixer. Drawing the line here allows routing and mixing to actually occur within JACK, which is an infinitely more flexible arrangement than the alternative.
</p>
<h2 id="n:1.3.">1.3. Features</h2>
<p>
Non-Mixer shares many features in common with other, similar projects. However, Non-Mixer's unique architecture permits surprising new functionality.
</p>
<h3 id="n:1.3.1.">1.3.1. Stand-alone Implementation</h3>
<p>
The Non Mixer is a stand-alone application. It is a complement to Non DAW, but neither program requires the other in order to function.
</p>
<p>
Implementing the mixer functionality in a separate program, connected to Non-DAW via JACK presents a number of advantages:
</p>
<ul><li><span>Eliminates the need for an internal connection management interface</span>
<li><span>Improves overall system stability</span>
<li><span>Increases parallelism (utilizes multiple cores)</span>
<li><span>Adds flexibility</span>
<li><span>Eliminates the need for cumbersome concepts and interfaces such as 'sends', 'groups', 'inserts' and 'busses'.</span>
</ul><p>
Multiple instances of the mixer can be run together in order to organize groups of channels and manage them with your preferred window manager.
</p>
<p>
Each mixer strip runs as a separate JACK client. In JACK2, this can translates into the DSP workload being spread across multiple CPU cores.
</p>
<p>
Since the Mixer is an entirely separate unit, you may use any JACK capable mixer client you want instead of, or in myriad combination with, the Non-DAW Mixer. The one called LiveMix works well, but lacks many features of Non's mixer. All operations on the mixer affect the current mix set state only and are not journaled.
</p>
<p>
The mixer's design is modular, with all DSP occurring in discrete modules. One module hosts LADSPA plugins and the mixer is capable of receiving control (automation) data for any module parameter from Non-DAW (or another program) via JACK.
</p>
<p>
Control data is expressed either as Control Voltage (CV) or Control Signals.
</p>
<h3 id="n:1.3.2.">1.3.2. Modular Signal Processing</h3>
<p>
All signal processing in Non Mixer occurs in <i>Modules</i>. This includes input and output from/to JACK. The modular design helps to restrain the total program complexity, and this in turn increases flexibility and reliability. Even the built-in gain stage and meter are modules (and you can place as many meters as you like, wherever you like, in the signal chain, eliminating the post/pre concept).
</p>
<h3 id="n:1.3.3.">1.3.3. Parallel Processing</h3>
<p>
Because each mixer strip in Non Mixer runs as a separate JACK client (in its own thread), JACK has the opportunity, upon analysis of the connection graph, to execute some or all strips in parallel. This is a highly desirable behavior for those having multi-CPU and/or multi-core configurations.
</p>
<h3 id="n:1.3.4.">1.3.4. Multiple Instances</h3>
<p>
Because Non Mixer is stand-alone, it is possible to run multiple instances. One reason you might want to do this is so that you can group sets of strips out of a large total number of strips. For example, you might want to keep all of your drum strips together. By using multiple Non Mixer instances, you are able to manage these groups of strips with the familiar navigation facilities of your chosen window manager. Once again, a modular design allows us to maintain a good balance of complexity across user interface levels without duplicating and internalizing the functionality already available at a higher level.
</p>
<h3 id="n:1.3.5.">1.3.5. LADSPA Plugins</h3>
<p>
LADSPA plugins are hosted by the <i>Plugin</i> module and can be inserted anywhere in the signal chain (contingent on compatibility of the I/O configuration at that point).
</p>
<h3 id="n:1.3.6.">1.3.6. Unlimited Strips</h3>
<p>
There is no limit imposed by Non Mixer on the total number of strips or Mixer instances you can create.
</p>
<h3 id="n:1.3.7.">1.3.7. Automation</h3>
<p>
Any module parameter may be bound to a <i>control</i>. The control may be controlled via the GUI, or externally via a Control Voltage signal, such as is output by a Non-DAW control sequence. All module parameters are alterable via OSC messages, regardless of whether or not they have <i>controls</i> defined.
</p>
<h3 id="n:1.3.8.">1.3.8. Spatialization</h3>
<p>
Plugins supporting Ambisonics panning are automatically assigned a special control called a Spatializer. This allows for easy and positioning of sound sources.
</p>
<h1 id="u:1.">What does freedom have to do with this software?</h1>
<p>
Non is <i>free software</i>. This means, briefly, that you are free use it as <b>you</b> wish, free to examine and adapt the source code, free to share it with your friends, and free to publish your changes to the source code. Furthermore, Non is <i>copyleft</i>, which means that you are free from the threat of some other entity taking over and denying you the above freedoms. The <i>free</i> part of <i>free software</i> doesn't refer to price any more than the <i>free</i> in <i>free speech</i> does.
</p>
<p>
To learn why free software is so important to us (and why it should be important to you), please see the Free Software Foundation's website:
</p>
<p>
<a class=ext href="http://www.fsf.org/licensing/essays/free-sw.html">What is Free Software?</a> <a class=ext href="http://www.fsf.org/licensing/essays/copyleft.html">What is Copyleft?</a>
</p>
<h1 id="u:2.">Donations</h1>
<p>
Donations can take many forms. You can donate your time in code, either by sending it to me for review or cloning the git repository and publishing one containing your changes. You can donate your time in testing, documentation, artwork, indexing, etc. Or, if you don't feel that you possess the time or skills required for the above forms of donation, you can donate money instead. Money donated will help to ensure that I have the free time, good nutrition and enthusiasm required to implement new features. It can also be a more palpable way of saying "Thanks for caring." or "Job well done!"
</p>
<p>
If you don't love this software, don't feel guilty about not contributing. If you do love it, then please help me improve it--in whatever manner you think is appropriate.
</p>
<p>
<a class=ext href="http://non.tuxfamily.org/donation.html">Make a donation</a>
</p>
<h1 id="u:3.">Distribution</h1>
<p>
Development of the Non-DAW and Non-Mixer can be followed with Git:
</p>
<div class="fig example"><table width=100%><tr><td><pre>
git clone git://git.tuxfamily.org/gitroot/non/daw.git
</pre></td></tr>
</table></div>
<p>
There are no pre-compiled binaries available.
</p>
<h1 id="u:4.">Requirements</h1>
<p>
The following libraries are required to build Non DAW and Non Mixer
</p>
<ul><li><span>FLTK >= 1.1.7 (with `fluid`)</span>
<li><span>JACK >= 0.103.0</span>
<li><span>liblrdf >= 0.1.0</span>
<li><span>liblo >= 0.26</span>
<li><span>libsigc++ >= 2.0.0</span>
</ul><h1 id="u:5.">Community</h1>
<p>
Feel free to drop by the <tt>#non</tt> channel on irc.freenode.net.
</p>
<p>
There is a mailing list <tt>non-mixer@lists.tuxfamily.org</tt>.
</p>
<p>
To subscribe, send a message with the subject 'subscribe' to <a href="mailto:non-mixer-request@lists.tuxfamily.org">&lt;non-mixer-request@lists.tuxfamily.org&gt;</a>.
</p>
<p>
You can also browse the <a class=ext href="http://listengine.tuxfamily.org/lists.tuxfamily.org/non-mixer/">archive</a>.
</p>
</div>
</body>
</html>

View File

@ -1,202 +0,0 @@
! title The Non Mixer
! author Jonathan Moore Liles #(email,male@tuxfamily.org)
! date February 1, 2010
! extra #(image,icon,icon.png)
-- Table Of Contents
: Overview
< non-mixer-complex.png
:: Description
The Non Mixer is a powerful, reliable and fast modular Digital Audio
Mixer, released under the GNU General Public License (GPL). It
utilizes the JACK Audio Connection Kit for inter-application audio
I\/O and the FLTK GUI toolkit for a fast and lightweight user
interface.
Please see the #(url,MANUAL.html,Manual) for more information (and
lots of screenshots).
:: Why write another one?
At the time work began on Non Mixer, there was no other powerful,
fast, and light stand-alone free-software JACK mixer available.
There was (and is) LiveMix, however LiveMix is neither fast nor
light, and it wasn't able to accept the necessary external control
data. SpiralSynthModular, strangely enough, was the closest thing
the author could find to the tool he needed (it has gain\/mix
modules and all modules accept Control Voltage input). SSM is truly
an excellent, if neglected, program, but the modules-on-a-canvas
model with manual routing is far too cumbersome of an arrangement
for real world mixing tasks. Instead of creating another monolithic
DAW with built-in routing and mixing, the author choose to follow
the time tested Unix design philosophy of one tool per task. The
most obvious point of division is between the timeline and the
mixer. Drawing the line here allows routing and mixing to actually
occur within JACK, which is an infinitely more flexible arrangement
than the alternative.
:: Features
Non-Mixer shares many features in common with other, similar
projects. However, Non-Mixer's unique architecture permits
surprising new functionality.
::: Stand-alone Implementation
The Non Mixer is a stand-alone application. It is a complement to Non
DAW, but neither program requires the other in order to function.
Implementing the mixer functionality in a separate program, connected
to Non-DAW via JACK presents a number of advantages:
* Eliminates the need for an internal connection management interface
* Improves overall system stability
* Increases parallelism (utilizes multiple cores)
* Adds flexibility
* Eliminates the need for cumbersome concepts and interfaces such as 'sends', 'groups', 'inserts' and 'busses'.
Multiple instances of the mixer can be run together in order to
organize groups of channels and manage them with your preferred
window manager.
Each mixer strip runs as a separate JACK client. In JACK2, this can
translates into the DSP workload being spread across multiple CPU
cores.
Since the Mixer is an entirely separate unit, you may use any JACK
capable mixer client you want instead of, or in myriad combination
with, the Non-DAW Mixer. The one called LiveMix works well, but
lacks many features of Non's mixer. All operations on the mixer
affect the current mix set state only and are not journaled.
The mixer's design is modular, with all DSP occurring in discrete
modules. One module hosts LADSPA plugins and the mixer is capable of
receiving control (automation) data for any module parameter from
Non-DAW (or another program) via JACK.
Control data is expressed either as Control Voltage (CV) or Control
Signals.
::: Modular Signal Processing
All signal processing in Non Mixer occurs in /Modules/. This
includes input and output from\/to JACK. The modular design helps to
restrain the total program complexity, and this in turn increases
flexibility and reliability. Even the built-in gain stage and meter
are modules (and you can place as many meters as you like, wherever
you like, in the signal chain, eliminating the post\/pre concept).
::: Parallel Processing
Because each mixer strip in Non Mixer runs as a separate JACK client
(in its own thread), JACK has the opportunity, upon analysis of the
connection graph, to execute some or all strips in parallel. This is
a highly desirable behavior for those having multi-CPU and\/or
multi-core configurations.
::: Multiple Instances
Because Non Mixer is stand-alone, it is possible to run multiple
instances. One reason you might want to do this is so that you can
group sets of strips out of a large total number of strips. For
example, you might want to keep all of your drum strips together. By
using multiple Non Mixer instances, you are able to manage these
groups of strips with the familiar navigation facilities of your
chosen window manager. Once again, a modular design allows us to
maintain a good balance of complexity across user interface levels
without duplicating and internalizing the functionality already
available at a higher level.
::: LADSPA Plugins
LADSPA plugins are hosted by the /Plugin/ module and can be inserted
anywhere in the signal chain (contingent on compatibility of the
I\/O configuration at that point).
::: Unlimited Strips
There is no limit imposed by Non Mixer on the total number of strips
or Mixer instances you can create.
::: Automation
Any module parameter may be bound to a /control/. The control may be
controlled via the GUI, or externally via a Control Voltage signal,
such as is output by a Non-DAW control sequence.
All module parameters are alterable via OSC messages, regardless of
whether or not they have /controls/ defined.
::: Spatialization
Plugins supporting Ambisonics panning are automatically assigned a
special control called a Spatializer. This allows for easy and
positioning of sound sources.
; What does freedom have to do with this software?
Non is /free software/. This means, briefly, that you are free use
it as *you* wish, free to examine and adapt the source code, free to
share it with your friends, and free to publish your changes to the
source code. Furthermore, Non is /copyleft/, which means that you
are free from the threat of some other entity taking over and
denying you the above freedoms. The /free/ part of /free software/
doesn't refer to price any more than the /free/ in /free speech/
does.
To learn why free software is so important to us (and why it should be
important to you), please see the Free Software Foundation's website:
#(url,http:\/\/www.fsf.org\/licensing\/essays\/free-sw.html,What is Free Software?)
#(url,http:\/\/www.fsf.org\/licensing\/essays\/copyleft.html,What is Copyleft?)
; Donations
Donations can take many forms. You can donate your time in code, either by
sending it to me for review or cloning the git repository and publishing one
containing your changes. You can donate your time in testing, documentation,
artwork, indexing, etc. Or, if you don't feel that you possess the time or
skills required for the above forms of donation, you can donate money
instead. Money donated will help to ensure that I have the free time, good
nutrition and enthusiasm required to implement new features. It can also be
a more palpable way of saying "Thanks for caring." or "Job well done!"
If you don't love this software, don't feel guilty about not contributing.
If you do love it, then please help me improve it--in whatever manner you
think is appropriate.
#(url,http:\/\/non.tuxfamily.org\/donation.html,Make a donation)
; Distribution
Development of the Non-DAW and Non-Mixer can be followed with Git:
> git clone git://git.tuxfamily.org/gitroot/non/daw.git
There are no pre-compiled binaries available.
; Requirements
The following libraries are required to build Non DAW and Non Mixer
* FLTK >= 1.1.7 (with `fluid`)
* JACK >= 0.103.0
* liblrdf >= 0.1.0
* liblo >= 0.26
* libsigc++ >= 2.0.0
; Community
Feel free to drop by the `#non` channel on irc.freenode.net.
There is a mailing list `non-mixer@lists.tuxfamily.org`.
To subscribe, send a message with the subject 'subscribe' to
#(email,non-mixer-request@lists.tuxfamily.org).
You can also browse the #(url,http:\/\/listengine.tuxfamily.org\/lists.tuxfamily.org\/non-mixer\/,archive).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1,8 +1,15 @@
/* Example CSS Style for MUP */
body
{
font: normal normal 14pt "Helvetica", sans-serif;
/* background: url("http://non.tuxfamily.org/background-pattern.png") fixed; */
background-color: #121212; color: lightgray; padding: 0; margin: 0;
}
a:link {
color: yellow;
color: white;
}
a:visited {
color: olive;
@ -82,14 +89,17 @@ p:contains("Warning:") {
}
#cover {
position: relative;
background: #da0;
color: black;
/* background: #da0;*/
background: #555;
color: #aaa;
text-align: center;
margin: 0;
padding: 0.5em;
border-top: 4px solid black;
border-bottom: 4px solid black;
}
#cover h1, #cover h3 {
text-shadow: #444 0.2em 0.2em 0.2em;
text-shadow: #222 0.2em 0.2em 0.2em;
color: white;
border: none;
letter-spacing: 0.2em;
@ -98,7 +108,7 @@ p:contains("Warning:") {
margin-right: 2em;
}
#cover h1:before, #cover h1:after {
content: "::";
/* content: "::"; */
font-size: 300%;
color: black;
}
@ -162,26 +172,26 @@ hr {
border-bottom: 0;
}
body {
margin: 0;
background: #222;
color: white;
font-family: Arial, sans-serif;
}
/* */
#body {
position: relative;
margin: 0.5em;
margin: 0 auto;
padding: 0.5em;
max-width: 900px;
background-color: #1c1c1c;
}
/* ;, : */
h1 {
color: #ff0;
color: #fff;
border-bottom: solid #444 0.1em;
text-shadow: 1px 1px 2px #000;
}
/* ::, :::, ::::, :::::, :::::: */
h2, h3, h4, h5, h6 {
color: #dd0;
color: #fff;
text-shadow: 1px 1px 2px #000;
}
/* tables, figures */
@ -215,12 +225,9 @@ h2, h3, h4, h5, h6 {
/* < */
.fig.image table {
border: dashed silver 0.2em;
border: none;
background: transparent;
/* Every browser should support border radii */
-moz-border-radius: 0.5em;
border-radius: 0.5em;
max-width: 100%;
}
.fig.image tr, .fig.image td {
border: none;
@ -228,6 +235,11 @@ h2, h3, h4, h5, h6 {
padding: 0;
}
.fig.image img
{
max-width: 900px;
}
/* */
p {
margin-right: 2%;
@ -265,14 +277,14 @@ p {
margin-top: 0;
font-family: Monospace;
padding: 1em;
border: dashed 0.3em gray;
background: #111;
border: solid 1px black;
background: #222;
color: white;
display: block;
overflow: auto;
/* Every browser should support border radii */
-moz-border-radius: 0.5em;
border-radius: 0.5em;
/* -moz-border-radius: 0.5em;
border-radius: 0.5em; */
}
/* " */
/*

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 576 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,925 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg2"
version="1.1"
inkscape:version="0.48.1 r9760"
sodipodi:docname="icon-large.svg"
inkscape:export-filename="/home/male/prog/non-sequencer/doc/just-text.png"
inkscape:export-xdpi="141.06583"
inkscape:export-ydpi="141.06583"
style="enable-background:new">
<defs
id="defs4">
<linearGradient
inkscape:collect="always"
id="linearGradient5418">
<stop
style="stop-color:#654d4d;stop-opacity:1;"
offset="0"
id="stop5420" />
<stop
style="stop-color:#654d4d;stop-opacity:0;"
offset="1"
id="stop5422" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5021">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5023" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop5025" />
</linearGradient>
<linearGradient
inkscape:collect="always"
id="linearGradient5013">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5015" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop5017" />
</linearGradient>
<linearGradient
id="linearGradient4861">
<stop
style="stop-color:#a50000;stop-opacity:1;"
offset="0"
id="stop4863" />
<stop
style="stop-color:#a50000;stop-opacity:0;"
offset="1"
id="stop4865" />
</linearGradient>
<linearGradient
id="linearGradient5209"
osb:paint="solid">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5211" />
</linearGradient>
<filter
inkscape:collect="always"
id="filter5252"
x="-0.051939286"
width="1.1038786"
y="-0.80208468"
height="2.6041694"
color-interpolation-filters="sRGB">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="5.3552102"
id="feGaussianBlur5254" />
</filter>
<filter
id="filter6205"
inkscape:label="Black hole"
inkscape:menu="Morphology"
inkscape:menu-tooltip="Creates a black light inside and outside"
height="1.5"
width="1.5"
y="-0.25"
x="-0.25"
color-interpolation-filters="sRGB">
<feGaussianBlur
id="feGaussianBlur6207"
stdDeviation="5"
in="SourceAlpha"
result="result1" />
<feComposite
id="feComposite6209"
in2="result1"
operator="arithmetic"
k2="3.2"
k1="-1"
k4="-2"
result="result3"
k3="0" />
<feColorMatrix
id="feColorMatrix6211"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 10 0 "
result="result2" />
<feComposite
id="feComposite6213"
in2="result2"
result="fbSourceGraphic"
in="SourceGraphic"
operator="out" />
<feBlend
id="feBlend6215"
in2="fbSourceGraphic"
mode="multiply"
in="result1"
result="result91" />
<feBlend
id="feBlend6217"
in2="result91"
mode="screen"
in="fbSourceGraphic" />
</filter>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6759-3"
id="radialGradient6767-0"
cx="103.21429"
cy="213.43361"
fx="103.21429"
fy="213.43361"
r="8.2009745"
gradientTransform="matrix(1,0,0,1.0160278,0,-3.4208767)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
id="linearGradient6759-3">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop6761-5" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop6763-9" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6759-2"
id="radialGradient6767-9"
cx="103.21429"
cy="213.43361"
fx="103.21429"
fy="213.43361"
r="8.2009745"
gradientTransform="matrix(1,0,0,1.0160278,0,-3.4208767)"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
id="linearGradient6759-2">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop6761-9" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop6763-0" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient6759-2-4"
id="radialGradient6846-0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,1.0160278,0,-3.4208767)"
cx="103.21429"
cy="213.43361"
fx="103.21429"
fy="213.43361"
r="8.2009745" />
<linearGradient
inkscape:collect="always"
id="linearGradient6759-2-4">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop6761-9-1" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop6763-0-7" />
</linearGradient>
<filter
id="filter4094"
inkscape:label="Black hole"
inkscape:menu="Morphology"
inkscape:menu-tooltip="Creates a black light inside and outside"
height="1.5"
width="1.5"
y="-0.25"
x="-0.25"
color-interpolation-filters="sRGB">
<feGaussianBlur
id="feGaussianBlur4096"
stdDeviation="5"
in="SourceAlpha"
result="result1" />
<feComposite
id="feComposite4098"
in2="result1"
operator="arithmetic"
k2="3.2"
k1="-1"
k4="-2"
result="result3"
k3="0" />
<feColorMatrix
id="feColorMatrix4100"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 10 0 "
result="result2" />
<feComposite
id="feComposite4102"
in2="result2"
result="fbSourceGraphic"
in="SourceGraphic"
operator="out" />
<feBlend
id="feBlend4104"
in2="fbSourceGraphic"
mode="multiply"
in="result1"
result="result91" />
<feBlend
id="feBlend4106"
in2="result91"
mode="screen"
in="fbSourceGraphic" />
</filter>
<filter
id="filter4108"
inkscape:label="Black hole"
inkscape:menu="Morphology"
inkscape:menu-tooltip="Creates a black light inside and outside"
height="1.5"
width="1.5"
y="-0.25"
x="-0.25"
color-interpolation-filters="sRGB">
<feGaussianBlur
id="feGaussianBlur4110"
stdDeviation="5"
in="SourceAlpha"
result="result1" />
<feComposite
id="feComposite4112"
in2="result1"
operator="arithmetic"
k2="3.2"
k1="-1"
k4="-2"
result="result3"
k3="0" />
<feColorMatrix
id="feColorMatrix4114"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 10 0 "
result="result2" />
<feComposite
id="feComposite4116"
in2="result2"
result="fbSourceGraphic"
in="SourceGraphic"
operator="out" />
<feBlend
id="feBlend4118"
in2="fbSourceGraphic"
mode="multiply"
in="result1"
result="result91" />
<feBlend
id="feBlend4120"
in2="result91"
mode="screen"
in="fbSourceGraphic" />
</filter>
<filter
id="filter2996"
inkscape:label="Black hole"
inkscape:menu="Morphology"
inkscape:menu-tooltip="Creates a black light inside and outside"
height="1.5"
width="1.5"
y="-0.25"
x="-0.25"
color-interpolation-filters="sRGB">
<feGaussianBlur
id="feGaussianBlur2998"
stdDeviation="5"
in="SourceAlpha"
result="result1" />
<feComposite
id="feComposite3000"
in2="result1"
operator="arithmetic"
k2="3.2"
k1="-1"
k4="-2"
result="result3"
k3="0" />
<feColorMatrix
id="feColorMatrix3002"
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 10 0 "
result="result2" />
<feComposite
id="feComposite3004"
in2="result2"
result="fbSourceGraphic"
in="SourceGraphic"
operator="out" />
<feBlend
id="feBlend3006"
in2="fbSourceGraphic"
mode="multiply"
in="result1"
result="result91" />
<feBlend
id="feBlend3008"
in2="result91"
mode="screen"
in="fbSourceGraphic" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4523-5"
id="linearGradient4533-8"
x1="40.691368"
y1="-5.0138588"
x2="115.70895"
y2="122.54021"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-1.4285714,-0.26785715)" />
<linearGradient
inkscape:collect="always"
id="linearGradient4523-5">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop4525-8" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop4527-2" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4861-0"
id="linearGradient4867-9"
x1="-277.44415"
y1="-50.038612"
x2="36.835873"
y2="319.67722"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient4861-0">
<stop
style="stop-color:#d90000;stop-opacity:1;"
offset="0"
id="stop4863-4" />
<stop
style="stop-color:#a50000;stop-opacity:0;"
offset="1"
id="stop4865-0" />
</linearGradient>
<filter
inkscape:collect="always"
id="filter4948"
color-interpolation-filters="sRGB">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="4.5318938"
id="feGaussianBlur4950" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5013"
id="linearGradient5019"
x1="7.3245215"
y1="-54.502781"
x2="135.65985"
y2="191.63652"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.29905175,0,0,0.29902528,0.31202281,223.17555)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5021"
id="linearGradient5027"
x1="65.545662"
y1="-43.027843"
x2="294.41019"
y2="289.31235"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.29905175,0,0,0.29902528,0.31202281,223.17555)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5013-1"
id="linearGradient5019-5"
x1="26.703053"
y1="29.001957"
x2="170.00505"
y2="221.94109"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
id="linearGradient5013-1">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop5015-6" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop5017-1" />
</linearGradient>
<filter
color-interpolation-filters="sRGB"
inkscape:collect="always"
id="filter5281">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="2.0318984"
id="feGaussianBlur5283" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6116"
id="linearGradient5285"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
x1="432.34528"
y1="197.17313"
x2="432.34528"
y2="544.38947" />
<linearGradient
id="linearGradient6116">
<stop
style="stop-color:#a00000;stop-opacity:1;"
offset="0"
id="stop6118" />
<stop
style="stop-color:#00ff00;stop-opacity:1;"
offset="1"
id="stop6120" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6116"
id="linearGradient5287"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
x1="432.34528"
y1="197.17313"
x2="432.34528"
y2="544.38947" />
<linearGradient
id="linearGradient5170">
<stop
style="stop-color:#a00000;stop-opacity:1;"
offset="0"
id="stop5172" />
<stop
style="stop-color:#00ff00;stop-opacity:1;"
offset="1"
id="stop5174" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6116"
id="linearGradient5289"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
x1="432.34528"
y1="197.17313"
x2="432.34528"
y2="544.38947" />
<linearGradient
id="linearGradient5177">
<stop
style="stop-color:#a00000;stop-opacity:1;"
offset="0"
id="stop5179" />
<stop
style="stop-color:#00ff00;stop-opacity:1;"
offset="1"
id="stop5181" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6116"
id="linearGradient5291"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
x1="432.34528"
y1="197.17313"
x2="432.34528"
y2="544.38947" />
<linearGradient
id="linearGradient5184">
<stop
style="stop-color:#a00000;stop-opacity:1;"
offset="0"
id="stop5186" />
<stop
style="stop-color:#00ff00;stop-opacity:1;"
offset="1"
id="stop5188" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6116"
id="linearGradient5293"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
x1="432.34528"
y1="197.17313"
x2="432.34528"
y2="544.38947" />
<linearGradient
id="linearGradient5191">
<stop
style="stop-color:#a00000;stop-opacity:1;"
offset="0"
id="stop5193" />
<stop
style="stop-color:#00ff00;stop-opacity:1;"
offset="1"
id="stop5195" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6116"
id="linearGradient5295"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
x1="432.34528"
y1="197.17313"
x2="432.34528"
y2="544.38947" />
<linearGradient
id="linearGradient5198">
<stop
style="stop-color:#a00000;stop-opacity:1;"
offset="0"
id="stop5200" />
<stop
style="stop-color:#00ff00;stop-opacity:1;"
offset="1"
id="stop5202" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6116"
id="linearGradient5297"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
x1="432.34528"
y1="197.17313"
x2="432.34528"
y2="544.38947" />
<linearGradient
id="linearGradient5205">
<stop
style="stop-color:#a00000;stop-opacity:1;"
offset="0"
id="stop5207" />
<stop
style="stop-color:#00ff00;stop-opacity:1;"
offset="1"
id="stop5209" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6116"
id="linearGradient5299"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
x1="432.34528"
y1="197.17313"
x2="432.34528"
y2="544.38947" />
<linearGradient
id="linearGradient5212">
<stop
style="stop-color:#a00000;stop-opacity:1;"
offset="0"
id="stop5214" />
<stop
style="stop-color:#00ff00;stop-opacity:1;"
offset="1"
id="stop5216" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6116"
id="linearGradient5301"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
x1="432.34528"
y1="197.17313"
x2="432.34528"
y2="544.38947" />
<linearGradient
id="linearGradient5219">
<stop
style="stop-color:#a00000;stop-opacity:1;"
offset="0"
id="stop5221" />
<stop
style="stop-color:#00ff00;stop-opacity:1;"
offset="1"
id="stop5223" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6116"
id="linearGradient5303"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
x1="432.34528"
y1="197.17313"
x2="432.34528"
y2="544.38947" />
<linearGradient
id="linearGradient5226">
<stop
style="stop-color:#a00000;stop-opacity:1;"
offset="0"
id="stop5228" />
<stop
style="stop-color:#00ff00;stop-opacity:1;"
offset="1"
id="stop5230" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6116"
id="linearGradient5305"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
x1="432.34528"
y1="197.17313"
x2="432.34528"
y2="544.38947" />
<linearGradient
id="linearGradient5233">
<stop
style="stop-color:#a00000;stop-opacity:1;"
offset="0"
id="stop5235" />
<stop
style="stop-color:#00ff00;stop-opacity:1;"
offset="1"
id="stop5237" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6116"
id="linearGradient5307"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
x1="432.34528"
y1="197.17313"
x2="432.34528"
y2="544.38947" />
<linearGradient
id="linearGradient5240">
<stop
style="stop-color:#a00000;stop-opacity:1;"
offset="0"
id="stop5242" />
<stop
style="stop-color:#00ff00;stop-opacity:1;"
offset="1"
id="stop5244" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5418"
id="linearGradient5424"
x1="-267.4476"
y1="-44.398079"
x2="-27.453287"
y2="227.74478"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.29905175,0,0,0.29902527,-217.64832,179.79323)" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="54.939906"
inkscape:cy="41.18017"
inkscape:document-units="px"
inkscape:current-layer="layer5"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1030"
inkscape:window-x="-2"
inkscape:window-y="27"
inkscape:window-maximized="1"
showguides="false"
inkscape:guide-bbox="true"
inkscape:snap-global="false">
<sodipodi:guide
orientation="1,0"
position="48.986611,184.92806"
id="guide6942" />
<sodipodi:guide
orientation="0,1"
position="96.843761,183.49949"
id="guide6944" />
<inkscape:grid
type="xygrid"
id="grid6946"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
<sodipodi:guide
orientation="1,0"
position="42.385351,259.70081"
id="guide7007" />
<sodipodi:guide
orientation="1,0"
position="23.192451,157.17033"
id="guide7009" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Box"
inkscape:groupmode="layer"
id="layer1"
transform="translate(310.95069,-161.11145)"
style="display:inline">
<rect
style="opacity:0.98999999;fill:#ffffff;fill-opacity:0.44769874;stroke:#000000;stroke-width:2.54482269;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0.73127753;stroke-dasharray:10.17929081, 10.17929081;stroke-dashoffset:0;filter:url(#filter5252)"
id="rect5223"
width="247.45247"
height="16.023874"
x="169.8452"
y="186.4931"
rx="12.85704"
ry="12.03072"
transform="matrix(0.26144894,0,0,0.10652205,-338.34952,147.35319)" />
<rect
style="fill:#000000;fill-opacity:1;stroke:#363434;stroke-width:5.52553797;stroke-miterlimit:4;stroke-opacity:0.72246692;stroke-dasharray:none;display:inline;filter:url(#filter4948);enable-background:new"
id="rect3597-9"
width="312.62057"
height="303.76965"
x="-307.06512"
y="-56.173706"
rx="84.17984"
ry="78.412369"
transform="matrix(0.29904531,0,0,0.30406209,-217.64929,180.19724)" />
<rect
style="fill:url(#linearGradient5424);fill-opacity:1;stroke:#000000;stroke-width:1.66618872;stroke-miterlimit:4;stroke-opacity:0.44052866;stroke-dasharray:none;display:inline;enable-background:new"
id="rect3597"
width="93.487717"
height="92.364845"
x="-309.98273"
y="161.9846"
rx="25.173586"
ry="23.84223" />
<text
xml:space="preserve"
style="text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
x="-161.42857"
y="44.714287"
id="text3313"
sodipodi:linespacing="100%"
transform="translate(-310.95069,-61.88855)"><tspan
sodipodi:role="line"
id="tspan3315"
x="-161.42857"
y="44.714287" /></text>
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Graphic"
style="display:inline"
transform="translate(0,-223)">
<g
transform="matrix(0.84235006,0,0,0.87814743,-147.32803,-607.19976)"
style="display:inline"
id="g4233">
<g
id="g4249"
transform="translate(302.85714,5)">
<path
inkscape:connector-curvature="0"
id="rect5625-94"
d="m -110.09153,974.32764 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57695 0,1.42764 -1.400586,2.57696 -3.140327,2.57696 l -75.575623,0 c -1.73974,0 -3.14033,-1.14932 -3.14033,-2.57696 0,-1.42763 1.40059,-2.57695 3.14033,-2.57695 z"
style="opacity:0.92941176;fill:url(#linearGradient5285);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect5625-1"
d="m -110.09153,967.19287 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57696 0,1.42763 -1.400586,2.57696 -3.140327,2.57696 l -75.575623,0 c -1.73974,0 -3.14033,-1.14933 -3.14033,-2.57696 0,-1.42764 1.40059,-2.57696 3.14033,-2.57696 z"
style="opacity:0.92941176;fill:url(#linearGradient5287);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect5625-3"
d="m -110.09153,960.05817 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57695 0,1.42764 -1.400586,2.57696 -3.140327,2.57696 l -75.575623,0 c -1.73974,0 -3.14033,-1.14932 -3.14033,-2.57696 0,-1.42763 1.40059,-2.57695 3.14033,-2.57695 z"
style="opacity:0.92941176;fill:url(#linearGradient5289);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect5625-34"
d="m -110.09153,952.9234 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57696 0,1.42763 -1.400586,2.57695 -3.140327,2.57695 l -75.575623,0 c -1.73974,0 -3.14033,-1.14932 -3.14033,-2.57695 0,-1.42764 1.40059,-2.57696 3.14033,-2.57696 z"
style="opacity:0.92941176;fill:url(#linearGradient5291);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect5625-5"
d="m -110.09153,988.59711 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57695 0,1.42764 -1.400586,2.57696 -3.140327,2.57696 l -75.575623,0 c -1.73974,0 -3.14033,-1.14932 -3.14033,-2.57696 0,-1.42763 1.40059,-2.57695 3.14033,-2.57695 z"
style="opacity:0.92941176;fill:url(#linearGradient5293);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect5625-2"
d="m -110.09153,1010.0013 75.575623,0 c 1.739741,0 3.140327,1.1493 3.140327,2.5769 0,1.4277 -1.400586,2.577 -3.140327,2.577 l -75.575623,0 c -1.73974,0 -3.14033,-1.1493 -3.14033,-2.577 0,-1.4276 1.40059,-2.5769 3.14033,-2.5769 z"
style="opacity:0.92941176;fill:url(#linearGradient5295);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect5625-92"
d="m -110.09153,1002.8666 75.575623,0 c 1.739741,0 3.140327,1.1493 3.140327,2.5769 0,1.4277 -1.400586,2.577 -3.140327,2.577 l -75.575623,0 c -1.73974,0 -3.14033,-1.1493 -3.14033,-2.577 0,-1.4276 1.40059,-2.5769 3.14033,-2.5769 z"
style="opacity:0.92941176;fill:url(#linearGradient5297);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect5625-12"
d="m -110.09153,1017.1361 75.575623,0 c 1.739741,0 3.140327,1.1493 3.140327,2.577 0,1.4276 -1.400586,2.5769 -3.140327,2.5769 l -75.575623,0 c -1.73974,0 -3.14033,-1.1493 -3.14033,-2.5769 0,-1.4277 1.40059,-2.577 3.14033,-2.577 z"
style="opacity:0.92941176;fill:url(#linearGradient5299);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect5625-7"
d="m -110.09153,1031.4055 75.575623,0 c 1.739741,0 3.140327,1.1493 3.140327,2.577 0,1.4276 -1.400586,2.5769 -3.140327,2.5769 l -75.575623,0 c -1.73974,0 -3.14033,-1.1493 -3.14033,-2.5769 0,-1.4277 1.40059,-2.577 3.14033,-2.577 z"
style="opacity:0.92941176;fill:url(#linearGradient5301);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect5625-8"
d="m -110.09153,1024.2708 75.575623,0 c 1.739741,0 3.140327,1.1493 3.140327,2.5769 0,1.4276 -1.400586,2.577 -3.140327,2.577 l -75.575623,0 c -1.73974,0 -3.14033,-1.1494 -3.14033,-2.577 0,-1.4276 1.40059,-2.5769 3.14033,-2.5769 z"
style="opacity:0.92941176;fill:url(#linearGradient5303);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect5625-36"
d="m -110.09153,995.73181 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57696 0,1.42763 -1.400586,2.57693 -3.140327,2.57693 l -75.575623,0 c -1.73974,0 -3.14033,-1.1493 -3.14033,-2.57693 0,-1.42764 1.40059,-2.57696 3.14033,-2.57696 z"
style="opacity:0.92941176;fill:url(#linearGradient5305);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="rect5625-35"
d="m -110.09153,981.46234 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57696 0,1.42763 -1.400586,2.57696 -3.140327,2.57696 l -75.575623,0 c -1.73974,0 -3.14033,-1.14933 -3.14033,-2.57696 0,-1.42764 1.40059,-2.57696 3.14033,-2.57696 z"
style="opacity:0.92941176;fill:url(#linearGradient5307);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
</g>
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer5"
inkscape:label="Shadow"
style="opacity:0.67094014;display:inline"
transform="translate(0,-223)" />
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="Text"
style="display:inline"
transform="translate(0,-223)" />
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Gloss"
style="opacity:0.47435901;display:inline"
transform="translate(0,-223)">
<path
style="fill:url(#linearGradient5019);fill-opacity:1;stroke:none;display:inline;enable-background:new"
d="m 26.927629,225.52102 c -13.666067,0 -24.6717697,10.39098 -24.6717697,23.29594 l 0,42.58307 c 0,3.90838 1.0166466,7.58357 2.8036102,10.81163 C 1.943061,227.97415 67.223598,227.94658 80.756945,228.73555 77.08802,226.69323 72.80951,225.52102 68.224808,225.52102 l -41.297179,0 z"
id="path4983"
inkscape:connector-curvature="0" />
<path
style="fill:url(#linearGradient5027);fill-opacity:1;stroke:none;display:inline;enable-background:new"
d="m 92.887232,280.51365 c -3.599605,15.1144 -24.925793,26.61922 -44.577402,34.18231 l 19.914978,0 c 13.666067,0 24.662424,-10.39098 24.662424,-23.29593 l 0,-10.88638 z"
id="rect4484"
inkscape:connector-curvature="0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 14 B

1
mixer/icons/icon-small.svg Symbolic link
View File

@ -0,0 +1 @@
icon-large.svg

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 14 B

View File

@ -1,22 +0,0 @@
# -*- mode: makefile; -*-
all: Mixer
Mixer_SRCS := $(wildcard src/*.C src/*.fl src/Engine/*.C)
Mixer_SRCS:=$(Mixer_SRCS:.fl=.C)
Mixer_SRCS:=$(sort $(Mixer_SRCS))
Mixer_OBJS:=$(Mixer_SRCS:.C=.o)
Mixer_LIBS := $(FLTK_LIBS) $(JACK_LIBS) $(LASH_LIBS) $(LRDF_LIBS) $(LIBLO_LIBS) $(SIGCPP_LIBS) $(XPM_LIBS)
Mixer_CFLAGS := $(FLTK_CFLAGS) $(JACK_CFLAGS) $(LIBLO_CFLAGS) $(SIGCPP_CFLAGS) $(XPM_CFLAGS)
src/mixer: $(Mixer_OBJS) FL/libfl_widgets.a nonlib/libnonlib.a
@ echo -n Linking mixer...
@ $(CXX) $(CXXFLAGS) $(Mixer_LIBS) $(Mixer_OBJS) -o $@ -LFL -lfl_widgets -Lnonlib -lnonlib -ldl && echo $(DONE)
Mixer: src/mixer
Mixer_clean:
rm -f $(Mixer_OBJS) src/mixer

View File

@ -1,8 +1,9 @@
[Desktop Entry]
Name=Non Mixer
Comment=Modular Digital Audio Workstation - Mixer
Comment[fr]=Station de travail audio-numérique modulaire - Mixeur
Exec=@BIN_PATH@/non-mixer
Terminal=false
Type=Application
Icon=non-mixer
Categories=Application;AudioVideo;Audio;
Categories=AudioVideo;Audio;

View File

@ -1 +0,0 @@
../nonlib

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 864 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@ -1 +0,0 @@
../scripts/

177
mixer/src/AUX_Module.C Normal file
View File

@ -0,0 +1,177 @@
/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#include <FL/fl_draw.H>
#include "AUX_Module.H"
#include "dsp.h"
/* The purpose of this module is to provide auxiliary outputs, with
* gain. This allows one to create a 'send' type topology without
* having to use an extra strip to control the 'send' gain. */
AUX_Module::AUX_Module ( ) : JACK_Module ( false )
{
is_default( false );
{
Port p( this, Port::INPUT, Port::CONTROL, "Gain (dB)" );
p.hints.type = Port::Hints::LINEAR;
p.hints.ranged = true;
p.hints.minimum = -70.0f;
p.hints.maximum = 6.0f;
p.hints.default_value = 0.0f;
p.connect_to( new float );
p.control_value( p.hints.default_value );
add_port( p );
}
log_create();
color( FL_DARK1 );
smoothing.sample_rate( sample_rate() );
}
AUX_Module::~AUX_Module ( )
{
configure_outputs(0);
delete (float*)control_input[0].buffer();
}
void
AUX_Module::number ( int n )
{
JACK_Module::number(n);
char s[10];
snprintf( s, sizeof(s), "aux-%c", 'A' + n );
prefix( s );
snprintf( s, sizeof(s), "Aux (%c)", 'A' + n );
copy_label( s );
}
void
AUX_Module::handle_sample_rate_change ( nframes_t n )
{
smoothing.sample_rate( n );
}
void
AUX_Module::process ( nframes_t nframes )
{
if ( unlikely( bypass() ) )
{
for ( unsigned int i = 0; i < audio_input.size(); ++i )
{
if ( audio_input[i].connected() )
buffer_fill_with_silence( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), nframes );
}
}
else
{
float gt = DB_CO( control_input[0].control_value() );
sample_t gainbuf[nframes];
bool use_gainbuf = smoothing.apply( gainbuf, nframes, gt );
if ( unlikely( use_gainbuf ) )
{
for ( unsigned int i = 0; i < audio_input.size(); ++i )
{
if ( audio_input[i].connected() )
buffer_copy_and_apply_gain_buffer( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), (sample_t*)audio_input[i].buffer(), gainbuf, nframes );
}
}
else
{
for ( unsigned int i = 0; i < audio_input.size(); ++i )
{
if ( audio_input[i].connected() )
buffer_copy_and_apply_gain( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), (sample_t*)audio_input[i].buffer(), nframes, gt );
}
}
}
}
void
AUX_Module::draw ( void )
{
int W = 5;
child(0)->size( w() - W, h() );
Module::draw_box(x(),y(),w() - W,h());
Module::draw_label(x(),y(),w() - W,h());
Module *m = this;
fl_color( fl_darker( FL_FOREGROUND_COLOR ) );
int spacing, offset;
spacing = h() / m->ninputs();
offset = spacing / 2;
for ( int i = m->ninputs(); i--; )
{
int xi = offset + ( spacing * i );
fl_rectf( m->x() + m->w() - W, m->y() + xi, W, 2 );
}
}
bool
AUX_Module::configure_outputs ( int n )
{
int on = audio_output.size();
if ( n > on )
{
for ( int i = on; i < n; ++i )
{
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) );
}
}
else
{
for ( int i = on; i > n; --i )
{
audio_output.back().disconnect();
audio_output.pop_back();
}
}
return true;
}
bool
AUX_Module::configure_inputs ( int n )
{
bool b = JACK_Module::configure_inputs( n );
if ( b )
{
return configure_outputs( n );
}
return false;
}

53
mixer/src/AUX_Module.H Normal file
View File

@ -0,0 +1,53 @@
/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#pragma once
#include "JACK_Module.H"
#include "dsp.h"
class AUX_Module : public JACK_Module
{
Value_Smoothing_Filter smoothing;
public:
virtual void number ( int v );
virtual const char *name ( void ) const { return "AUX"; }
int can_support_inputs ( int n ) { return n > 0 ? n : -1; }
virtual bool configure_outputs ( int n );
virtual bool configure_inputs ( int n );
AUX_Module ( );
virtual ~AUX_Module ( );
LOG_CREATE_FUNC( AUX_Module );
virtual void handle_sample_rate_change ( nframes_t n );
protected:
virtual void draw ( void );
virtual void process ( nframes_t nframes );
};

View File

@ -72,11 +72,11 @@
#include "FL/test_press.H"
#include "debug.h"
#include "Engine/Engine.H"
#include "Group.H"
#include "Mixer_Strip.H"
#include <dsp.h>
#include "Mixer.H"
extern char *instance_name;
@ -86,7 +86,8 @@ extern char *instance_name;
Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "")
{
_engine = NULL;
/* not really deleting here, but reusing this variable */
_deleting = true;
int X = 0;
int Y = 0;
@ -127,7 +128,7 @@ Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "")
o->type( Fl_Scroll::VERTICAL );
{ Fl_Pack *o = modules_pack = new Fl_Pack( X, Y, W, H );
o->type( Fl_Pack::VERTICAL );
o->spacing( 10 );
o->spacing( 6 );
o->end();
Fl_Group::current()->resizable( o );
}
@ -144,11 +145,9 @@ Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "")
o->color( FL_BACKGROUND_COLOR );
o->box( FL_NO_BOX );
o->type( Fl_Scroll::VERTICAL );
{ Fl_Flowpack *o = controls_pack = new Fl_Flowpack( X, Y, W, H );
o->type( FL_VERTICAL );
o->hspacing( 10 );
o->vspacing( 10 );
o->box( FL_NO_BOX );
{ Fl_Pack *o = controls_pack = new Fl_Pack( X, Y, W, H );
o->type( Fl_Pack::VERTICAL );
o->spacing( 5 );
// o->color( FL_RED );
o->end();
Fl_Group::current()->resizable( o );
@ -163,6 +162,8 @@ Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "")
end();
log_create();
_deleting = false;
}
Chain::~Chain ( )
@ -171,15 +172,31 @@ Chain::~Chain ( )
log_destroy();
engine()->lock();
_deleting = true;
/* FIXME: client may already be dead during teardown if group is destroyed first. */
if ( client() )
client()->lock();
for ( unsigned int i = scratch_port.size(); i--; )
free( (sample_t*)scratch_port[i].buffer() );
scratch_port.clear();
/* if we leave this up to FLTK, it will happen after we've
already destroyed the engine */
already destroyed the client */
modules_pack->clear();
modules_pack = NULL;
controls_pack->clear();
modules_pack = NULL;
delete _engine;
_engine = NULL;
if ( client() )
client()->unlock();
}
Group *
Chain::client ( void )
{
return strip()->group();
}
@ -221,7 +238,7 @@ Chain::set ( Log_Entry &e )
void
Chain::log_children ( void )
Chain::log_children ( void ) const
{
log_create();
@ -247,13 +264,12 @@ Chain::initialize_with_default ( void )
m->is_default( true );
m->chain( this );
m->configure_outputs( 1 );
m->initialize();
add( m );
}
{ Module *m = new Gain_Module();
m->is_default( true );
m->initialize();
m->chain(this);
add( m );
}
@ -265,7 +281,6 @@ Chain::initialize_with_default ( void )
{ JACK_Module *m = new JACK_Module();
m->is_default( true );
m->chain( this );
m->initialize();
add( m );
}
}
@ -293,6 +308,38 @@ void Chain::cb_handle(Fl_Widget* o, void* v) {
((Chain*)(v))->cb_handle(o);
}
void
Chain::remove ( Controller_Module *m )
{
DMESSAGE( "Removing controller module from chain" );
client()->lock();
m->disconnect();
controls_pack->remove( m );
modules_pack->remove( m );
build_process_queue();
client()->unlock();
redraw();
}
void
Chain::send_feedback ( bool force )
{
for ( int i = 0; i < modules(); i++ )
module(i)->send_feedback( force );
}
void
Chain::schedule_feedback ( void )
{
for ( int i = 0; i < modules(); i++ )
module(i)->schedule_feedback();
}
/* remove a module from the chain. this isn't guaranteed to succeed,
* because removing the module might result in an invalid routing */
@ -311,11 +358,15 @@ Chain::remove ( Module *m )
fl_alert( "Can't remove module at this point because the resultant chain is invalid" );
}
client()->lock();
strip()->handle_module_removed( m );
modules_pack->remove( m );
configure_ports();
client()->unlock();
}
/* determine number of output ports, signal if changed. */
@ -324,10 +375,10 @@ Chain::configure_ports ( void )
{
int nouts = 0;
engine()->lock();
client()->lock();
for ( int i = 0; i < modules(); ++i )
{
{
module( i )->configure_inputs( nouts );
nouts = module( i )->noutputs();
}
@ -338,39 +389,82 @@ Chain::configure_ports ( void )
if ( scratch_port.size() < req_buffers )
{
for ( unsigned int i = scratch_port.size(); i--; )
delete[] (sample_t*)scratch_port[i].buffer();
scratch_port.clear();
for ( unsigned int i = 0; i < req_buffers; ++i )
{
Module::Port p( NULL, Module::Port::OUTPUT, Module::Port::AUDIO );
p.connect_to( new sample_t[engine()->nframes()] );
buffer_fill_with_silence( (sample_t*)p.buffer(), engine()->nframes() );
for ( unsigned int i = req_buffers - scratch_port.size(); i--; )
{
Module::Port p( NULL, Module::Port::OUTPUT, Module::Port::AUDIO );
p.set_buffer( buffer_alloc( client()->nframes() ) );
buffer_fill_with_silence( (sample_t*)p.buffer(), client()->nframes() );
scratch_port.push_back( p );
}
}
}
else if ( scratch_port.size() > req_buffers )
{
for ( unsigned int i = scratch_port.size() - req_buffers; i--; )
{
free(scratch_port.back().buffer());
scratch_port.pop_back();
}
}
build_process_queue();
engine()->unlock();
client()->unlock();
parent()->redraw();
}
/** invoked from the JACK latency callback... We need to update the latency values on this chains ports */
void
Chain::set_latency ( JACK::Port::direction_e dir )
{
nframes_t tmax = 0;
nframes_t tmin = 0;
nframes_t added_min = 0;
nframes_t added_max = 0;
for ( int i = 0; i < modules(); i++ )
{
Module *m;
if ( dir == JACK::Port::Input )
m = module( i );
else
m = module( (modules() - 1) - i );
nframes_t min,max;
min = max = 0;
nframes_t a = m->get_module_latency();
added_min += a;
added_max += a;
if ( dir == JACK::Port::Input ? m->aux_audio_input.size() : m->aux_audio_output.size() )
{
m->get_latency( dir, &min, &max );
tmin = 0;
added_min = 0;
}
if ( min > tmin )
tmin = min;
if ( max > tmax )
tmax = max;
m->set_latency( dir, tmin + added_min, tmax + added_max );
}
}
int
Chain::get_module_instance_number ( Module *m )
{
int n = 0;
for ( int i = 0; i < modules(); ++i )
{
if ( module(i) == m )
break;
if ( ! strcmp( module(i)->name(), m->name() ) )
if ( ! strcmp( module(i)->base_label(), m->base_label() ) )
n++;
}
return n;
}
@ -426,43 +520,42 @@ Chain::maximum_name_length ( void )
return JACK::Client::maximum_name_length() - ( strlen( instance_name ) + 1 );
}
void
Chain::freeze_ports ( void )
{
for ( int i = 0; i < modules(); i++ )
{
Module *m = module(i);
m->freeze_ports();
}
}
void
Chain::thaw_ports ( void )
{
for ( int i = 0; i < modules(); i++ )
{
Module *m = module(i);
m->thaw_ports();
}
}
/* rename chain... we have to let our modules know our name has
* changed so they can take the appropriate action (in particular the
* JACK module). */
void
Chain::name ( const char *name )
{
char ename[512];
snprintf( ename, sizeof(ename), "%s/%s", instance_name, name );
if ( ! _engine )
{
_engine = new Engine( &Chain::process, this );
engine()->buffer_size_callback( &Chain::buffer_size, this );
const char *jack_name = engine()->init( ename );
if ( ! jack_name )
{
_engine = NULL;
fl_alert( "Could not create JACK client. Perhaps the sound device already in use. In any event, now I'll die." );
exit( 1 );
return;
}
}
else
{
DMESSAGE( "Renaming JACK client from \"%s\" to \"%s\"", _name, ename );
_name = engine()->name( ename );
/* FIXME: discarding the name jack picked is technically wrong! */
}
_name = name;
if ( strip()->group() )
{
if ( strip()->group()->single() )
/* we are the owner of this group and its only member, so
* rename it */
strip()->group()->name(name);
}
for ( int i = 0; i < modules(); ++i )
{
module( i )->handle_chain_name_changed();
@ -490,22 +583,28 @@ Chain::add ( Controller_Module *m )
bool
Chain::insert ( Module *m, Module *n )
{
client()->lock();
engine()->lock();
Module::sample_rate( client()->sample_rate() );
n->resize_buffers( client()->nframes() );
/* inserting a new instance */
if ( -1 == n->number() )
n->number( get_module_instance_number( n ) );
if ( !m )
{
if ( modules() == 0 && n->can_support_inputs( 0 ) >= 0 )
{
n->chain( this );
n->configure_inputs( 0 );
modules_pack->add( n );
n->chain( this );
}
else if ( n->can_support_inputs( module( modules() - 1 )->noutputs() ) >= 0 )
{
n->chain( this );
n->configure_inputs( module( modules() - 1 )->noutputs() );
modules_pack->add( n );
n->chain( this );
}
else
{
@ -518,6 +617,8 @@ Chain::insert ( Module *m, Module *n )
{
int i = modules_pack->find( m );
n->chain( this );
if ( 0 == i )
{
/* inserting to head of chain*/
@ -542,9 +643,15 @@ Chain::insert ( Module *m, Module *n )
}
modules_pack->insert( *n, i );
n->chain( this );
}
strip()->handle_module_added( n );
configure_ports();
client()->unlock();
DMESSAGE( "Module \"%s\" has %i:%i audio and %i:%i control ports",
n->name(),
n->ninputs(),
@ -552,19 +659,14 @@ Chain::insert ( Module *m, Module *n )
n->ncontrol_inputs(),
n->ncontrol_outputs() );
strip()->handle_module_added( n );
configure_ports();
engine()->unlock();
n->initialize();
return true;
err:
DMESSAGE( "Insert failed" );
client()->unlock();
engine()->unlock();
DMESSAGE( "Insert failed" );
return false;
}
@ -573,13 +675,13 @@ err:
void
Chain::add_control ( Controller_Module *m )
{
engine()->lock();
client()->lock();
controls_pack->add( m );
configure_ports();
engine()->unlock();
client()->unlock();
controls_pack->redraw();
}
@ -596,7 +698,7 @@ Chain::draw_connections ( Module *m )
fl_push_clip( X, Y, W, H );
Fl_Color c =fl_color_average( FL_WHITE, FL_YELLOW, 0.50 );
Fl_Color c = FL_FOREGROUND_COLOR;
fl_color( c );
if ( m->ninputs() )
@ -605,7 +707,7 @@ Chain::draw_connections ( Module *m )
offset = spacing / 2;
for ( int i = m->ninputs(); i--; )
fl_rectf( m->x() + offset + ( spacing * i ), m->y() - 5, 2, 5 );
fl_rectf( m->x() + offset + ( spacing * i ), m->y() - 3, 2, 3 );
}
fl_color( fl_darker( c ) );
@ -615,7 +717,7 @@ Chain::draw_connections ( Module *m )
spacing = w() / m->noutputs();
offset = spacing / 2;
for ( int i = m->noutputs(); i--; )
fl_rectf( m->x() + offset + ( spacing * i ), m->y() + m->h(), 2, 5 );
fl_rectf( m->x() + offset + ( spacing * i ), m->y() + m->h(), 2, 3 );
}
fl_pop_clip();
@ -637,6 +739,8 @@ Chain::add_to_process_queue ( Module *m )
void
Chain::build_process_queue ( void )
{
client()->lock();
process_queue.clear();
for ( int i = 0; i < modules(); ++i )
@ -668,14 +772,16 @@ Chain::build_process_queue ( void )
/* connect all the ports to the buffers */
for ( int i = 0; i < modules(); ++i )
{
Module *m = module( i );
for ( unsigned int j = 0; j < m->audio_input.size(); ++j )
{
m->audio_input[j].connect_to( &scratch_port[j] );
m->audio_input[j].set_buffer( scratch_port[j].buffer() );
}
for ( unsigned int j = 0; j < m->audio_output.size(); ++j )
{
m->audio_output[j].connect_to( &scratch_port[j] );
m->audio_output[j].set_buffer( scratch_port[j].buffer() );
}
m->handle_port_connection_change();
@ -702,6 +808,8 @@ Chain::build_process_queue ( void )
/* delete[] s; */
/* } */
/* } */
client()->unlock();
}
void
@ -732,6 +840,59 @@ Chain::resize ( int X, int Y, int W, int H )
controls_pack->size( W, controls_pack->h() );
}
void
Chain::get_output_ports ( std::list<std::string> &sl)
{
for ( int i = 0; i < modules(); i++ )
{
Module *m = module(i);
for ( unsigned int j = 0; j < m->aux_audio_output.size(); j++ )
{
char *s;
asprintf( &s, "%s/%s",
"*",
m->aux_audio_output[j].jack_port()->name() );
sl.push_back( s );
free(s);
if ( ! strip()->group()->single() )
{
asprintf( &s, "%s/%s",
strip()->group()->name(),
m->aux_audio_output[j].jack_port()->name() );
sl.push_back( s );
free(s);
}
}
}
}
void
Chain::auto_connect_outputs ( void )
{
for ( int i = 0; i < modules(); i++ )
{
module(i)->auto_connect_outputs();
}
}
void
Chain::auto_disconnect_outputs ( void )
{
for ( int i = 0; i < modules(); i++ )
{
module(i)->auto_disconnect_outputs();
}
}
/*****************/
@ -762,38 +923,25 @@ Chain::do_export ( const char *filename )
/**********/
/* Engine */
/* Client */
/**********/
void
Chain::process ( nframes_t nframes, void *v )
{
((Chain*)v)->process( nframes );
}
void
Chain::process ( nframes_t nframes )
{
for ( std::list<Module*>::const_iterator i = process_queue.begin(); i != process_queue.end(); ++i )
{
Module *m = *i;
if ( ! m->bypass() )
m->process( nframes );
Module *m = *i;
m->process( nframes );
}
}
void
Chain::buffer_size ( nframes_t nframes, void *v )
{
((Chain*)v)->buffer_size( nframes );
}
void
Chain::buffer_size ( nframes_t nframes )
{
for ( unsigned int i = scratch_port.size(); i--; )
delete[] (sample_t*)scratch_port[i].buffer();
free(scratch_port[i].buffer());
scratch_port.clear();
configure_ports();
@ -805,3 +953,69 @@ Chain::buffer_size ( nframes_t nframes )
m->resize_buffers( nframes );
}
}
int
Chain::sample_rate_change ( nframes_t nframes )
{
Module::sample_rate ( nframes );
for ( int i = 0; i < modules(); ++i )
{
Module *m = module(i);
m->handle_sample_rate_change( nframes );
}
return 0;
}
/* handle jack port connection change */
void
Chain::port_connect ( jack_port_id_t a, jack_port_id_t b, int connect )
{
if ( _deleting )
return;
/* this is called from JACK non-RT thread... */
if ( jack_port_is_mine( client()->jack_client(), jack_port_by_id( client()->jack_client(), a ) ) ||
jack_port_is_mine( client()->jack_client(), jack_port_by_id( client()->jack_client(), b ) ))
{
Fl::awake( Chain::update_connection_status, this );
}
}
void
Chain::update ( void )
{
for ( int i = 0; i < controls_pack->children(); ++i )
{
Controller_Module *cm = (Controller_Module*)controls_pack->child( i );
cm->update();
}
for ( int i = 0; i < modules(); i++ )
{
Module *m = module(i);
m->update();
}
}
void
Chain::update_connection_status ( void *v )
{
((Chain*)v)->update_connection_status();
}
void
Chain::update_connection_status ( void )
{
for ( int i = 0; i < modules(); i++ )
{
Module *m = module(i);
if ( !strcmp( m->basename(), "JACK" ) )
{
((JACK_Module*)m)->update_connection_status();
}
}
}

View File

@ -28,17 +28,17 @@
#include <vector>
#include <list>
#include "Loggable.H"
#include "Group.H"
class Mixer_Strip;
class Fl_Flowpack;
class Fl_Flip_Button;
class Engine;
class Controller_Module;
class Chain : public Fl_Group, public Loggable {
Fl_Flip_Button *tab_button;
Fl_Flowpack *controls_pack;
Fl_Pack *controls_pack;
Fl_Group *chain_tab;
Fl_Group *control_tab;
Fl_Pack *modules_pack;
@ -50,10 +50,10 @@ class Chain : public Fl_Group, public Loggable {
std::vector <Module::Port> scratch_port;
Engine *_engine;
Fl_Callback *_configure_outputs_callback;
void *_configure_outputs_userdata;
bool _deleting;
private:
@ -67,11 +67,8 @@ private:
void build_process_queue ( void );
void add_to_process_queue ( Module *m );
static void process ( nframes_t, void * );
void process ( nframes_t );
static void buffer_size ( nframes_t nframes, void *v );
void buffer_size ( nframes_t nframes );
static void update_connection_status ( void *v );
void update_connection_status ( void );
protected:
@ -80,10 +77,21 @@ protected:
public:
void auto_connect_outputs ( void );
void auto_disconnect_outputs ( void );
void get_output_ports ( std::list<std::string> &sl);
void port_connect ( jack_port_id_t a, jack_port_id_t b, int connect );
void buffer_size ( nframes_t nframes );
int sample_rate_change ( nframes_t nframes );
void process ( nframes_t );
Chain ( int X, int Y, int W, int H, const char *L = 0 );
Chain ( );
virtual ~Chain ( );
void update ( void );
void draw ( void );
void resize ( int X, int Y, int W, int H );
@ -92,6 +100,9 @@ public:
const char *name ( void ) const { return _name; }
void name ( const char *name );
void send_feedback ( bool force );
void schedule_feedback ( void );
int get_module_instance_number ( Module *m );
void configure_ports ( void );
@ -99,8 +110,9 @@ public:
bool can_support_input_channels ( int n );
int modules ( void ) const { return modules_pack->children(); }
int modules ( void ) const { return modules_pack ? modules_pack->children() : 0; }
Module *module ( int n ) const { return (Module*)modules_pack->child( n ); }
void remove ( Controller_Module *m );
void remove ( Module *m );
bool add ( Module *m );
bool add ( Controller_Module *m );
@ -119,13 +131,20 @@ public:
_configure_outputs_userdata = v;
}
void set_latency ( JACK::Port::direction_e );
Fl_Callback * configure_outputs_callback ( void ) const { return _configure_outputs_callback; }
void log_children ( void );
virtual void log_children ( void ) const;
static unsigned int maximum_name_length ( void );
Engine *engine ( void ) const { return _engine; }
Group *client ( void );
void freeze_ports ( void );
void thaw_ports ( void );
// void client ( Client * );
LOG_CREATE_FUNC( Chain );
};

View File

@ -30,33 +30,51 @@
#include <FL/Fl_Menu_Button.H>
#include <FL/Fl_Menu_.H>
#include <FL/Fl_Light_Button.H>
#include "FL/Crystal_Boxtypes.H"
#include <FL/fl_draw.H>
#include "FL/Fl_Arc_Dial.H"
#include "FL/Fl_DialX.H"
#include "FL/Fl_Labelpad_Group.H"
#include "FL/Fl_Value_SliderX.H"
#include "Panner.H"
#include "FL/test_press.H"
#include "FL/menu_popup.H"
#include "Engine/Engine.H"
#include "Chain.H"
#include "OSC/Endpoint.H"
// needed for mixer->endpoint
#include "Mixer.H"
#include "Spatialization_Console.H"
#include "string_util.h"
const float CONTROL_UPDATE_FREQ = 0.2f;
bool Controller_Module::learn_by_number = false;
bool Controller_Module::_learn_mode = false;
Controller_Module* Controller_Module::_learning_control = NULL;
void
Controller_Module::take_focus ( void )
{
bool v = visible_focus();
if ( ! v )
set_visible_focus();
Fl_Widget::take_focus();
if ( ! v )
clear_visible_focus();
}
Controller_Module::Controller_Module ( bool is_default ) : Module( is_default, 50, 100, name() )
{
// label( "" );
box( FL_NO_BOX );
_horizontal = true;
_pad = true;
control = 0;
control_value =0.0f;
@ -71,15 +89,12 @@ Controller_Module::Controller_Module ( bool is_default ) : Module( is_default, 5
end();
Fl::add_timeout( CONTROL_UPDATE_FREQ, update_cb, this );
// clear_visible_focus();
log_create();
}
Controller_Module::~Controller_Module ( )
{
Fl::remove_timeout( update_cb, this );
log_destroy();
/* shutdown JACK port, if we have one */
@ -89,9 +104,32 @@ Controller_Module::~Controller_Module ( )
void
Controller_Module::handle_chain_name_changed()
{
if ( type() == SPATIALIZATION )
{
if ( Mixer::spatialization_console )
Mixer::spatialization_console->update();
}
// change_osc_path( generate_osc_path() );
}
void
Controller_Module::handle_control_disconnect ( Module::Port *p )
{
if ( type() == SPATIALIZATION )
{
if ( Mixer::spatialization_console )
Mixer::spatialization_console->update();
}
}
void
Controller_Module::disconnect ( void )
{
for ( unsigned int i = 0; i < control_output.size(); ++i )
control_output[i].disconnect();
}
void
@ -100,11 +138,21 @@ Controller_Module::get ( Log_Entry &e ) const
Module::get( e );
Port *p = control_output[0].connected_port();
Module *m = p->module();
e.add( ":module", m );
e.add( ":port", m->control_input_port_index( p ) );
e.add( ":mode", mode() );
if ( !p )
{
e.add( ":module", "" );
e.add( ":port", "" );
e.add( ":mode", "" );
}
else
{
Module *m = p->module();
e.add( ":module", m );
e.add( ":port", m->control_input_port_index( p ) );
e.add( ":mode", mode() );
}
}
void
@ -141,7 +189,6 @@ Controller_Module::set ( Log_Entry &e )
{
connect_to( &module->control_input[port] );
module->chain()->add_control( this );
label( module->control_input[port].name() );
}
for ( int i = 0; i < e.size(); ++i )
@ -163,45 +210,141 @@ Controller_Module::set ( Log_Entry &e )
void
Controller_Module::mode ( Mode m )
{
if( mode() != CV && m == CV )
{
if ( control_output[0].connected() )
{
chain()->engine()->lock();
chain()->client()->lock();
Port *p = control_output[0].connected_port();
char prefix[512];
JACK::Port po( chain()->engine(), JACK::Port::Input, p->name(), 0, "CV" );
const Module *m = p->module();
if ( m->number() >= 0 )
/* we do it this way now to ensure uniqueness */
snprintf( prefix, sizeof(prefix), "CV-%s/%s", m->label(), p->name() );
else
snprintf( prefix, sizeof(prefix), "CV-%s", p->name() );
if ( ! po.activate() )
{
fl_alert( "Could not activate JACK port \"%s\"", po.name() );
chain()->engine()->unlock();
return;
}
add_aux_cv_input( prefix, 0 );
if ( po.valid() )
{
jack_input.push_back( po );
}
chain()->engine()->unlock();
chain()->client()->unlock();
}
}
else if ( mode() == CV && m != CV )
{
chain()->engine()->lock();
chain()->client()->lock();
jack_input.back().shutdown();
jack_input.pop_back();
aux_audio_input.back().jack_port()->shutdown();
delete aux_audio_input.back().jack_port();
chain()->engine()->unlock();
aux_audio_input.pop_back();
chain()->client()->unlock();
}
_mode = m ;
}
bool
Controller_Module::connect_spatializer_radius_to ( Module *m )
{
Port *radius_port = NULL;
float radius_value = 0.0f;
for ( unsigned int i = 0; i < m->control_input.size(); ++i )
{
Port *p = &m->control_input[i];
if ( !strcasecmp( "Radius", p->name() ) )
/* 90.0f == p->hints.maximum && */
/* -90.0f == p->hints.minimum ) */
{
radius_port = p;
radius_value = p->control_value();
continue;
}
}
if ( ! radius_port )
return false;
if ( control_output.size() != 3 )
{
control_output.clear();
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
}
control_output[2].connect_to( radius_port );
maybe_create_panner();
Panner *o = (Panner*)control;
o->point( 0 )->radius( radius_value );
if ( Mixer::spatialization_console )
Mixer::spatialization_console->update();
return true;
}
void
Controller_Module::maybe_create_panner ( void )
{
if ( _type != SPATIALIZATION )
{
clear();
Panner *o = new Panner( 0,0, 92,92 );
o->box(FL_FLAT_BOX);
o->color(FL_GRAY0);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelcolor(FL_FOREGROUND_COLOR);
o->align(FL_ALIGN_TOP);
o->when(FL_WHEN_CHANGED);
label( "Spatialization" );
o->align(FL_ALIGN_TOP);
o->labelsize( 10 );
// o->callback( cb_panner_value_handle, new callback_data( this, azimuth_port_number, elevation_port_number ) );
o->callback( cb_spatializer_handle, this );
control = (Fl_Valuator*)o;
if ( _pad )
{
Fl_Labelpad_Group *flg = new Fl_Labelpad_Group( o );
flg->position( x(), y() );
flg->set_visible_focus();
size( flg->w(), flg->h() );
add( flg );
}
else
{
// o->clear_visible_focus();
o->resize( x(), y(), w(), h() );
add( o );
resizable( o );
init_sizes();
}
_type = SPATIALIZATION;
}
}
/** attempt to transform this controller into a spatialization
controller and connect to the given module's spatialization
control inputs. Returns true on success, false if given module
@ -209,6 +352,8 @@ Controller_Module::mode ( Mode m )
bool
Controller_Module::connect_spatializer_to ( Module *m )
{
connect_spatializer_radius_to( m );
/* these are for detecting related parameter groups which can be
better represented by a single control */
Port *azimuth_port = NULL;
@ -237,62 +382,45 @@ Controller_Module::connect_spatializer_to ( Module *m )
continue;
}
}
if ( ! ( azimuth_port && elevation_port ) )
return false;
control_output.clear();
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
if ( control_output.size() != 3 )
{
control_output.clear();
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
}
control_output[0].connect_to( azimuth_port );
control_output[1].connect_to( elevation_port );
{
clear();
maybe_create_panner();
Panner *o = (Panner*)control;
Panner *o = new Panner( 0,0, 100, 100 );
o->point( 0 )->azimuth( azimuth_value );
o->point( 0 )->elevation( elevation_value );
if ( Mixer::spatialization_console )
Mixer::spatialization_console->update();
o->box(FL_THIN_UP_BOX);
o->color(FL_GRAY0);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelcolor(FL_FOREGROUND_COLOR);
o->align(FL_ALIGN_TOP);
o->when(FL_WHEN_CHANGED);
o->label( "Spatialization" );
return true;
}
o->align(FL_ALIGN_TOP);
o->labelsize( 10 );
// o->callback( cb_panner_value_handle, new callback_data( this, azimuth_port_number, elevation_port_number ) );
void
Controller_Module::apply_label ( Port *p, Fl_Widget *o )
{
char path[256];
o->point( 0 )->azimuth( azimuth_value );
o->point( 0 )->elevation( elevation_value );
if ( is_default() )
snprintf( path, sizeof(path) - 1, "%s", p->name() );
else
snprintf( path, sizeof(path) - 1, "%s/%s", p->module()->label(), p->name() );
o->callback( cb_spatializer_handle, this );
control = (Fl_Valuator*)o;
if ( _pad )
{
Fl_Labelpad_Group *flg = new Fl_Labelpad_Group( o );
flg->position( x(), y() );
flg->set_visible_focus();
size( flg->w(), flg->h() );
add( flg );
}
else
{
o->resize( x(), y(), w(), h() );
add( o );
resizable( o );
init_sizes();
}
_type = SPATIALIZATION;
return true;
}
o->copy_label(path);
}
void
@ -306,9 +434,11 @@ Controller_Module::connect_to ( Port *p )
if ( p->hints.type == Module::Port::Hints::BOOLEAN )
{
Fl_Light_Button *o = new Fl_Light_Button( 0, 0, 40, 40, p->name() );
Fl_Button *o = new Fl_Button( 0, 0, 40, 40 );
w = o;
o->type( FL_TOGGLE_BUTTON );
o->value( p->control_value() );
o->selection_color( fl_color_average( FL_GRAY, FL_CYAN, 0.5 ) );
_type = TOGGLE;
@ -318,7 +448,8 @@ Controller_Module::connect_to ( Port *p )
else if ( p->hints.type == Module::Port::Hints::INTEGER )
{
Fl_Counter *o = new Fl_Counter(0, 0, 58, 24, p->name() );
Fl_Counter *o = new Fl_Counter(0, 0, 58, 24 );
control = o;
w = o;
@ -335,54 +466,79 @@ Controller_Module::connect_to ( Port *p )
o->value( p->control_value() );
}
else if ( p->hints.type == Module::Port::Hints::LOGARITHMIC )
// else if ( p->hints.type == Module::Port::Hints::LOGARITHMIC )
else
{
Fl_Value_SliderX *o = new Fl_Value_SliderX(0, 0, 30, 250, p->name() );
Fl_Value_SliderX *o = new Fl_Value_SliderX(0, 0, 30, 250 );
control = o;
w = o;
o->type(4);
o->color(FL_BACKGROUND_COLOR);
o->selection_color((Fl_Color)1);
if ( ! _horizontal )
{
o->size( 30, 250 );
o->type(FL_VERT_NICE_SLIDER);
}
else
{
o->size(250,20);
o->type(FL_HOR_NICE_SLIDER);
}
// o->type(4);
o->color( FL_BACKGROUND2_COLOR );
o->selection_color( fl_color_average( FL_GRAY, FL_CYAN, 0.5 ) );
o->minimum(1.5);
o->maximum(0);
o->value(1);
o->textsize(6);
// o->textsize(9);
if ( p->hints.ranged )
{
o->minimum( p->hints.maximum );
o->maximum( p->hints.minimum );
if ( ! _horizontal )
{
o->minimum( p->hints.maximum );
o->maximum( p->hints.minimum );
}
else
{
o->minimum( p->hints.minimum );
o->maximum( p->hints.maximum );
}
}
o->precision(2);
o->value( p->control_value() );
_type = SLIDER;
}
else
{
{ Fl_Arc_Dial *o = new Fl_Arc_Dial( 0, 0, 50, 50, p->name() );
w = o;
control = o;
/* else */
/* { */
/* { Fl_DialX *o = new Fl_DialX( 0, 0, 50, 50, p->name() ); */
/* w = o; */
/* control = o; */
if ( p->hints.ranged )
{
DMESSAGE( "Min: %f, max: %f", p->hints.minimum, p->hints.maximum );
o->minimum( p->hints.minimum );
o->maximum( p->hints.maximum );
}
/* if ( p->hints.ranged ) */
/* { */
/* DMESSAGE( "Min: %f, max: %f", p->hints.minimum, p->hints.maximum ); */
/* o->minimum( p->hints.minimum ); */
/* o->maximum( p->hints.maximum ); */
/* } */
o->color( fl_darker( FL_GRAY ) );
o->selection_color( FL_WHITE );
o->value( p->control_value() );
}
/* o->color( fl_darker( FL_GRAY ) ); */
/* o->selection_color( FL_WHITE ); */
/* o->value( p->control_value() ); */
/* } */
_type = KNOB;
}
/* _type = KNOB; */
/* } */
apply_label(p,control);
control_value = p->control_value();
w->set_visible_focus();
w->clear_visible_focus();
w->align(FL_ALIGN_TOP);
w->labelsize( 10 );
w->callback( cb_handle, this );
@ -394,29 +550,30 @@ Controller_Module::connect_to ( Port *p )
size( flg->w(), flg->h() );
flg->position( x(), y() );
add( flg );
resizable(flg);
// init_sizes();
}
else
{
/* HACK: hide label */
w->labeltype( FL_NO_LABEL );
if ( _type == TOGGLE )
{
w->align( FL_ALIGN_INSIDE );
}
else
{
w->labeltype( FL_NO_LABEL );
}
w->resize( x(), y(), this->w(), h() );
add( w );
resizable( w );
// init_sizes();
init_sizes();
}
}
void
Controller_Module::update_cb ( void *v )
Controller_Module::update ( void )
{
((Controller_Module*)v)->update_cb();
}
void
Controller_Module::update_cb ( void )
{
Fl::repeat_timeout( CONTROL_UPDATE_FREQ, update_cb, this );
/* we only need this in CV (JACK) mode, because with other forms
* of control the change happens in the GUI thread and we know it */
if ( mode() != CV )
@ -465,6 +622,11 @@ Controller_Module::cb_spatializer_handle ( Fl_Widget *w )
control_output[0].connected_port()->control_value( pan->point( 0 )->azimuth() );
control_output[1].connected_port()->control_value( pan->point( 0 )->elevation() );
}
if ( control_output[2].connected() )
{
control_output[2].connected_port()->control_value( pan->point( 0 )->radius() );
}
}
void
@ -486,6 +648,185 @@ Controller_Module::menu_cb ( const Fl_Menu_ *m )
mode( GUI );
else if ( ! strcmp( picked, "Mode/Control Voltage (JACK)" ) )
mode( CV );
else if ( ! strcmp( picked, "/Remove" ) )
command_remove();
else if ( ! strncmp( picked, "Connect To/", strlen( "Connect To/" ) ) )
{
char *peer_name = index( picked, '/' ) + 1;
*index( peer_name, '/' ) = 0;
// OSC::Signal s = (OSC::Signal*)m->mvalue()->user_data();
const char *path = ((OSC::Signal*)m->mvalue()->user_data())->path();
/* if ( ! _osc_output()->is_connected_to( ((OSC::Signal*)m->mvalue()->user_data()) ) ) */
/* { */
/* _persistent_osc_connections.push_back( strdup(path) ); */
Port *p = control_output[0].connected_port();
if ( learn_by_number )
mixer->osc_endpoint->add_translation( path, p->osc_number_path());
else
mixer->osc_endpoint->add_translation( path, p->osc_path() );
}
else if ( ! strncmp( picked, "Disconnect From/", strlen( "Disconnect From/" ) ) )
{
/* char *peer_name = index( picked, '/' ) + 1; */
/* *index( peer_name, '/' ) = 0; */
// OSC::Signal s = (OSC::Signal*)m->mvalue()->user_data();
const char *path = (const char*)m->mvalue()->user_data();
/* if ( ! _osc_output()->is_connected_to( ((OSC::Signal*)m->mvalue()->user_data()) ) ) */
/* { */
/* _persistent_osc_connections.push_back( strdup(path) ); */
// Port *p = control_output[0].connected_port();
mixer->osc_endpoint->del_translation( path );
/* if ( learn_by_number ) */
/* { */
/* char *our_path = p->osc_number_path(); */
/* mixer->osc_endpoint->add_translation( path, our_path ); */
/* free(our_path); */
/* } */
/* else */
/* mixer->osc_endpoint->add_translation( path, p->osc_path() ); */
}
/* } */
/* else */
/* { */
/* /\* timeline->osc->disconnect_signal( _osc_output(), path ); *\/ */
/* /\* for ( std::list<char*>::iterator i = _persistent_osc_connections.begin(); *\/ */
/* /\* i != _persistent_osc_connections.end(); *\/ */
/* /\* ++i ) *\/ */
/* /\* { *\/ */
/* /\* if ( !strcmp( *i, path ) ) *\/ */
/* /\* { *\/ */
/* /\* free( *i ); *\/ */
/* /\* i = _persistent_osc_connections.erase( i ); *\/ */
/* /\* break; *\/ */
/* /\* } *\/ */
/* /\* } *\/ */
/* //free( path ); */
/* } */
}
static Fl_Menu_Button *peer_menu;
static const char *peer_prefix;
void
Controller_Module::peer_callback( OSC::Signal *sig, OSC::Signal::State state, void *v )
{
char *s;
DMESSAGE( "Paramter limits: %f %f", sig->parameter_limits().min, sig->parameter_limits().max );
/* only show outputs */
if ( sig->direction() != OSC::Signal::Output )
return;
/* only list CV signals for now */
if ( ! ( sig->parameter_limits().min == 0.0 &&
sig->parameter_limits().max == 1.0 ) )
return;
if ( ! v )
{
/* if( state == OSC::Signal::Created ) */
/* timeline->connect_osc(); */
/* else */
/* timeline->update_osc_connection_state(); */
}
else
{
/* building menu */
// const char *name = sig->peer_name();
assert( sig->path() );
char *path = strdup( sig->path() );
unescape_url( path );
asprintf( &s, "%s/%s", peer_prefix, path );
peer_menu->add( s, 0, NULL, (void*)( sig ), 0 );
/* FL_MENU_TOGGLE | */
/* ( ((Controller_Module*)v)->_osc_output()->is_connected_to( sig ) ? FL_MENU_VALUE : 0 ) ); */
free( path );
free( s );
}
}
void
Controller_Module::add_osc_peers_to_menu ( Fl_Menu_Button *m, const char *prefix )
{
mixer->osc_endpoint->peer_signal_notification_callback( &Controller_Module::peer_callback, NULL );
peer_menu = m;
peer_prefix = prefix;
mixer->osc_endpoint->list_peer_signals( this );
}
void
Controller_Module::add_osc_connections_to_menu ( Fl_Menu_Button *m, const char *prefix )
{
/* peer_menu = m; */
const char *peer_prefix = prefix;
// mixer->osc_endpoint->list_peer_signals( this );
Port *p = control_output[0].connected_port();
const char *number_path = p->osc_number_path();
const char *name_path = p->osc_path();
const char *paths[] = { number_path,name_path,NULL };
for ( const char **cpath = paths; *cpath; cpath++ )
{
const char ** conn = mixer->osc_endpoint->get_connections( *cpath );
if ( conn )
{
for ( const char **s = conn; *s; s++ )
{
/* building menu */
char *path = strdup( *s );
unescape_url( path );
char *ns;
asprintf( &ns, "%s/%s", peer_prefix, path );
peer_menu->add( ns, 0, NULL, const_cast<char*>(*s), 0 );
free( path );
// free(*s);
}
free( conn );
}
}
}
/** build the context menu for this control */
@ -494,22 +835,54 @@ Controller_Module::menu ( void )
{
static Fl_Menu_Button m( 0, 0, 0, 0, "Controller" );
Fl_Menu_Item items[] =
{
{ "Mode", 0, 0, 0, FL_SUBMENU },
{ "GUI + OSC", 0, 0, 0, FL_MENU_RADIO | ( mode() == GUI ? FL_MENU_VALUE : 0 ) },
{ "Control Voltage (JACK)", 0, 0, 0, FL_MENU_RADIO | ( mode() == CV ? FL_MENU_VALUE : 0 ) },
{ 0 },
{ 0 },
};
m.clear();
menu_set_callback( items, &Controller_Module::menu_cb, (void*)this );
if ( mode() == GUI )
{
add_osc_peers_to_menu( &m, "Connect To" );
add_osc_connections_to_menu( &m, "Disconnect From" );
}
m.copy( items, (void*)this );
m.add( "Mode/GUI + OSC", 0, 0, 0, FL_MENU_RADIO | ( mode() == GUI ? FL_MENU_VALUE : 0 ));
m.add( "Mode/Control Voltage (JACK)", 0, 0, 0, FL_MENU_RADIO | ( mode() == CV ? FL_MENU_VALUE : 0 ));
m.add( "Remove", 0, 0, 0, is_default() ? FL_MENU_INACTIVE : 0 );
// menu_set_callback( m.items(), &Controller_Module::menu_cb, (void*)this );
m.callback( &Controller_Module::menu_cb, (void*)this );
// m.copy( items, (void*)this );
return m;
}
void
Controller_Module::draw ( void )
{
Fl_Group::draw();
draw_box(x(),y(),w(),h());
if ( learn_mode() )
{
fl_rectf( x(),y(),w(),h(),
fl_color_add_alpha(
this == _learning_control
? FL_RED
: FL_GREEN,
60 ) );
}
}
void Controller_Module::learning_callback ( void *userdata )
{
((Controller_Module*)userdata)->learning_callback();
}
void Controller_Module::learning_callback ( void )
{
_learning_control = NULL;
this->redraw();
}
int
Controller_Module::handle ( int m )
{
@ -518,10 +891,33 @@ Controller_Module::handle ( int m )
{
case FL_PUSH:
{
if ( test_press( FL_BUTTON3 ) )
if ( learn_mode() )
{
tooltip( "Now learning control. Move the desired control on your controller" );
_learning_control = this;
this->redraw();
//connect_to( &module->control_input[port] );
Port *p = control_output[0].connected_port();
if ( p )
{
const char * path = learn_by_number ? p->osc_number_path() : p->osc_path();
DMESSAGE( "Will learn %s", path );
mixer->osc_endpoint->learn( path, Controller_Module::learning_callback, this );
}
return 1;
}
if ( Fl::event_button3() )
{
/* context menu */
if ( type() != SPATIALIZATION )
/* if ( type() != SPATIALIZATION ) */
menu_popup( &menu() );
return 1;
@ -538,6 +934,13 @@ void
Controller_Module::handle_control_changed ( Port *p )
{
/* ignore changes initiated while mouse is over widget */
if ( type() == SPATIALIZATION )
{
if ( Mixer::spatialization_console )
Mixer::spatialization_console->handle_control_changed( this );
}
if ( contains( Fl::pushed() ) )
return;
@ -559,7 +962,16 @@ Controller_Module::handle_control_changed ( Port *p )
pan->point( 0 )->azimuth( control_output[0].control_value() );
pan->point( 0 )->elevation( control_output[1].control_value() );
pan->redraw();
if ( control_output[2].connected() )
{
// Port *pp = control_output[2].connected_port();
float v = control_output[2].control_value();
// float s = pp->hints.maximum - pp->hints.minimum;
pan->point( 0 )->radius( v );
}
if ( visible_r() )
pan->redraw();
}
else
{
@ -570,8 +982,20 @@ Controller_Module::handle_control_changed ( Port *p )
}
}
void
Controller_Module::command_remove ( void )
{
if ( is_default() )
fl_alert( "Default modules may not be deleted." );
else
{
chain()->remove( this );
Fl::delete_widget( this );
}
}
/**********/
/* Engine */
/* Client */
/**********/
void
@ -590,7 +1014,7 @@ Controller_Module::process ( nframes_t nframes )
if ( mode() == CV )
{
f = *((float*)jack_input[0].buffer( nframes ));
f = *((float*)aux_audio_input[0].jack_port()->buffer( nframes ));
const Port *p = control_output[0].connected_port();

View File

@ -32,10 +32,8 @@ class Fl_Valuator;
class Controller_Module : public Module
{
static void update_cb ( void *v );
void update_cb ( void );
bool _pad;
bool _horizontal;
volatile float control_value;
@ -43,11 +41,24 @@ class Controller_Module : public Module
static void menu_cb ( Fl_Widget *w, void *v );
void menu_cb ( const Fl_Menu_ *m );
char *_osc_path;
char *_osc_path_cv;
static void peer_callback( OSC::Signal *sig, OSC::Signal::State state, void *v );
void peer_callback( OSC::Signal *sig, OSC::Signal::State state );
void add_osc_peers_to_menu ( Fl_Menu_Button *m, const char *prefix );
void add_osc_connections_to_menu ( Fl_Menu_Button *m, const char *prefix );
static void learning_callback ( void *userdata );
void learning_callback ( void );
public:
static bool _learn_mode;
static Controller_Module *_learning_control;
static bool learn_by_number;
static bool learn_mode ( void ) { return _learn_mode; }
static void learn_mode ( bool b ) { _learn_mode = b; }
enum Mode { GUI, CV, OSC, MIDI };
enum Type { KNOB,
@ -59,6 +70,7 @@ public:
Mode mode ( void ) const { return _mode; }
void mode ( Mode v );
void horizontal ( bool v ) { _horizontal = v; }
Type type ( void ) const { return _type; }
Controller_Module ( bool is_default = false );
@ -78,22 +90,26 @@ public:
void connect_to ( Port *p );
bool connect_spatializer_to ( Module *m );
bool connect_spatializer_radius_to ( Module *m );
void disconnect ( void );
void handle_control_changed ( Port *p );
void handle_chain_name_changed ( void );
void handle_control_disconnect ( Port *p );
virtual void command_remove ( void );
LOG_CREATE_FUNC( Controller_Module );
virtual void update ( void );
void process ( nframes_t nframes );
void draw ( void )
{
draw_box();
Fl_Group::draw();
}
void draw ( void );
int handle ( int m );
void take_focus ( void );
// void set_control_value ( float f ) { control_value = f; }
protected:
@ -103,10 +119,11 @@ protected:
private:
void apply_label ( Port *p, Fl_Widget *o );
void maybe_create_panner ( void );
char *generate_osc_path ( void );
void change_osc_path ( char *path );
std::vector<JACK::Port> jack_input;
Mode _mode;
Type _type;

View File

@ -43,117 +43,167 @@ DPM::DPM ( int X, int Y, int W, int H, const char *L ) :
_last_drawn_hi_segment = 0;
pixels_per_segment( 4 );
pixels_per_segment( 5 );
type( FL_VERTICAL );
// resize( X, Y, W, H );
dim( 0.70f );
dim( 0.95f );
box( FL_FLAT_BOX );
color(FL_BLACK);
/* color( fl_color_average( FL_BLACK, FL_BACKGROUND_COLOR, 0.25f ) ); */
/* initialize gradients */
if ( DPM::_gradient[ 0 ] == 0 )
DPM::blend( FL_GREEN, FL_RED );
{
int breaks[] = {0,80,90,110,127};
box( FL_ROUNDED_BOX );
color( FL_BACKGROUND_COLOR );
Fl_Color cols[] = {
fl_darker( FL_CYAN ),
FL_CYAN,
fl_lighter( FL_CYAN ),
fl_color_average( FL_YELLOW, FL_RED, 0.50f ),
FL_RED
};
for ( int i = 0; i < 4; ++i )
{
cols[i] = fl_color_average( cols[i], FL_BACKGROUND_COLOR, 0.60f );
}
DPM::blend( 5,
breaks,
cols,
color() );
}
resize( X,Y,W,H);
}
/* which marks to draw beside meter */
const int marks [] = { -70, -50, -40, -30, -20, -10, -3, 0, 4 };
void
DPM::draw_label ( void )
DPM::public_draw_label ( int X, int Y, int W, int H )
{
/* dirty hack */
if ( parent()->child( 0 ) == this )
fl_push_clip(X,Y,W,H);
fl_rectf( X,Y,W,H, FL_BACKGROUND_COLOR);
fl_font( FL_TIMES, 8 );
fl_color( active_r() ? FL_FOREGROUND_COLOR : fl_inactive( FL_FOREGROUND_COLOR ) );
/* draw marks */
char pat[5];
if ( type() == FL_HORIZONTAL )
{
fl_font( FL_TIMES, 8 );
fl_color( FL_WHITE );
/* draw marks */
char pat[5];
if ( type() == FL_HORIZONTAL )
{
for ( int i = sizeof( marks ) / sizeof( marks[0] ); i-- ; )
{
sprintf( pat, "%d", marks[ i ] );
for ( int i = sizeof( marks ) / sizeof( marks[0] ); i-- ; )
{
sprintf( pat, "%d", marks[ i ] );
int v = w() * deflection( (float)marks[ i ] );
int v = w() * deflection( (float)marks[ i ] );
fl_draw( pat, x() + v, (y() + h() + 8), 19, 8, (Fl_Align) (FL_ALIGN_RIGHT | FL_ALIGN_TOP) );
}
fl_draw( pat, X + v, (Y + H + 8), W, 8, (Fl_Align) (FL_ALIGN_RIGHT | FL_ALIGN_TOP) );
}
}
else
{
for ( int i = sizeof( marks ) / sizeof( marks[0] ); i-- ; )
{
sprintf( pat, "%d", marks[ i ] );
int v = h() * deflection( (float)marks[ i ] );
fl_draw( pat, x() - 20, (y() + h() - 8) - v, 19, 8, (Fl_Align) (FL_ALIGN_RIGHT | FL_ALIGN_TOP) );
}
}
}
else
{
for ( int i = sizeof( marks ) / sizeof( marks[0] ); i-- ; )
{
sprintf( pat, "%d", marks[ i ] );
int v = h() * deflection( (float)marks[ i ] );
fl_draw( pat, X, (Y + H - 4) - v, W, 8, (Fl_Align) (FL_ALIGN_RIGHT | FL_ALIGN_TOP) );
}
}
fl_pop_clip();
}
void
DPM::resize ( int X, int Y, int W, int H )
{
if ( type() == FL_HORIZONTAL )
_segments = floor( W / (double)_pixels_per_segment );
else
_segments = floor( H / (double)_pixels_per_segment );
// _last_drawn_hi_segment = 0;
int old_segments = _segments;
Fl_Widget::resize( X, Y, W, H );
int tx,ty,tw,th;
bbox(tx,ty,tw,th);
if ( type() == FL_HORIZONTAL )
_segments = floor( tw / (double)_pixels_per_segment );
else
_segments = floor( th / (double)_pixels_per_segment );
if ( old_segments != _segments )
_last_drawn_hi_segment = 0;
}
void DPM::bbox ( int &X, int &Y, int &W, int &H )
{
/* X = x() + 2; */
/* Y = y() + 2; */
/* W = w() - 4; */
/* H = h() - 4; */
X = x();
Y = y();
W = w();
H = h();
}
void
DPM::draw ( void )
{
snprintf( peak_string, sizeof( peak_string ), "%.1f", peak() );
tooltip( peak_string );
if ( ! fl_not_clipped( x(), y(), w(), h() ) )
return;
int X = x() + 2;
int Y = y() + 2;
int W = w() - 4;
int H = h() - 4;
int X,Y,W,H;
bbox(X,Y,W,H);
int v = pos( value() );
int pv = pos( peak() );
int clipv = pos( 0 );
int bh = h() / _segments;
int bw = w() / _segments;
int bh = H / _segments;
/* int bh = _pixels_per_segment; */
/* int bw = _pixels_per_segment; */
int bw = W / _segments;
if ( 0 == fl_not_clipped(X,Y,W,H ) )
return;
if ( damage() == FL_DAMAGE_ALL )
if ( damage() & FL_DAMAGE_ALL )
{
draw_label();
/* draw_label(); */
draw_box( FL_UP_FRAME, x(), y(), w(), h(), FL_BLACK );
draw_box( box(), X, Y, W, H, color() );
}
fl_push_clip( X, Y, W, H );
const int active = active_r();
int hi, lo;
/* only draw as many segments as necessary */
if ( damage() == FL_DAMAGE_USER1 )
{
if ( v > _last_drawn_hi_segment )
if ( v == _last_drawn_hi_segment )
{
return;
}
else if ( v > _last_drawn_hi_segment )
{
hi = v;
lo = _last_drawn_hi_segment;
}
else
else if ( v < _last_drawn_hi_segment )
{
hi = _last_drawn_hi_segment;
lo = v;
@ -167,53 +217,50 @@ DPM::draw ( void )
_last_drawn_hi_segment = v;
fl_push_clip( X, Y, W, H );
for ( int p = lo; p <= hi; p++ )
for ( int p = lo; p <= hi + 1; ++p )
{
Fl_Color c = DPM::div_color( p );
if ( p > v && p != pv )
c = dim_div_color( p );
if ( ! active )
c = fl_inactive( c );
int yy = 0;
int xx = 0;
if ( type() == FL_HORIZONTAL )
{
xx = X + p * bw;
fl_rectf( X + (p * bw), Y, bw, H, c );
}
else
{
yy = Y + H - ((p + 1) * bh);
fl_rectf( X, yy, W, bh, c );
}
if ( _pixels_per_segment > 3 )
{
fl_color( FL_BLACK );
if ( type() == FL_HORIZONTAL )
{
fl_line( xx, Y, xx, Y + H - 1 );
}
else
{
fl_line( X, yy, X + W - 1, yy );
}
}
/* } */
/* else */
/* { */
/* if ( type() == FL_HORIZONTAL ) */
/* fl_draw_box( box(), X + (p * bw), Y, bw, H, c ); */
/* else */
/* fl_draw_box( box(), X, Y + H - ((p + 1) * bh), W, bh, c ); */
/* } */
Fl_Color c;
if ( p <= v || p == pv )
{
if ( p == clipv )
c = fl_color_average( FL_YELLOW, div_color( p ), 0.40 );
else
c = div_color( p );
}
else
c = fl_darker( FL_BACKGROUND_COLOR );//FL_DARK1; // fl_color_average( FL_BACKGROUND_COLOR, FL_BLACK, 0.50f );// FL_BACKGROUND_COLOR; //dim_div_color( p );
if ( ! active )
c = fl_inactive( c );
int yy = 0;
int xx = 0;
if ( type() == FL_HORIZONTAL )
{
xx = X + p * bw;
fl_rectf( xx + 1, Y, bw - 1, H, c );
}
else
{
yy = Y + H - ((p+1) * bh);
fl_rectf( X, yy + 1, W, bh - 1, c );
}
}
fl_pop_clip();
}
void
DPM::update ( void )
{
/* do falloff */
float f = value() - 0.33f;
if ( f < -80.0f )
f = -80.0f;
value(f);
}

View File

@ -30,12 +30,12 @@ class DPM : public Meter
int _segments;
int _pixels_per_segment;
int _last_drawn_hi_segment;
float _value;
int pos ( float v )
{
return deflection( v ) * _segments;
float pv = deflection( v ) * ( _segments - 1 );
return pv;
}
static float _dim;
@ -53,47 +53,52 @@ class DPM : public Meter
{
return _dim_gradient[ i * 127 / _segments ];
}
protected:
virtual void draw_label ( void );
virtual void draw ( void );
virtual void resize ( int, int, int, int );
/* virtual void draw_label ( void ); */
void bbox ( int &X, int &Y, int &W, int &H );
public:
void public_draw_label ( int X, int Y, int W, int H );
DPM ( int X, int Y, int W, int H, const char *L = 0 );
void value ( float v )
{
if ( _value != v )
{
if ( pos( v ) != pos( _value ) )
Meter::value( v );
}
_value = v;
}
float value ( void ) const
{
return _value;
}
void pixels_per_segment ( int v ) { _pixels_per_segment = v; }
float dim ( void ) const { return _dim; }
void dim ( float v ) { _dim = v; redraw(); }
void dim ( float v ) { _dim = v; if ( visible_r() ) redraw(); }
virtual void value ( float v )
{
/* only trigger redraw for changes at or above our resolution*/
if ( pos( value() ) != pos( v ) && visible_r() )
damage( FL_DAMAGE_USER1 );
Meter::value( v );
}
virtual float value ( void ) { return Meter::value(); }
void update ( void );
static
void
blend ( Fl_Color min, Fl_Color max )
blend ( int nbreaks, int* b, Fl_Color *c, Fl_Color bc )
{
for ( int i = 128; i-- ; )
_gradient[ i ] = fl_color_average( max, min, i / (float)128 );
for ( int i = 0; i < nbreaks - 1; i++ )
{
int k = 0;
for ( int j = b[i]; j <= b[i+1]; j++, k++ )
_gradient[ j ] = fl_color_average( c[i+1], c[i], ( k ) / (float)(b[i+1] - b[i] ));
}
for ( int i = 128; i-- ; )
for ( int i = 0; i < 128; i++ )
_dim_gradient[ i ] = fl_color_average( FL_BLACK, _gradient[ i ], _dim );
}
};

View File

@ -1,130 +0,0 @@
/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/
#include "Engine.H"
#include "../Mixer.H" // for process()
/* This is the home of the JACK process callback */
// #include "const.h"
#include "debug.h"
#include "Thread.H"
Engine::Engine ( void (*process_callback)(nframes_t nframes, void *), void *user_data ) : _thread( "RT" )
{
_process_callback = process_callback;
_process_callback_user_data = user_data;
_buffer_size_callback = 0;
_buffers_dropped = 0;
}
Engine::~Engine ( )
{
deactivate();
}
void
Engine::buffer_size_callback ( void ( *buffer_size_callback ) ( nframes_t, void * ), void *user_data )
{
_buffer_size_callback = buffer_size_callback;
_buffer_size_callback_user_data = user_data;
}
/*************/
/* Callbacks */
/*************/
/* THREAD: RT */
/** This is the jack xrun callback */
int
Engine::xrun ( void )
{
return 0;
}
/* THREAD: RT */
void
Engine::freewheel ( bool starting )
{
if ( starting )
DMESSAGE( "entering freewheeling mode" );
else
DMESSAGE( "leaving freewheeling mode" );
}
/* THREAD: RT (non-RT) */
int
Engine::buffer_size ( nframes_t nframes )
{
/* JACK calls this in the RT thread, even though it's a
* non-realtime operation. This mucks up our ability to do
* THREAD_ASSERT, so just lie and say this is the UI thread... */
_thread.set( "UI" );
_buffer_size_callback( nframes, _buffer_size_callback_user_data );
_thread.set( "RT" );
return 0;
}
/* THREAD: RT */
int
Engine::process ( nframes_t nframes )
{
/* FIXME: wrong place for this */
_thread.set( "RT" );
if ( ! trylock() )
{
/* the data structures we need to access here (tracks and
* their ports, but not track contents) may be in an
* inconsistent state at the moment. Just punt and drop this
* buffer. */
++_buffers_dropped;
return 0;
}
_process_callback(nframes, _process_callback_user_data);
unlock();
return 0;
}
/* TRHEAD: RT */
void
Engine::thread_init ( void )
{
_thread.set( "RT" );
}
/* THREAD: RT */
void
Engine::shutdown ( void )
{
}

View File

@ -30,26 +30,45 @@ Gain_Module::Gain_Module ( )
add_port( Port( this, Port::INPUT, Port::AUDIO ) );
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) );
Port p( this, Port::INPUT, Port::CONTROL, "Gain (dB)" );
p.hints.type = Port::Hints::LOGARITHMIC;
p.hints.ranged = true;
p.hints.minimum = -70.0f;
p.hints.maximum = 6.0f;
p.hints.default_value = 0.0f;
{
Port p( this, Port::INPUT, Port::CONTROL, "Gain (dB)" );
p.hints.type = Port::Hints::LINEAR;
p.hints.ranged = true;
p.hints.minimum = -70.0f;
p.hints.maximum = 6.0f;
p.hints.default_value = 0.0f;
p.connect_to( new float );
p.control_value( p.hints.default_value );
p.connect_to( new float );
p.control_value( p.hints.default_value );
add_port( p );
add_port( p );
}
{
Port p( this, Port::INPUT, Port::CONTROL, "Mute" );
p.hints.type = Port::Hints::BOOLEAN;
p.hints.ranged = true;
p.hints.minimum = 0.0f;
p.hints.maximum = 1.0f;
p.hints.default_value = 0.0f;
p.connect_to( new float );
p.control_value( p.hints.default_value );
add_port( p );
}
end();
log_create();
smoothing.sample_rate( sample_rate() );
}
Gain_Module::~Gain_Module ( )
{
delete (float*)control_input[0].buffer();
delete (float*)control_input[1].buffer();
log_destroy();
}
@ -71,6 +90,12 @@ Gain_Module::configure_inputs ( int n )
return true;
}
void
Gain_Module::handle_sample_rate_change ( nframes_t n )
{
smoothing.sample_rate( n );
}
/**********/
@ -80,13 +105,38 @@ Gain_Module::configure_inputs ( int n )
void
Gain_Module::process ( nframes_t nframes )
{
float g = DB_CO( control_input[0].control_value() );
for ( int i = audio_input.size(); i--; )
if ( unlikely( bypass() ) )
{
if ( audio_input[i].connected() && audio_output[i].connected() )
/* nothing to do */
}
else
{
const float gt = DB_CO( control_input[1].control_value() ? -90.f : control_input[0].control_value() );
sample_t gainbuf[nframes];
bool use_gainbuf = smoothing.apply( gainbuf, nframes, gt );
if ( unlikely( use_gainbuf ) )
{
buffer_apply_gain( (sample_t*)audio_input[i].buffer(), nframes, g );
for ( int i = audio_input.size(); i--; )
{
if ( audio_input[i].connected() && audio_output[i].connected() )
{
sample_t *out = (sample_t*)audio_input[i].buffer();
buffer_apply_gain_buffer( out, gainbuf, nframes );
}
}
}
else
for ( int i = audio_input.size(); i--; )
{
if ( audio_input[i].connected() && audio_output[i].connected() )
{
buffer_apply_gain( (sample_t*)audio_input[i].buffer(), nframes, gt );
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More