Coder Social home page Coder Social logo

helgoboss / realearn Goto Github PK

View Code? Open in Web Editor NEW
190.0 10.0 20.0 18.46 MB

ReaLearn 2: Sophisticated MIDI/MCU/OSC learn for REAPER

Home Page: https://www.helgoboss.org/projects/realearn/

License: GNU General Public License v3.0

Rust 96.18% C++ 0.13% C 0.02% HTML 0.31% Lua 3.36%
reaper plug-in daw midi controller osc

realearn's Introduction

ReaLearn

Installation

The easiest and preferred way of installing ReaLearn is via ReaPack, a sort of "app store" for REAPER. It allows you to keep your installation of ReaLearn up-to-date very easily.

Install for the first time

If you previously installed ReaLearn manually, please uninstall it first!

  1. Install ReaPack if not done so already

  2. Extensions → ReaPack → Import repositories…

  3. Copy and paste the following repository URL:

    https://github.com/helgoboss/reaper-packages/raw/master/index.xml
  4. Extensions → ReaPack → Browse packages…

  5. Search for realearn

  6. Right mouse click on the ReaLearn package → Install…

  7. OK or Apply

  8. Restart REAPER

Linux users only:

  • You also need libxdo installed, otherwise ReaLearn won’t scan.

  • Debian/Ubuntu: sudo apt-get install -y libxdo-dev

Update to the latest stable version

ReaLearn development moves fast. In order to take advantage of new features, improvements and fixes, you should check for updates from time to time.

  1. Extensions → ReaPack → Synchronize packages

    • It will tell you if a new version has been installed.

  2. Restart REAPER

Test new features and improvements

If you want to get access to cutting-edge but untested versions of ReaLearn, you have two options:

Install a specific pre-release:

  1. Right mouse click on the ReaLearn package → Versions

  2. Select any version ending on -pre. or -rc.

  3. OK or Apply

  4. Restart REAPER

Enable pre-releases globally:

  1. Extensions → ReaPack → Manage repositories → Options… → Enable pre-releases globally (bleeding edge)

  2. After that, whenever you synchronize packages, you will get the latest stuff.

Install manually

If you are more the download type of person, you can find the latest dll, dylib and so files here at GitHub on the releases page for manual installation. You also must install ReaLearn manually if you plan to use ReaLearn in both REAPER for Windows 32-bit and REAPER for Windows 64-bit because then it’s important to use two separate VST plug-in directories.

Please note that it’s impossible to run ReaLearn as a bridged plug-in. If you have "Preferences → Plug-ins → Compatibility → VST bridging/firewalling" set to "In separate plug-in process" or "In dedicated process per plug-in", you will need to add an exception for ReaLearn by setting "Run as" to "Native only"!

Usage

Quick start

ReaLearn is fired up just like any other VST instrument in REAPER: By adding it to an FX chain.

screenshot main panel annotated
Figure 1. Main panel (containing the list of mappings)
screenshot mapping panel
Figure 2. Mapping panel (for editing one particular mapping)

Videos

The ReaLearn Tutorials is a fairly new ongoing series of short video tutorials available.

There’s also a long introduction video from 2021. Watch 2 minutes to get a first impression and stay tuned if you are interested in the details.

User guide

ReaLearn features a large and complete user guide.

Tip
The main focus of ReaLearn’s user guide is being comprehensive, so it’s more like a reference manual and can get quite detailed and technical. If you prefer a simple hands-on approach, the tutorial videos are a better choice.

Supported controllers

ReaLearn is designed to be generic and support any controller. That’s why you won’t find a definitive list of supported controllers! But there’s a list of tested controllers.

Tip
Keep in mind: Even if your controller is not on the list, you probably can make it work with ReaLearn!

Available presets

Architecture

Contributing

realearn's People

Contributors

albertov5 avatar azslow3 avatar dependabot[bot] avatar helgoboss avatar

Stargazers

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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

realearn's Issues

Allow FX MIDI to pass through when using device as input

If MIDI input is set to a device (not <FX input>), that doesn't mean we need to stop ReaLearn from passing MIDI messages through. "Let unmatched events through" should be checkable. By default it should be checked. For compatibility reasons, it should be unchecked for presets/projects using previous ReaLearn versions. "Let matched events through" can be grayed out as there never are matched events from FX input with this setting.

