u/Amethyst_sysadmin

Howl 2.0.1 release. Fix for Coyote 2 output.

This one is just a minor fix for a problem in 2.0 where Coyote 2 devices would have intermittent output.

There are no other changes - it's not necessary to update from 2.0 if you are not using a Coyote 2.

reddit.com
u/Amethyst_sysadmin — 7 days ago
▲ 52 r/HowlApp+1 crossposts

Howl 2.0 release. Loads of changes, including multiple output support.

Howl v2.0

This is a major update with a large number of changes. The APK is available from the usual Github page.

Multiple output devices

You can now use multiple estim devices at the same time. A new "Outputs" panel has been added to the UI to list and manage all of your output devices.

Many settings that used to be global are now set per-device, and have been moved to the new output settings dialog. This includes the frequency range, calibration settings and player special effects (which were renamed to "tweaks").

Bluetooth devices are now connected and disconnected by tapping the Bluetooth icon for your device in the output list. The colour of the icon shows connection status, turning green when your device is successfully connected.

New funscript meters

When a funscript is being played, the player will display meters that show the current position of all axes. For example in a typical single axis funscript, a meter shows the current position of the "stroker". Multi-axis funscripts can display up to 6 different meters, including fancy rotational ones with a different design.

Improved power meters

Howl's animated power meters now use the background of the power controls instead of dedicated bars, for a more streamlined design.

Improved charts

The pulse charts now have 4 different display modes, which the usual chart button toggles between.

  • Off.
  • Single: Shows one large chart including information from both channels.
  • Dual: Separate charts for each channel.
  • Quad: Separate charts for each channel, and separate charts for amplitude and frequency.

The X axis always denotes time. Y position signifies amplitude generally, or frequency for the specific frequency charts in quad mode. Colour signifies the channel and gives a rough guide to the frequency (with darker hues being lower frequencies).

In the dual and quad formats, charts related to channel A are displayed on the left, and charts related to channel B on the right. This brings them in line with how most users intuitively expected them to work, since they now appear below their respective channel controls. Some basic labels have also been added to make the function of each chart clearer.

A new "Chart style" setting has been added, which controls whether to display the charts in point or line mode.

Updated settings UI

The settings page has been broken up into tabbed sections, making it much easier to navigate. Quick options have been added to reset certain sections to their default values. There is also a global settings reset (under "Misc") that resets everything except remote access options. The reason for this exception is simply to help users avoid the nuisance of having to type their API key into other apps like the Kodi add-on again.

Funscript algorithm settings have been moved from the player settings dialog into their own dedicated tab on the main settings page, reducing clutter.

Additional UI improvements

  • A different layout is now used when in landscape mode, with the main controls and tab interface appearing in separate columns.
  • Scrolling behaviour has changed in the portrait mode layout so that the main controls section at the top is always fixed, and only the active tab content scrolls.
  • The highlight colour for activated buttons in the dark mode UI is a slightly different shade of pink, making it easier to differentiate between on and off states.
  • Several colours were changed in the light mode UI to make it slightly less awful (but dark mode is still better).
  • Images were removed from the main tab bar for a cleaner look and to save vertical screen space.

Core timing adjustments

This release makes some key changes deep in the bowels of the app to how Howl counts time. The main loop previously ran 10 times per second and would look into the future to calculate the correct output for devices, which could have any update rate. This was very flexible, but made some of the core logic quite convoluted. For example, because we calculated a batch of output pulses at a time, we had to do a bunch of extra work to "fake" smoothness for the charts and meters and make them look as if they were being produced one-by-one.

This version switches to having a main loop that runs 40 times per second, and only looks at the present. Pulses are batched at the output level instead, and all outputs are required to use some divisor of the app's rate (e.g. 40Hz, 20Hz, 10Hz). The advantages of this simplified system are:

  • More consistent output timing.
  • The UI runs more smoothly.
  • New UI components (such as the funscript meters) are much easier to implement.
  • Real-time functionality like streaming is more feasible, as the logic doesn't have to know the future.

Rewritten Bluetooth logic

Howl's core Bluetooth handling code has been completely rewritten to be more robust. This is intended to solve annoyances like the initial connection process sometimes randomly failing when using a Coyote 3 device with the latest firmware.

Rewritten audio engine

The way audio outputs work has been adjusted to bring them in line with the core timing changes, and for better separation between our output specific code and generic Android audio handling code. The pattern that the app is generating should now be followed more cleanly, with fewer steps being skipped or doubled.

An "Always full volume" setting has been added to all audio outputs (in the "Device" tab). This makes them completely ignore Howl's main power level, and is more convenient for users who would rather use controls on their hardware device.

Experimental "multipulse" audio output

An experimental new output method for stereostim devices. It's inspired by the way pulse based devices work, but uses bursts of multiple pulses rather than individual ones.