Add a few infos to the docs

  • Hardware controller buttons should always be set up in momentary mode, otherwise ReaLearn can't properly control the button's function.
  • Before installing the new ReaLearn via ReaPack, uninstall the old ReaLearn
  • Hint regarding conditional activation via programs https://forum.cockos.com/showpost.php?p=2340805&postcount=480
  • Alternative to conditional activation as mentioned here: https://forum.cockos.com/showpost.php?p=2340750&postcount=478
  • Mention hint Your controller has multiple modes and currently is in the wrong one. also in "Troubleshooting" section because it affects control direction as well
  • Mention that rotary encoders should be put into relative mode to take full advantage of ReaLearn's capabilities.
  • Mention that it only works in native mode, not in bridged mode

Proper feedback for "one button → one target value" mappings

Right now, if you have a few buttons with LEDs and you create a mapping for each one that sets a shared target to a distinct value (by setting target min/max to the same value), feedback behavior is not cool. One would expect that the button with the currently active value will be lit and the other ones not. But at the moment, the buttons mapped to lower target values than the current one are lit and the button with the currently active value, too. (Well, actually the latter is not true because of a rounding issue - this looks like a bug and is tracked in #28!) It's possible to resemble the desired behavior with "Feedback transformation" but of course that's not convenient at all.

The current behavior makes sense in the following cases:

  1. Motorized faders
  2. Rotary encoders with LEDs
  3. LED rows (all LEDs until the current value are lit ... can also be something desireable)

That means it's still important to keep the current behavior.

I see the following options:

  • a) Add a new checkbox "Ignore out-of-range target values" which - when ticked - turns the light off as soon as the target value is not within target min/max. That would yield the desired behavior.
    • Doesn't make sense!
  • b) Rename "Ignore out-of-range source values" to "Ignore out-of-range values" and just reuse this checkbox for yielding the same behavior.
    • Existing mappings of buttons are unlikely to be affected because "Ignore out-of-range source values" doesn't really make sense for buttons at the moment.
    • Existing mappings of knobs/faders would unfortunately be affected ... so this is not an option.
  • c) Replace "Ignore out-of-range source values" checkbox with a dropdown "Out-of-range behavior" with following options:
    1. Set to 0 or 1 (control: same as if "Ignore out-of-range source values" unchecked, feedback: current behavior)
    2. Ignore (control: same as if "Ignore out-of-range source values" checked, feedback: new)
    3. Set to 0 (control: new, feedback: new)

In future, it could make sense to offer some easy modes that are tailored to certain use cases (similarly to the current "Toggle" mode). If desired, these easy modes could be implemented completely on "application" level code and translate to the flexible modes on "domain" level. I could imagine a "Set to value" mode. This one just needs to contain the following settings:

  • "Light off/on" (translated to "Source min/max")
  • "Length min/max"
  • "Target value" (translated to "Target min")

A future mode listing could look a bit like that:

  1. Absolute (flexible mode, for knobs/faders/buttons)
  2. Relative (flexible mode, for encoders/buttons)
  3. Toggle on/off (easy mode, for buttons)
  4. Set to value (easy mode, for buttons)

In the light of upcoming controller mappings and swappable mappings, the list of modes could still undergo some changes (receive some automatic modes), so we should wait for that at first before making a decision.

Display Text Target

Proposing a possible improvement here.

For live performance it would be great to have clearly shown on screen what it's actually happening. If i change the value of a track send, it's hard to see it on screen. Same goes for other targets/actions. It would great to have a big visible message that shows "Track 1, send 1, value -4db", for instance.

I guess this is not a priority but I'm still proposing this as a "nice to have".

Cheers

Track Solo Function Improvement

As mentioned on the Cockos forum, I've found that when using the Realearn function to Solo the selected track, any of the tracks it sends to or are nested under do not solo. My assumption is this is an issue between "exclusive solo" and "solo". Exclusive Solo appears to carry any routing with it while regular Solo does not.

For example, I will have something like the following:

DRUM CONTAINER
-- DRUM BUS
[Realearn here]
-- DRUM FX BUS

FX CONTAINER
-- FX BUS
--- GLOBAL REVERB

In this scenario, the DRUM BUS and DRUM FX BUS are nested in the DRUM CONTAINER folder. The FX CONTAINER folder holds an FX BUS which holds a GLOBAL REVERB

My DRUM BUS will send through the DRUM CONTAINER to the MASTER. It will also send to the DRUM FX BUS and the GLOBAL REVERB.

If I use my mouse on the MCP and hit the Solo button on the DRUM BUS, it will solo the DRUM BUS and anything it sends to (as clicking on it appears to activate the solo in Exclusive Solo mode).

If I map Realearn to the Solo of the track it sits on, it will solo just the track. If I have it nested in a folder or bus, no audio is passed to the MASTER. There is no option in the drop down in Realearn for Exclusive Solo.

Having said all that, Exclusive Solo is not available from the Actions. So I'm not sure if that will be a hurdle.

Feedback groups

There are controllers that need multiple messages to be sent in one go in order to control various aspects of one control element visualization (e.g. KMI SoftStep). We can support such controllers by ...

  1. Allow multiple feedback mappings with different sources (e.g. with SoftStep we would have one CC110 source to control the primary color of the first button and one CC20 source to control the add-on color) to form a kind of group.
  2. Making it possible that whenever the target value for one of those mappings changes, feedback is sent for all the mappings in that group. Top-down order, in case the order is important for the controller.

Never abort REAPER if ReaLearn panics

ReaLearn still aborts REAPER when a panic occurs in certain areas, e.g. when it panics while loading/saving plug-in state. We need to catch panics at every C → Rust boundary using the firewall() function that we use elsewhere.

Problem with meldaproduction VST3s

In realearn, When i assign a midi controller toggle to a meldaproduction VST3 parameter or multiparameter, it works.
But if the parameter is also displayed in track control, it seems like the parameter sends an inverted feedback to the Reaper trach control (100% becomes 0% and vice versa).

When i change the VST parameter by hand it is reflected correctly in the track control, but if i change the parameter via Realearn/midi CC it gets inverted in the track control. Also sometimes the track control seems to lag and not update correctly.
Also the feedback out of Realearn to the midi controller also gets inverted.

I don't understand, it seems to work okay with other non melda VST3s.
And when i midi learn the controller directly to the VST3 parameter it works okay.
So i'm guessing it must be something between realearn and the melda VST3s ?

Regards,

Error log when combining high CC "14-bit values" in source UI