This idea is at an early stage, so a very wide range of settings is available in the "Device" tab for testing purposes. It should be possible to adjust the feel a great deal using the provided settings.

I need some stereostim users to experiment with this output method and give me some feedback on what the optimal settings are, and whether it's worth including it in future releases or not.

Websocket remote API

A persistent websocket variant of the remote API has been added, running on port 4696 (when remote access is enabled). Developers should refer to the remote API wiki page for further details.

Pattern streaming functionality

Adds a streaming function, allowing developers to send patterns to Howl in real-time. Use this by first calling the start_stream API endpoint, which causes Howl to switch source to your stream. start_stream also offers various parameters such as update rate and buffer size which can be tuned for your use case. Once your stream is active, periodically call stream_pulse with pulse objects representing the pattern you want to play. The websocket API is recommended for this, since the REST API can only support low update rates due to the overhead of having to establish a new connection on every call to stream_pulse.

Other miscellaneous changes

  • The "Scale amplitude" per-channel effect was removed. For balancing out a very conductive electrode that feels too strong, the power balance calibration should be used instead (and is more intuitive to set).
  • An "Amplitude scaling" calibration was added. This affects both channels and is intended to allow for balancing between multiple output devices (leave it set to 1.0 if you have a single output).
  • The random amplitude and frequency noise special effects were removed. I didn't think they were useful enough to justify the screen space that their various settings required in the list.
  • Changing the frequency range was removed from the API. This is because it was made device specific, and the API does not provide methods to set device specific options.
  • The smoothing applied in manual mode can now be set to zero.
  • The recorder feature now records the initial pattern output (before calibrations etc.) instead of final output. This fixes a bug with 1.1 where if you had calibrations applied and recorded something, it would be different when playing it back (due to the calibration being recorded and then being applied a second time on top).
  • Added a 5 hour maximum time limit to the playback service. This prevents it running in the background forever (and consuming battery) if the user accidentally leaves the player running (thanks upbeat59 for reporting).
  • Fixed a bug that caused the "Opposites" activity to not randomly change speed during execution like it was intended to (thanks xkcd1234 for spotting and fixing that).
  • The file size of the release APK is now even smaller, as it's built with additional optimisations to remove unused library code and resources.

With this number of improvements, it is almost inevitable that there will also be some new bugs. If you notice any issues, please report them.

u/Amethyst_sysadmin — 11 days ago
▲ 15 r/HowlApp+1 crossposts

Need some experienced stereostim users to test a new algorithm

Multipulse output idea

I had an idea for a different way to drive stereostim devices that was inspired by how pulse based devices like the Coyote work, and also draws on some concepts from wavelets. Instead of single pulses like some basic devices use, it fires bursts of multiple charge balanced square pulses. I've dubbed this the "multipulse" output technique.

I don't really know if this is a particularly good idea or not, or how best to tune the parameters (as I don't have a stereostim device myself). So I included all the options I thought might make a difference into a test build of Howl, so that you can adjust them in real-time and see what combination works best. A couple of the options are actually getting into original research territory and haven't been very well explored previously.

So it's over to you guinea pigs brave testers to let me know if it works well or not, and what settings you find the best!

How to test

  • Download and install the alpha test build of Howl from here (Android only).
  • Choose "Audio (multipulse)" as the output type (under Settings / Output). The other settings on that page are described below, and can be tuned to your liking.
  • If you haven't used Howl with audio output before, also check the "Suggested settings" section on this page, which explains some basics.
  • Play any patterns you want in Howl. Any of its normal functions should hopefully work.
  • Please post some feedback on whether you like this algorithm or not. Let me know what combination of settings worked best for you.

Additional notes

This is definitely one for seasoned stereostim users, as we're trying something new that could well be badly tuned by default, or have implementation bugs.

This development build of Howl has a ton of changes I'm working on for the next release, including various UI updates and some fairly deep changes to the main loop and how things are timed. So there's a high chance that it might have some new bugs. If you notice any particular problems (even if they are nothing to do with the new output type), please let me know.

Thanks to Diglet (developer of Restim) who I bounced some ideas off, and for helpful safety advice on this kind of audio output.

Description of settings

Number of pulses per burst

You can set how many pulses Howl will fire in each burst at the lowest frequency (the 1Hz setting) and at the highest frequency (the 100Hz setting). Values in between are interpolated, so at 50Hz you'll get an amount of pulses halfway between the two.

I had a theory that it might feel nicer to use more pulses at low frequencies (as this makes the total energy more balanced across the range). But see what you think.

Pulse width (microseconds)

How long each individual pulse in the burst is. The value shown is for a single high or low section (so the entire balanced square pulse will be double the displayed length).

Delay between each pulse in burst (microseconds)

How long to wait between each pulse in the burst. I don't think this aspect has been explored much. Does it feel better to have a delay here, or to just set 0?

Intra pulse delay (microseconds)