Message: assertion failed: msb_controller_number.corresponding_14_bit_lsb_controller_number().is_some()

   0:     0x7fff3df4b038 - backtrace::backtrace::trace_unsynchronized<closure-0>
                               at C:\Users\benja\.cargo\registry\src\github.com-1ecc6299db9ec823\backtrace-0.3.49\src\backtrace\mod.rs:66
   1:     0x7fff3df4aee0 - backtrace::backtrace::trace<closure-0>
                               at C:\Users\benja\.cargo\registry\src\github.com-1ecc6299db9ec823\backtrace-0.3.49\src\backtrace\mod.rs:53
   2:     0x7fff3df4cf98 - backtrace::capture::Backtrace::create
                               at C:\Users\benja\.cargo\registry\src\github.com-1ecc6299db9ec823\backtrace-0.3.49\src\capture.rs:164
   3:     0x7fff3df4ced4 - backtrace::capture::Backtrace::new
                               at C:\Users\benja\.cargo\registry\src\github.com-1ecc6299db9ec823\backtrace-0.3.49\src\capture.rs:128
   4:     0x7fff3dc0c3bc - reaper_high::log_util::create_reaper_panic_hook::{{closure}}<closure-0>
                               at C:\Users\benja\.cargo\git\checkouts\reaper-rs-d32fed07113e6874\efd9b04\main\high\src\log_util.rs:51
   5:     0x7fff3df76928 - std::panicking::rust_panic_with_hook
                               at /rustc/a74d1862d4d87a56244958416fd05976c58ca1a8\/src\libstd\panicking.rs:481
   6:     0x7fff3dece742 - std::panicking::begin_panic<str*>
                               at C:\Users\benja\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\libstd\panicking.rs:404
   7:     0x7fff3decbc74 - helgoboss_midi::control_change_14_bit_message::ControlChange14BitMessage::new
                               at C:\Users\benja\.cargo\git\checkouts\helgoboss-midi-893f4cb341480142\48f50b4\src\control_change_14_bit_message.rs:65
   8:     0x7fff3d892515 - helgoboss_learn::source::midi_source::MidiSource::feedback<helgoboss_midi::raw_short_message::RawShortMessage>
                               at C:\Users\benja\Documents\projects\dev\realearn-rs\main\lib\helgoboss-learn\src\source\midi_source.rs:499
   9:     0x7fff3da3e3ad - realearn::domain::mapping::NormalMappingSource::feedback
                               at C:\Users\benja\Documents\projects\dev\realearn-rs\main\src\domain\mapping.rs:338
  10:     0x7fff3da3df3f - realearn::domain::mapping::NormalMainMapping::feedback_if_enabled
                               at C:\Users\benja\Documents\projects\dev\realearn-rs\main\src\domain\mapping.rs:267
  11:     0x7fff3d871695 - realearn::domain::main_processor::{{impl}}::run<alloc::rc::Weak<core::cell::RefCell<realearn::application::session::Session>>>
                               at C:\Users\benja\Documents\projects\dev\realearn-rs\main\src\domain\main_processor.rs:116
  12:     0x7fff3de51c90 - reaper_medium::control_surface::{{impl}}::Run
                               at C:\Users\benja\.cargo\git\checkouts\reaper-rs-d32fed07113e6874\efd9b04\main\medium\src\control_surface.rs:555
  13:     0x7fff3dea2b76 - reaper_low::control_surface::Run::{{closure}}
                               at C:\Users\benja\.cargo\git\checkouts\reaper-rs-d32fed07113e6874\efd9b04\main\low\src\control_surface.rs:219
  14:     0x7fff3deb355e - std::panic::{{impl}}::call_once<(),closure-0>
                               at C:\Users\benja\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\libstd\panic.rs:318
  15:     0x7fff3deb251c - std::panicking::try::do_call<std::panic::AssertUnwindSafe<closure-0>,()>
                               at C:\Users\benja\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\libstd\panicking.rs:297
  16:     0x7fff3deb3487 - std::panicking::begin_panic::{{impl}}::take_box<alloc::string::String>
  17:     0x7fff3deb0cdd - std::panicking::try<(),std::panic::AssertUnwindSafe<closure-0>>
                               at C:\Users\benja\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\libstd\panicking.rs:274
  18:     0x7fff3deb3afe - std::panic::catch_unwind<std::panic::AssertUnwindSafe<closure-0>,()>
                               at C:\Users\benja\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\lib\rustlib\src\rust\src\libstd\panic.rs:394
  19:     0x7fff3de9f128 - reaper_low::util::firewall<closure-0,()>
                               at C:\Users\benja\.cargo\git\checkouts\reaper-rs-d32fed07113e6874\efd9b04\main\low\src\util.rs:18
  20:     0x7fff3dea2b4d - reaper_low::control_surface::Run
                               at C:\Users\benja\.cargo\git\checkouts\reaper-rs-d32fed07113e6874\efd9b04\main\low\src\control_surface.rs:219
  21:     0x7fff3dfa6cb7 - reaper_control_surface::ReaperRsControlSurface::Run
                               at c:\users\benja\.cargo\git\checkouts\reaper-rs-d32fed07113e6874\efd9b04\main\low\src\control_surface.cpp:26
  22:        0x14027d6a0 - <unknown>
  23:        0x1401922bc - <unknown>
  24:        0x1401914f0 - <unknown>
  25:        0x1403b9c0c - <unknown>
  26:     0x7fffaa612920 - ScreenToClient
  27:     0x7fffaa6120c2 - ScreenToClient
  28:     0x7fffaa659d09 - UnpackDDElParam
  29:     0x7fffaa60e858 - CallWindowProcW
  30:     0x7fffaa60e299 - DispatchMessageW
  31:        0x1403b3661 - <unknown>
  32:        0x140877ab1 - <unknown>
  33:     0x7fffab7d6fd4 - BaseThreadInitThunk
  34:     0x7fffab91cec1 - RtlUserThreadStart

Bring back Action Targets on Reaper 5.X

Hi @helgoboss,
I was surprised when I found that in the current version of realearn (and I suspect in any since 1.10) action can only be picked from Reaper 6.13. I am on reaper 5.99 and I make extensive use of SWS cycle actions, is there any chance of realearn supporting again actions in 5.99?

If not would I be able to load a project in 6.X create my action bindings and go back to 5.99 and find them there?

Feature request: freely editable CC transformation curves

I am an EWI player (electronic wind instrument) - for us it is very important to map CC#2 to parameters in synths (i. e. to a filter cutoff, to the wavetableposition of a generator, etc. in order to change the timbre of sound with volume). If a synth plugin does not support CC#2 or midi learn realearn is very helpful. It would be fantastic to have individual transformation curves for each mapping in realearn and it would be a killer feature if these could be shaped by mouse action (bezier cuves) like for eample in midiCurve by pizmidi (https://www.kvraudio.com/product/midicurve-by-insert-piz-hereurl). Any chance?

Source Min/Max in Toggle Mode

Source Min/Max parameters in Toggle mode seem not to affect the feedback value as they do in Absolute mode. I think it would be nice to have a comparable behavior of these parameters under all the three modes.

Transport Targets

It would be very handy to have the following targets:

  • Play/stop
  • Toggle Repeat
  • Toggle Record
  • Toggle Metronome

Especially (or even only) for feedback purposes.
Right now Metronome, Record, and Repeat are working fine if I select the corresponding action. A minor issue I am encountering is that the repeat state is set inside a custom action, the the feedback is not triggered. I fear that the reason is that I use a SWS action for this, inside the cusrom action.
On the other hand if I press the "toggle trigger" midi device button, or if i set id from Reaper gui button itself, the status is properly sent as a feedback.
The one I am having the most issues with is Play/Stop. I noticed that if I use a feedback only mapping with "play", then the button is lit when the project is playing, but it doesn't get turned off when the project is stopped. Do you have any suggestion for this?

Cheers, and thanks

Send MIDI message Target

Another target that would be useful IMO is to send a custom midi message to the device. This is especially useful in conjunction with the possibility to select the same source CC for multiple mappings. So let's say you want a button to do something when pressed, and also turn off another button. My use case would still be the "Select region": I have 8 buttons, I want the current region button to be lit, and that only. This can either be achieved by using a custom "Play region" trigger, or by using a custom action in conjunction with another "turn the other lights off" midi message.

I hope I made myself clear. Then again one may then extend it to a generic midi message, not only a CC... But this may be too complicated..

Thanks!

Target "Adjust Track FX Parameter"

It would be nice to have a target that behaves like the "Adjust Track FX parameter x" action. The action works just fine, but there is no feedbackIf I map it to a certain Knob I can use it properly to work on the track parameter, but when I select that channel the next time my knob will be set to 0 and I will have the usual unwanted parameter jump, etc etc.

A workaround for this is to handpick all the params I need for each track and map them using a "Track FX Parameter" target, which works perfectly (with the "track must be selected" flag on). The problem is that if I have many tracks with many effects I will need 1 mapping per knob per effect, while with the Adjust Track FX" param I only have as many mappings as the knobs, and for each channel I need just to add a certain parameter to Track FX Parameters.

Cheers!

Add Automation Parameters to Realearn

Hi @helgoboss,
thank you for your amazing products! I am a huge fun of both Realearn and and an avid playtime user. I am really glad you have restarted working on realearn, it is an amazing product. I have a lot of request which would make my setup much simpler to use and less reliable on a series of work-arounds I've built in a long JSFX I use in conjuction with realearn.

The first request is about finer way to control realearn from another realearn instance, without having to create a zillion of instances and/ or arm/select tracks. I am thinking to a parameter list similar to the one currently in playtime. Ideally what I would need to access are:

  • send feedback now
  • individual assignment enable/disable control
  • individual assignment enable/disable feedback