How long to wait between the high and low sections of a single pulse. Only very short delays can be offered here for safety reasons (due to the need to balance charge).

Prevent interference

When this option is enabled, only one channel is allowed to fire a burst at a time. So the two channels should be unable to interfere with each other. The idea is based on something the Coyote 3 does, but as far as I'm aware nobody has tried it with stereostim, so I don't know if it's particularly helpful or not!

This option should work better with shorter bursts (less pulses, shorter pulses, shorter delays). Because it works by modifying the pulse timing, as if both channels want to fire at the same time, one is forced to wait. So the shorter our bursts are, the less the timing gets disrupted by enabling this setting.

Estimated duty cycles

The bottom of the output settings screen shows you estimated duty cycles at various different frequencies. The lines turn red if you have picked incompatible settings that will not fit, so less bursts would be fired than the desired frequency (this happens at less than 100% duty cycle due to the various delay parameters, and an enforced minimum delay between bursts).

Updates

2 August: I noticed that the new funscript meters have a couple of issues in this build. All the rotational ones (for multi-axis scripts) work the wrong way round. And the meters don't respect the configured remote latency adjustment, so move with the wrong timing (playback is correct, but the meters are wrong). It's not particularly relevant to trying the new output, but just thought I'd mention it in case anyone else runs into that. The meters will be fixed before the final release.

reddit.com
u/Amethyst_sysadmin — 28 days ago

Howl 1.1.1 release. Minor crash bug fix.

Just a small fix for a crash bug related to the debug log changes in v1.1. Thanks to Vpn33 for reporting it.

reddit.com
u/Amethyst_sysadmin — 1 month ago
▲ 36 r/HowlApp+1 crossposts

Howl 1.1 release. Multi-axis funscript support & new calibration settings.

Reworked funscript algorithm with multi-axis support

Howl now supports multi-axis funscripts. These scripts are usually created for robotic stroker toys, such as the OSR2 or SR6. In addition to up/down movements like a basic funscript, they can contain other motions such as rotation, side to side movement etc.

Scripts with up to 6 axes of motion are supported, specifically: stroke (L0), surge (L1), sway (L2), twist (R0), roll (R1) and pitch (R2).

Some additional changes, which also apply to "normal" single axis funscripts, make the algorithm more dynamic overall. These include considering the energy of strokes when deciding what frequencies to use (previously this was purely position based). And adding a directional frequency component, so that downward strokes have a subtly different feel to upward ones.

Howl only supports funscripts where all the axes are present in a single file. If you have scripts in the older format that provided a separate file for each axis (like "example.funscript", "example.pitch.funscript" and "example.roll.funscript"), you can combine them into a single file using the helpful "funscript_combiner.py" Python script that I've provided in the repository.

How is it possible to support six motion axes with just two output channels?

Well firstly we kind of have four output channels (since amplitude and frequency can pretty much be treated as independent variables for the type of estim use we're considering). And secondly Howl's funscript support has never worked simply by mapping one axis to another. It instead considers what the actual "feel" of a script played on a stroker device might be, and translates that into estim sensations.

The first step was coming up with a way to feed all of the motion axes that are present into our power algorithm. So that any movement on any axis produces a sensation that can be felt. Then to make things a bit more fun, I also added some special axis specific frequency effects. For example leaning forward in R2 has a different feel to leaning back (it's subtle, but it's there).

Of course you're still not going to get a complete 3D effect in a stereo system. But hopefully you'll find it's a fun time, and can feel noticably different to single axis scripts.

New calibration feature

Three calibration activities provide new settings to optimise your device's output in various ways, along with appropriate test patterns.

This calibration is implemented in a device independent way, so features like frequency balance (which previously only the Coyote 3 had a hardware setting for) are now available to users of other devices.

Calibrate power

Can balance the power on channel A and B so that you feel equal sensation on both when they are at the same numbered power setting. This is helpful when using different types of electrodes on each channel that would not normally be balanced.

Calibrate position

Optimise how Howl's positional effect is calculated, to feel more even throughout each stroke (improving realism). Howl uses this effect when playing back funscripts, and in several built-in activities.

Calibrate frequency

Allows the frequency balance on each channel to be adjusted, for example to make high and low frequencies feel equally powerful.

Additional minor changes

  • Improved the robustness of opening files with the player. When something goes wrong, it should hopefully now write a relevant error to the debug log, instead of crashing the app.
  • Added a clear warning that continuous audio output should not be used with directly driven devices (like DIY stereostim, Tingler) when selecting it. Expanded the available frequency range to 50-4000Hz.
  • Small improvements to the debug log tab. Added log levels for parity with the normal Android Log library (which display in different colours).

The eagle-eyed might notice added code for some other features such as a WebSocket API and streaming-like functionality. These are still under development for a future release, and are not yet in a usable state.

reddit.com
u/Amethyst_sysadmin — 1 month ago