I don't mind having actions instead of automation parameters if they are handier to implement.

Accessing internal mapping parameters would be interesting, but probably not worth the effort, I'd rather duplicate mappings if I am able to programmatically active/deactive them.

This would allow me, for example, to have a single button toggle between two relative states (hitting a realearn session that activates/deactivates a mapping in another realearn session). It would also handy to manage feedback in situation you have multiple mappings for the same controller.

Add a monotonous behaviour to 'slowly approach if jump to big'

Hi,

As much as I am fun of soft-takeover, I don't like the way it works in Realearn, I'd much prefer a situation in which target always follows the same direction of the source and converges to the source value. For example, suppose in 7-bit context, using the same notation as in realearn y = 63 and x=0. While increasing x, I'd expect y to increase as well, so that the two meet up at 127 (or before, I have no strong feelings on the topic). If I reverse the input direction while I am half way (suppose y = 95 and x = 63), I'd expect a mirror behaviour, so that x and y would meet at 0 or before.

In EEL2, I would expressed it as (I have not tested thoroughly, and it supposes the controller doesn't skip values, but it's just to get an idea of what I mean):

y_old != x_old ? (
  x > x_old ? (y = y_old + (127-y_old)/(127-x_old)) :
                    (y = y_old - y_old/x_old)
) : (y = x)

Unfortunately in the current EEL control transformation I don't have any way to access x_old, so I had to write my own EEL feedbacking realearn input, but I'd prefer a native implementation

Fix "... is not a valid unit value" error

I happened once when I was just adding tracks to ReaPlay, and it happened once when I changed the preference for the volume fader upper limit to +3 .
The project had multiple ReaLearns on different tracks, all taking CC7 to output volume fader change (to the track the plugin was on).

Message: 1.1203481489865716 is not a valid unit value

Toggle feedback transformation not working

I am using realearn to change the preset of an FX with a midi button. What I want is I press the button and the FX goes to preset #20 and then press it again it goes to preset #0(factory reset).

It works with my midi button working as momentary. However, the feedback doesn't work properly. I guessed it was because the feedback was sent as value 20, not 127, which is expected from the midi controller.

So I decided to use the feedback transformation: x = (y>1) ?1 : 0

But the feedback doesn't work. Changing the value with the Value slider of Target on the Mapping window works properly with feedback though.

Play Region target

For Live purposes a common use case for Control Surfaces is to determine which region is currently played/looped. In other software they may be clips or scenes, but for my experience the most straightforward thing to do in reaper is to work with regions. It would be great to have a trigger that goes like "go to region x when cursor reaches the next region marker". I have currently implemented this using a custom action that combines sws and standard reaper actions, and I correctly trigger the actions using a midi surface. The big issue is feedback, which is fundamental, because while I'm playing live I'd like to know which one of the regions is being played. This can be achieved by lighting it with another color (or maybe flashing, or whatever, but let's say lit with another color).

I have no clue about how much a hassle can it be to implement this, I just want to mention that maybe a combination of custom actions + a check on whether the cursor in inside the region can be a cheaper way to do this.. Maybe (=

Thank you very much

Support track grouping parameters

From ChocolateHawkins:

Another issue I've noticed with Realearn is when I map to a VCA master fader, the VCA follow functions (fader, solo, mute, etc.) do not work.

Repeatedly getting an error when trying to pick an Action as a Target (when clicking on the "pick" button)

95 % of the time ReaLearn throws an error when I click on the “pick” button. It also doesn’t proceed to open or change the action list as it does when it happens to work. It doesn’t matter if the action list is already open or not. When the error comes up, I can’t proceed with anything and have to restart Reaper (as advised in the text of the Error message). I’ve tried ignoring the error and tried to save the mappings set until that point as a preset but when I reloaded Reaper, they weren’t there.

This is what happens:
ReaLearn action pick bug

Also, here’s the error message:

Sorry, an error occurred in a REAPER plug-in. It seems that a crash has been prevented. Better save your project at this point, preferably as a new file. It's recommended to restart REAPER before using the plug-in again.

Please report this error:

  1. Copy the following error information.
  2. Paste the error information into an email and send it via email to [email protected], along with the RPP file, your REAPER.ini file and some instructions how to reproduce the issue.

Thank you for your support!

--- cut ---
Message: already mutably borrowed: BorrowError

0: 0x7ffca03dcb6d - Extended
1: 0x7ffca03dc229 - Extended
2: 0x7ffca02ea801 - MAIN
3: 0x7ffca03f0798 - Extended
4: 0x7ffca03f02ef - Extended
5: 0x7ffca0400d10 - rust_eh_personality
6: 0x7ffca0400b63 - rust_eh_personality
7: 0x7ffca018b725 - NSEEL_HOSTSTUB_EnterMutex
8: 0x140825a3d -
9: 0x140343f34 -
10: 0x140365455 -
11: 0x140365353 -
12: 0x140770a51 -
13: 0x1405105f4 -
14: 0x1405103d1 -
15: 0x140510314 -
16: 0xa5c0271 - ReaperPluginEntry
17: 0xa465ad9 -
18: 0xa4646cf -
19: 0xa507a23 - png_get_current_pass_number
20: 0xa5b1bb9 - png_get_current_pass_number
21: 0x1404209bf -
22: 0x14041dc8f -
23: 0x140541352 -
24: 0x1405412cc -
25: 0x14017282e -
26: 0x1401787e8 -
27: 0x140178565 -
28: 0x7ffca01df352 - DllMain
29: 0x7ffca02bacb5 - MAIN
30: 0x7ffca02ba287 - MAIN
31: 0x7ffcd0d8802e - IsWindowInDestroy
32: 0x7ffcd0d877f2 - IsWindowInDestroy
33: 0x7ffcd0d876ff - IsWindowInDestroy
34: 0x7ffcd0d85c7d - CallWindowProcW
35: 0x7ffcd0d8528c - SendMessageW
36: 0x7ffcd0d84ff8 - SendMessageW
37: 0x7ffcbf366459 - ImageList_LoadImageW
38: 0x7ffcbf39df0c - Ordinal342
39: 0x7ffcd0d85c7d - CallWindowProcW
40: 0x7ffcd0d85672 - DispatchMessageW
41: 0x1403a50f5 -
42: 0x140864b01 -
43: 0x7ffcd09b7bd4 - BaseThreadInitThunk
44: 0x7ffcd182ce51 - RtlUserThreadStart
--- cut ---

Target track number not saved with preset

If I save a preset with reaper "save preset" function and then I reload it on another project the track numbers are replaced sometimes with and sometimes with seemingly random numbers. The same is true for "Send effect" number with target set to "Track send volume".

Am i doing something wrong?

Feedback groups

I'm having troubles with the feedback under certain circumstances more related to my setup/midi controller than Realearn.

A few suggestions that would help making things work:

An option for realearn to resend feedback for the whole list of parameters after only one parameter is changed.

As an alternative is would be nice if the "Send feedback now" button was automatable in Reaper.

As an other alternative, an option to group parameters so that if one parameter of the group is changed, the feedback is sent for all parameters of that group.

More options for the feedback, like the ability to change the feedback CC value. For example, Source is on CC68 but feedback goes out on CC22.
(i understand currently it's possible to do that by adding a parameter line only sending feedback but it makes things more complicated).

Thanks for your work, Regards,

Incremental buttons turbo mode

For firing increments/decrements as long as button pressed. Key pressure could increase/decrease tempo of fire.

Combination with length makes it possible to start turbo only after certain time. But for this we must implement that it fires at "min length" and not when releasing the button.

Strange and unreliable feedback when target min == max

Strange because of strange normalization behavior if value == target min == target max (it returned min in that case, but it would make more sense to return 1.0).

Unreliable because of numerical inaccuracies when querying actual parameter FX values (they can deviate from the requested value, e.g. you request 0.2 and get 0.19999999423128). Usually that's not an issue but if target min == target max we have don't have a range of values anymore but just one particular value - and then it's an issue for getting the right feedback value.

Target variable evaluation in Control Transformation

Currently in the Control Transformation y is not set to the target value right now before evaluating the formula. This means that formulas like
y = x == 0 ? y : (y == 0 ? 1 : 0)
cannot work.

In Feedback transofrmation, on the other hand, a formula like x=x==0?62/127:60/127 for me works fine (colors are correct).

Improvements to conditional activation

Hi @helgoboss ,
first of all congratulation for including this feature, I found it really useful for my workflow. It overall works well but there are a couple of issues on my end (Reaper 5.99, Windows x64).

  1. Realearn (and reaper) crash every time I try to visualise automation lane for the new Parameters.
  2. When using conditional activation with program selected (the one I found more useful for my purposes) I am annoyed by the mismatch created by the 0-indexing structure of Rust (or reaper C++ API?), i.e. a parameter with program 1 selected is actually seen as 0, 2 as 0.01 and so on, this makes assigning parameter value from another realearn instance painful, as I always have to remember to add 1 to get to my target. It would be helpful if either parameter program would start from 0 or the underlying parameter values would start from 1.

Feedback and Control Transformation for Toggle Mode

Hello,
currently Feedback and Control Transformation are available only in Ablsolute mode. It would be nice to have them in Toggle mode as well.
I guess it would also make sense in relative mode, even though I have never fount it necessary yet.
Thanks

Decrease project file size

At the moment all fields are serialized and end up in the REAPER project file. We could - probably easily - reduce the size by not serializing fields which have the default value.

Error "Message: -1 is not a valid value"

Message: -1 is not a valid value

   0:        0x124d413c0 - backtrace::capture::Backtrace::create::h433f2017b514975c
   1:        0x124d412f1 - backtrace::capture::Backtrace::new::hef917fdb1d781165
   2:        0x124c62f55 - reaper_high::log_util::create_reaper_panic_hook::{{closure}}::h87471ae040b9fc4f
   3:        0x124d6a766 - std::panicking::rust_panic_with_hook::hf8b9378dd2e7986a
   4:        0x124d9fdfd - std::panicking::begin_panic::h98a7de04a1dc5e05
   5:        0x124d03f57 - <reaper_medium::control_surface::DelegatingControlSurface as reaper_low::control_surface::IReaperControlSurface>::Extended::h8bea4eb454c479d1
   6:        0x124d2189a - _Extended
   7:        0x10cea1a7a - __Z14CSurf_ExtendediPvS_S_P21IReaperControlSurface
   8:        0x10cf4f1d2 - __ZN7FxChain19OnParmChangeMessageEiPvbb
   9:        0x10d2b07f3 - __ZN10ReaProject13ProcessFxMsgQEb
  10:        0x10cc1e449 - __Z13runMiscTimersv
  11:        0x10cc1d8fb - __Z12Main_OnTimerP6HWND__m
  12:        0x10d217d4d - __Z8MainProcP6HWND__jml
  13:        0x10d0af3c6 - __ZL28SwellDialogDefaultWindowProcP6HWND__jml
  14:     0x7fff2a6ffde9 - ___NSFireTimer
  15:     0x7fff28591d34 - ___CFStringScanInteger
  16:     0x7fff285919a7 - -[NSURL isFileReferenceURL]
  17:     0x7fff285914aa - __CFPreferencesSetValueWithContainer
  18:     0x7fff28588a7b - -[_CFXNotificationRegistrar match:object:observer:enumerator:]
  19:     0x7fff28587e73 - -[NSTaggedPointerString uppercaseStringWithLocale:]
  20:     0x7fff27872d96 - _RunCurrentEventLoopInMode
  21:     0x7fff27872b06 - _ReceiveNextEventCommon
  22:     0x7fff27872884 - __BlockUntilNextEventMatchingListInModeWithFilter
  23:     0x7fff25b1fa3b - __DPSNextEvent
  24:     0x7fff262b5e34 - -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:]
  25:     0x7fff25b1484d - -[NSApplication run]
  26:     0x7fff25ae3a3a - _NSApplicationMain
--- cut ---

Indicate in UI which mapping is currently "on"

A mapping is considered as on if:

  1. Control and/or feedback is enabled
  2. The target is active (which means it's valid and all target conditions are fulfilled)
  3. The mapping is active (in terms of conditional activation)

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

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

Recommend Topics

  • javascript

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

  • web

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

  • server

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

  • Machine learning

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

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.