From e039caceaf914daead8e24406558ba8f9db0d6f4 Mon Sep 17 00:00:00 2001 From: Robin Davies Date: Sat, 2 Oct 2021 17:18:59 -0400 Subject: [PATCH 01/11] Update README.md One last edit of README.md before publishing. --- README.md | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b0f1f40..d8d12d3 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# PiPedal +# PiPedal v0.0,1 (Alpha) PiPedal is a multi-effect guitar pedal for Raspberry Pi devices. You will need a suitable audio input/output device to use PiPedal, which can be either an external USB audio adapter, or a Raspberry Pi ADC/DAC hat, providing at least one input and one output audio channel. -PiPedal is controlled via a clean compact web app that's suitable for use on small-form devices, like phones and tablets, although it works gloriously with desktop browers as well. You should not have to carry around a laptop to control your PiPedal when you're out gigging; and the web interface for PiPedal has been designed with that scenario specifically in mind. PiPedal has been designed with compact display formats, and touch user-interfaces in mind. Just connect to the PiPedal Wi-Fi access point with your phone, and you have complete control over your PiPedal. +PiPedal is controlled via a clean compact web app that's suitable for use on small-form-factor devices, like phones and tablets, although it works gloriously with desktop browers as well. You should not have to carry around a laptop to control your PiPedal when you're out gigging; and the web interface for PiPedal has been designed with that scenario specifically in mind. PiPedal has been designed with compact display formats, and touch user-interfaces in mind. Just connect to the PiPedal Wi-Fi access point with your phone, and you have complete control over your PiPedal. PiPedal uses LV2 audio plugin effects. You will need to install LV2 plugins before you can get started. See the LV2 Plugins section, below, for a list of good plugin collections to get started with. @@ -17,7 +17,7 @@ PiPedal is intended for use on Raspberry Pi devices running Raspbian; but it has Note that Pipedal is not intended for use when logged in to Raspbian. Screen updates and heavy filesystem activity will cause audio dropouts. For best results, access PiPedal using the web interface remotely, through the Wi-Fi hotspot. Accessing the web interface via Wi-Fi has little or no effect on audio latency or dropouts. -With a good USB audio device, PiPedal should be able to provide stable audio with 4ms (good), or 2ms (excellent) latency on a Raspberry Pi 4 when running on a Realtime kernel. Your results may vary. +With a good USB audio device, PiPedal should be able to provide stable audio with 4ms (good), or 2ms (excellent) latency on a Raspberry Pi 4 when running on a Realtime kernel. Your actual results may vary. Make sure your system is fully updated, and that you are running with a kernel version of 5.10 or later, since version 5.10 of the Linux kernel provides significantly improved support for USB audio devices. @@ -33,6 +33,35 @@ On a Raspberry Pi 4 device, Wi-Fi, USB 2.0, USB 3.0 and SDCARD access are perfor In theory, USB audio devices should be able to run even with significant filesystem or display device activity on a realtime kernel; but that does not seem to be the case currently. There is some reason to beleive that there are outstanding issues with the Broadcom 2711 PCI Express bus drivers on realtime kernels, but as of September 2021, this is still a research issue. If you are brave, there are suggestions that these issues arise when the PCI-express bus goes into power-saving mode, which can be prevented by building a realtime kernel with all power-saving options disabled. But this is currently unconfirmed speculation. +## Hardware Requirements + +* A Raspberry PI 4B, with at least 2GB of RAM to run, and at least 4GB of RAM to build. +* An external USB Audio Adapater with at least one audio input, and one audio output. + +PiPedal has been tested on the following Operating Systems: + +* Raspbian 32-bit +* Ubuntu Gnome 3 21.04 32-bit or 64-bit. + +But it should work on most debian-derived Linux variants. + +PiPedal will definitely proved better latency when installed on a Linux OS with a full realtime kernel. But standard PREEMPT variants of the Linux Kernel work very well for all practical purposes. + +When running on Ubuntu, you should install the Ubunto Studio addons and enable the low-latency settings and performance tweaks options. + + sudo apt install ubuntustudio-installer + +(You probably want to install the Audio Plugins options as well). + +To get PiPedal to work properly on Ubuntu while not logged on, you must install PulseAudio + + sudo apt remove pulseaudio + +If you choose not to do that, it is possible to use PiPedal with pulseaudio installed, but you will have to start and stop the jack audio service installed by PiPedal manually + + sudo pipedalconfig --restart + +(which will kill the Pulse Audio daemon as part of the restart process). ## Configuring PiPedal After Installation From fe87367ddff0c150abbb79b6bf5ba697ff41a1ac Mon Sep 17 00:00:00 2001 From: Robin Davies Date: Sun, 3 Oct 2021 18:06:44 -0400 Subject: [PATCH 02/11] Add Screenshot --- artifacts/PiPedalSshots.png | Bin 0 -> 91413 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 artifacts/PiPedalSshots.png diff --git a/artifacts/PiPedalSshots.png b/artifacts/PiPedalSshots.png new file mode 100644 index 0000000000000000000000000000000000000000..8e799bcdd3cea0d4cab67e311728e44d883110bb GIT binary patch literal 91413 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

uH6X8~6mt^z=fN&G7}>Tx+k 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 Date: Sun, 3 Oct 2021 18:10:36 -0400 Subject: [PATCH 03/11] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d8d12d3..c7ca7d2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # PiPedal v0.0,1 (Alpha) +![Screenshot](artifacts/PiPedalSshots.png) + PiPedal is a multi-effect guitar pedal for Raspberry Pi devices. You will need a suitable audio input/output device to use PiPedal, which can be either an external USB audio adapter, or a Raspberry Pi ADC/DAC hat, providing at least one input and one output audio channel. PiPedal is controlled via a clean compact web app that's suitable for use on small-form-factor devices, like phones and tablets, although it works gloriously with desktop browers as well. You should not have to carry around a laptop to control your PiPedal when you're out gigging; and the web interface for PiPedal has been designed with that scenario specifically in mind. PiPedal has been designed with compact display formats, and touch user-interfaces in mind. Just connect to the PiPedal Wi-Fi access point with your phone, and you have complete control over your PiPedal. From cd50ccf3d8d0d3c4b92163f2c775d02a96a3f62c Mon Sep 17 00:00:00 2001 From: Robin Davies Date: Sun, 3 Oct 2021 18:33:36 -0400 Subject: [PATCH 04/11] Update README.md --- README.md | 96 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 49 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index c7ca7d2..39a4ed5 100644 --- a/README.md +++ b/README.md @@ -2,18 +2,32 @@ ![Screenshot](artifacts/PiPedalSshots.png) -PiPedal is a multi-effect guitar pedal for Raspberry Pi devices. You will need a suitable audio input/output device to use PiPedal, which can be either an external USB audio adapter, or a Raspberry Pi ADC/DAC hat, providing at least one input and one output audio channel. +PiPedal is a multi-effect guitar pedal for Raspberry Pi devices, running Raspbian, or Ubuntu. -PiPedal is controlled via a clean compact web app that's suitable for use on small-form-factor devices, like phones and tablets, although it works gloriously with desktop browers as well. You should not have to carry around a laptop to control your PiPedal when you're out gigging; and the web interface for PiPedal has been designed with that scenario specifically in mind. PiPedal has been designed with compact display formats, and touch user-interfaces in mind. Just connect to the PiPedal Wi-Fi access point with your phone, and you have complete control over your PiPedal. +You will need a suitable audio input/output device to use PiPedal, which can be either an external USB audio device, or a Raspberry Pi ADC/DAC hat, providing at least one input and one output audio channel. + +PiPedal is controlled via a web app that's been designed to support small-form-factor devices, like phones and tablets, although it works gloriously with desktop browers as well. You should not have to carry around a laptop to control your PiPedal when you're out gigging; and the web interface for PiPedal has been designed with that scenario specifically in mind. Just connect your phone to the PiPedal Wi-Fi hotspot and you have complete control over your PiPedal. PiPedal uses LV2 audio plugin effects. You will need to install LV2 plugins before you can get started. See the LV2 Plugins section, below, for a list of good plugin collections to get started with. You can add as many plugins to your patch as your CPU will support (well over a dozen on a Raspberry Pi 4+). Signal chains can have an arbitrary number of split chains, which may be A/B-selected or mixed if you wish. -PiPedal allows you to easily bind Midi controls and notes to LV2 plugin controls using the Midi Bindings dialog. USB micro controllers such as the Korg nano series of MIDI controllers, or the AKAI pad controllers are perfectly suited for selecting and tweaking patches while performing; or you can connect regular MIDI controllers and pedalboards via the MIDI ports on your USB Audio device, if it supports MIDI. +Bind MIDI controls and notes to LV2 plugin controls using the Midi Bindings dialog. USB micro controllers such as the Korg nano series of MIDI controllers, or the AKAI pad controllers are perfectly suited for selecting and tweaking patches while performing; or you can connect regular MIDI controllers and pedalboards via the MIDI ports on your USB Audio device, if it has them. -PiPedal is intended for use on Raspberry Pi devices running Raspbian; but it has also been tested on Ubuntu Studio. +## System Requirements + +* A Raspberry PI 4B or 400, with at least 2GB of RAM to run, and at least 4GB of RAM to build. +* An external USB Audio Adapter, or a Pi audio hat with at least one audio input, and one audio output. + +PiPedal has been tested on the following Operating Systems: + +* Raspbian 32-bit +* Ubuntu Gnome3 21.04 32-bit or 64-bit (Ubuntu KDE will not work) + +But it should work on most Debian-derived Linux variants. + +An RT_PREEMPT kernel does provide better latency; but modern PREEMPT kernels provide enough real-time support to run PiPedal without problems. ## Latency @@ -35,36 +49,6 @@ On a Raspberry Pi 4 device, Wi-Fi, USB 2.0, USB 3.0 and SDCARD access are perfor In theory, USB audio devices should be able to run even with significant filesystem or display device activity on a realtime kernel; but that does not seem to be the case currently. There is some reason to beleive that there are outstanding issues with the Broadcom 2711 PCI Express bus drivers on realtime kernels, but as of September 2021, this is still a research issue. If you are brave, there are suggestions that these issues arise when the PCI-express bus goes into power-saving mode, which can be prevented by building a realtime kernel with all power-saving options disabled. But this is currently unconfirmed speculation. -## Hardware Requirements - -* A Raspberry PI 4B, with at least 2GB of RAM to run, and at least 4GB of RAM to build. -* An external USB Audio Adapater with at least one audio input, and one audio output. - -PiPedal has been tested on the following Operating Systems: - -* Raspbian 32-bit -* Ubuntu Gnome 3 21.04 32-bit or 64-bit. - -But it should work on most debian-derived Linux variants. - -PiPedal will definitely proved better latency when installed on a Linux OS with a full realtime kernel. But standard PREEMPT variants of the Linux Kernel work very well for all practical purposes. - -When running on Ubuntu, you should install the Ubunto Studio addons and enable the low-latency settings and performance tweaks options. - - sudo apt install ubuntustudio-installer - -(You probably want to install the Audio Plugins options as well). - -To get PiPedal to work properly on Ubuntu while not logged on, you must install PulseAudio - - sudo apt remove pulseaudio - -If you choose not to do that, it is possible to use PiPedal with pulseaudio installed, but you will have to start and stop the jack audio service installed by PiPedal manually - - sudo pipedalconfig --restart - -(which will kill the Pulse Audio daemon as part of the restart process). - ## Configuring PiPedal After Installation After PiPedal is installed, you can connect to the web interface as follows: via the mDNS address "http://pipedal.local" (on Windows, Mac, or iPhone web @@ -96,6 +80,24 @@ input onto the right channel of the USB audio inputs. So you probably want to co You can choose how to bind USB audio input and output channels (stereo, left only, right only) in the settings dialog. If you are using a Audio device that has more than two channels, you will be offered a list of channels to choose from instead. +## Running on Ubuntu + +When running on Ubuntu, you should install the Ubunto Studio addons and enable the low-latency settings and performance tweaks options. + + sudo apt install ubuntustudio-installer + +You probably want to install the Audio Plugins options as well. + +To get PiPedal to work properly on Ubuntu while not logged on, you must remove PulseAudio + + sudo apt remove pulseaudio + +If you choose not to do that, it is possible to use PiPedal with pulseaudio installed, but you will have to start and stop the jack audio service installed by PiPedal manually + + sudo pipedalconfig --restart + +which will kill the Pulse Audio daemon as part of the restart process. + ## Command Line Configuration of PiPedal The pipedalconfig program can be used to modify configuration of PiPedal from a shell command line. Run 'pipedalconfig --help' to view @@ -131,14 +133,13 @@ To configure PiPedal to only accept connections on the Wi-Fi host access point: ## LV2 PLugins PiPedal uses standard LV2 audio plugins for effects. There's a huge variety ofo LV2 guitar effect plugins, and plugins collections, many -of which are specifically intended for use as guitar effect plugins. Ubuntu Studio comes with a huge collection of LV2 plugins preinstalled. On Rasbian, you will have to manually select and isntall -the plugins you want to use. - -Foremost among these collections of LV2 plugins is the Guitarix plugin collection: https://guitarix.org/. You should definitely install Guitarix: +of which are specifically intended for use as guitar effect plugins. Ubuntu Studio comes with a huge collection of LV2 plugins preinstalled. On Rasbian, you will have to manually select and install the plugins you want to use. - sudo apt install guitarix-lv2 +On Ubuntu, you can install Ubuntu Studio (sudo apt install ubunt-studio-install), and ask it to install Audio Plugins. This will install a large collection of LV2 plugins, which will be automatically detected by PiPedal. Or you can choose your LV2 plugin collections manually. -Other highly recommended guitar effect collections: +The following LV2 Plugin collections are available on both Rasbian and Ubuntu. + + sudo apt install guitarix-lv2 # https://guitarix.org/ sudo apt install zam-plugins # http://www.zamaudio.com/ @@ -148,7 +149,6 @@ Other highly recommended guitar effect collections: sudo apt install fomp # http://drobilla.net/software/fomp/ - But there are many more. Visit https://lv2plug.in/pages/projects.html for more suggestions. @@ -168,7 +168,7 @@ following conditions: - Must not be MIDI instruments or have CV (Control Voltage) inputs or outputs. -- Must be remotely controllable (no hard dependency on GUI-only controls), which is true of the vast majority of LV2 plugins). +- Must be remotely controllable (no hard dependency on GUI-only controls), which is true of the vast majority of LV2 plugins. If you install new LV2 plugins, you will have to restart the PiPedal web service (or reboot the machine) to get them to show up in the web interface. @@ -179,10 +179,12 @@ without using the provided desktop GUI interface. And all but a tiny minority of ## Building and Installing PiPedal -PiPedal has only been tested on Raspbian, and has limited testing on Ubuntu Studio. But pull requests to correct problems with building PiPedal on other versions of Linux are welcome. +PiPedal has only been tested on Raspbian, and Ubuntu. But pull requests to correct problems with building PiPedal on other versions of Linux are welcome. To build PiPedal, a Raspberry Pi 4B, with at least 4GB of memory is recommended. You should be able to cross-compile PiPedal easily enough, -but we do not currently provide support for this. Consult CMake documentation on how to cross-compile source. +but we do not currently provide support on how to do this. Visual Studio Code provides excellent support for cross-compiling, which will work with the PiPedal build. Or consult CMake documentation on how to cross-compile source. + +### Prerequisites Run the following commands to install build tools required by the PiPedal build. @@ -215,9 +217,9 @@ PiPedal was developed using Visual Studio Code. Using Visual Studio Code to buil build procedure uses CMake project files, which are supported by most major Integrated Development Environments. If you open the PiPedal project as a folder in VS Code, Code will -detect the CMake configuration files, and automatically configure itself. Once the VS Code CMake plugin (written by Microsoft, +detect the CMake configuration files, and automatically configure the project to use available toolchains. Once the VS Code CMake plugin (written by Microsoft, available through the plugins store) has configured itself, build commands should appear on the bottom line of Visual Studio -Code. Visual Studio Code will take care of automatically configuring the project. +Code. If you are not using Visual Studio Code, you can configure, build and install PiPedal using CMake build tools. For your convenience, the following shell scripts have been provided in the root of the project in order to provide convenent CLI build commands. @@ -231,7 +233,7 @@ the following shell scripts have been provided in the root of the project in ord ./pkg # Build a .deb file for distribution. If you are using a development environment other than Visual Studio Code, it should be fairly straightforward to figure out how -to incorporate the PiPedal build procedure into your IDE workflow by examining the contents of the build shell scripts as a model. +to incorporate the PiPedal build procedure into your IDE workflow by using the contents of the build shell scripts as a model. The CMake toolchain can be used to generate build scripts for other build environments as well (e.g. Visual Studio .csproj files, Ant, or Linux Makefiles); and can be configured to perform cross-compiled builds as well. Consult documentation for CMake for instructions on how to From cf085f52b63cadc2c1ca1d6945ab945994809769 Mon Sep 17 00:00:00 2001 From: Robin Davies Date: Sun, 3 Oct 2021 19:19:56 -0400 Subject: [PATCH 05/11] Update README.md --- README.md | 76 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 39a4ed5..7237a5d 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![Screenshot](artifacts/PiPedalSshots.png) -PiPedal is a multi-effect guitar pedal for Raspberry Pi devices, running Raspbian, or Ubuntu. +PiPedal is a multi-effect guitar pedal for Raspberry Pi devices, running Raspbian, or Ubuntu. It is controlled via a web interface that has been designed to work well with small-form-factor devices like phones and tablets. You will need a suitable audio input/output device to use PiPedal, which can be either an external USB audio device, or a Raspberry Pi ADC/DAC hat, providing at least one input and one output audio channel. @@ -27,6 +27,8 @@ PiPedal has been tested on the following Operating Systems: But it should work on most Debian-derived Linux variants. +If you are using Rasbian, make sure to upgrade to the latest version, because versions of the Linux kernel later than 5.10 provide dramatically improved support for external USB audio devices. + An RT_PREEMPT kernel does provide better latency; but modern PREEMPT kernels provide enough real-time support to run PiPedal without problems. ## Latency @@ -35,19 +37,23 @@ Note that Pipedal is not intended for use when logged in to Raspbian. Screen upd With a good USB audio device, PiPedal should be able to provide stable audio with 4ms (good), or 2ms (excellent) latency on a Raspberry Pi 4 when running on a Realtime kernel. Your actual results may vary. -Make sure your system is fully updated, and that you are running with a kernel version of 5.10 or later, since version 5.10 of the Linux kernel provides significantly improved support for USB audio devices. +The current Linux kernel provides best latency on USB audio devices when they are configured with a sampling rate of 48kHZ, and 3 buffers. Cheap USB audio devices (e.g. M-Audio M-Track Solo, available for less than $60) should be able to run without dropouts at 48kHz with 3x64 sample buffers. Most devices in this class use the same Burr-Brown chipset. Premium USB Audio devices should run stably at 48kHZ 3x32 sample buffers (about 4ms latency). I personally use the MOTU M2 USB audio adapter, which I highly recommmend -- stable, quiet, low-latency, great controls, and built like a tank). -We currently recommend installing a realtime Raspbian kernel. PiPedal provides slightly better (but not dramatically better) latency when running on a Raspbian Realtime kernel. Stock Raspbian provides realtime scheduling, but does not currently have all of the realtime patches, so interrupt latency is slightly more variable on stock Rasbian. If you want to install a realtime kernel on Raspian, please visit +Make sure your system is fully updated, and that you are running with a kernel version of 5.10 or later, since version 5.10 of the Linux kernel incorporates significantly improved support for class-compliant USB audio devices. The MOTU M2 will not run on versions of the kernel prior to 5.10. + +RT_PREEMPT realtime kernels are recommended but not required. PiPedal provides better (but not dramatically better) latency when running on a Raspbian Realtime kernel. Stock Raspbian provides PREEMPT real-time scheduling, but does not currently have all of the realtime patches, so interrupt latency is slightly more variable on stock Rasbian than on custom builds of Raspbian with RT_PREEMPT patches applied. If you want to install a realtime kernel on Raspian, please visit https://github.com/kdoren/linux/releases/tag/5.10.35-rt39 -As of September 2021, this site provides a working Realtime kernel for Raspbian 5.10 on Raspberry Pi 3, 3+ and 4, with support for other versions in progress. +As of September 2021, this site provides a working Realtime kernel for Raspbian 5.10 on Raspberry Pi 3, 3+ and 4, with support for other versions in progress. This kernel may allow you to run with 4ms latency instead of 8ms. -Ubuntu Studio comes with the Realtime kernel patches preinstalled. +The Ubuntu Studio installer will install a realtime kernel if there is one avialable. But -- at least for Ubuntu 21.04 -- there is no stock RT_PREEMPT kernel for ARM aarch64. -On a Raspberry Pi 4 device, Wi-Fi, USB 2.0, USB 3.0 and SDCARD access are performed over separate buses (which is not true for previous versions of Raspberry Pi). It's therefore a good idea to ensure that your USB audio device is either the only device connected to the USB 2.0 ports, or the only device connected to the UBS 3.0 ports. There's no significant advantage to using USB 3.0 over USB 2.0 for USB audio. +On a Raspberry Pi 4 device, Wi-Fi, USB 2.0, USB 3.0 and SDCARD access are performed over separate buses (which is not true for previous versions of Raspberry Pi). It's therefore a good idea to ensure that your USB audio device is either the only device connected to the USB 2.0 ports, or the only device connected to the UBS 3.0 ports. There's no significant advantage to using USB 3.0 over USB 2.0 for USB audio. TCP/IP network traffic does not seem to adversely affect USB audio operation. Filesystem activity does affect USB audio operation on Rasbian, even with an RT_PREEMPT kernel; but interestingly, filesystem activity has much less effect on UBS audio on Ubuntu 21.04, even on a plain PREEMPT kernel. -In theory, USB audio devices should be able to run even with significant filesystem or display device activity on a realtime kernel; but that does not seem to be the case currently. There is some reason to beleive that there are outstanding issues with the Broadcom 2711 PCI Express bus drivers on realtime kernels, but as of September 2021, this is still a research issue. If you are brave, there are suggestions that these issues arise when the PCI-express bus goes into power-saving mode, which can be prevented by building a realtime kernel with all power-saving options disabled. But this is currently unconfirmed speculation. +There is some reason to beleive that there are outstanding issues with the Broadcom 2711 PCI Express bus drivers on Rasbian realtime kernels, but as of September 2021, this is still a research issue. If you are brave, there is strong annecdotal evidence that these issues arise when the Pi 4 PCI-express bus goes into and out of power-saving mode, which can be prevented by building a realtime kernel with all power-saving options disabled. But this is currently unconfirmed speculation. And building realtime kernels is well outside the scope of this document. (source: a youtube video on horrendously difficult bugs encountered while supporting RT_PREEMPT, by one of the RT_PREEMPT team members). + +For the meantime, for best results, log off from your Raspberry Pi, and use the web interface only. ## Configuring PiPedal After Installation @@ -82,7 +88,7 @@ device that has more than two channels, you will be offered a list of channels t ## Running on Ubuntu -When running on Ubuntu, you should install the Ubunto Studio addons and enable the low-latency settings and performance tweaks options. +When running on stock Ubuntu, you should install Ubuntu Studio addons and enable the low-latency settings and performance tweaks options. sudo apt install ubuntustudio-installer @@ -114,6 +120,8 @@ Things you can do with pipedalconfig: - enable or disable the Wi-Fi hotspot. +Run `pipedalconfig --help` for available options. + ## Changing the web server port. @@ -132,12 +140,12 @@ To configure PiPedal to only accept connections on the Wi-Fi host access point: ## LV2 PLugins -PiPedal uses standard LV2 audio plugins for effects. There's a huge variety ofo LV2 guitar effect plugins, and plugins collections, many -of which are specifically intended for use as guitar effect plugins. Ubuntu Studio comes with a huge collection of LV2 plugins preinstalled. On Rasbian, you will have to manually select and install the plugins you want to use. +PiPedal uses standard LV2 audio plugins for effects. There's a huge variety of LV2 guitar effect plugins, and plugins collections, many +of which are specifically intended for use as guitar effect plugins. Ubuntu Studio comes with an enormous collection of LV2 plugins preinstalled. On Rasbian, you will have to manually select and install the plugins you want to use. -On Ubuntu, you can install Ubuntu Studio (sudo apt install ubunt-studio-install), and ask it to install Audio Plugins. This will install a large collection of LV2 plugins, which will be automatically detected by PiPedal. Or you can choose your LV2 plugin collections manually. +On stock Ubuntu, you can install Ubuntu Studio addons (sudo apt install ubuntu-studio-install), and ask it to install Audio Plugins. This will install a large collection of LV2 plugins, which will be automatically detected by PiPedal. Or you can choose your LV2 plugin collections manually, as for Rasbian. -The following LV2 Plugin collections are available on both Rasbian and Ubuntu. +The following LV2 Plugin collections (all recommended) are available on both Rasbian and Ubuntu. sudo apt install guitarix-lv2 # https://guitarix.org/ @@ -155,11 +163,12 @@ Visit https://lv2plug.in/pages/projects.html for more suggestions. There is also a set of supplementary Gx effect plugins which did not make it into the main Guitarix distribution. You will have to compile these plugins yourself, as they are not currently avaiable via apt. But if you are comfortable building -packages on Raspbian, the effort is well worthwhile. The GxPlugins collection provides a number of boutique amp emulations, -as well as emulations of famous distortion effect pedals. +packages on Raspbian, the effort is well worthwhile. The GxPlugins collection provides a number of excellent boutique amp emulations, +as well as emulations of famous distortion effect pedals that are not part of the main Guitarix distribution. - https://github.com/brummer10/GxPlugins.lv2 +## Which LV2 Plugins does PiPedal support? PiPedal will automatically detect installed LV2 plugins and make them selectable from the web app interface, as long as they meet the following conditions: @@ -175,16 +184,17 @@ If you install new LV2 plugins, you will have to restart the PiPedal web service sudo pipedalconfig --restart Although most LV2 plugins provide GUI interfaces, when running on a LINUX desktop, the LV2 plugin standard is specifically designed to allow remote control -without using the provided desktop GUI interface. And all but a tiny minority of LV2 plugins support this. +without using the provided desktop GUI interface. And all but a tiny minority of LV2 plugins (most of them analyzers, unfortunately) support this. ## Building and Installing PiPedal PiPedal has only been tested on Raspbian, and Ubuntu. But pull requests to correct problems with building PiPedal on other versions of Linux are welcome. To build PiPedal, a Raspberry Pi 4B, with at least 4GB of memory is recommended. You should be able to cross-compile PiPedal easily enough, -but we do not currently provide support on how to do this. Visual Studio Code provides excellent support for cross-compiling, which will work with the PiPedal build. Or consult CMake documentation on how to cross-compile source. +but we do not currently provide support on how to do this. Visual Studio Code provides excellent support for cross-compiling, and good support for remote +debugging, which will work with the PiPedal build. Or consult CMake documentation on how to cross-compile source. -### Prerequisites +### Build Prerequisites Run the following commands to install build tools required by the PiPedal build. @@ -218,7 +228,7 @@ build procedure uses CMake project files, which are supported by most major Inte If you open the PiPedal project as a folder in VS Code, Code will detect the CMake configuration files, and automatically configure the project to use available toolchains. Once the VS Code CMake plugin (written by Microsoft, -available through the plugins store) has configured itself, build commands should appear on the bottom line of Visual Studio +available through the plugins store) has configured itself, build commands and configuration options should appear on the bottom line of Visual Studio Code. If you are not using Visual Studio Code, you can configure, build and install PiPedal using CMake build tools. For your convenience, @@ -243,18 +253,6 @@ you may want to investigate what Visual Studio Code's CMake integration provides ### How to Debug PiPedal. - -You must stop the pipdeal service before launching a debug instance of pipedald: - - sudo systemctl stop pipedald - -or - - pipedalconfig -stop - -But there's no harm in running a debug react server that's configured to connect to the web -socket of a production instance of pipedal. - PipPedal consists of the following subprojects: * A web application build in React, found in the react subdirectory. @@ -263,11 +261,23 @@ PipPedal consists of the following subprojects: All audio services are provided by the pipedal process. * `pipedalshutdownd`: A service to execute operations that require root credentials on behalf of pipedald. (e.g. shutdown, reboot, - and pushing configuration changes.) + and pushing configuration changes). -* `pipedalconfig`: A CLI utility for managing and configuring the pipedald service. +* `pipedalconfig`: A CLI utility for managing and configuring the pipedald services. -* `pipedaltest`: Test cases for pipedald. +* `pipedaltest`: Test cases for pipedald, built using the Catch2 framework. + + +You must stop the pipdeal service before launching a debug instance of pipedald: + + sudo systemctl stop pipedald + +or + + pipedalconfig -stop #Stops the Jack service as well. + +But there's no harm in running a debug react server that's configured to connect to the web +socket of a production instance of pipedal on port 80, if you aren't planning to debug C++ code. In production, the pipedald web server serves the PiPedal web socket, as well as static HTML from the built react components. But while debugging, it is much more convenient to use the React debug server for From 79228f04ca6deabdc3feb4f47e2abff144cf3db8 Mon Sep 17 00:00:00 2001 From: Robin Davies Date: Mon, 4 Oct 2021 14:02:33 -0400 Subject: [PATCH 06/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7237a5d..40d42ec 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PiPedal v0.0,1 (Alpha) +# PiPedal v0.0.1 (Alpha) ![Screenshot](artifacts/PiPedalSshots.png) From 54de4a88993ba1940096808bbae6e7d5bcc8cd00 Mon Sep 17 00:00:00 2001 From: Robin Davies Date: Mon, 4 Oct 2021 14:10:57 -0400 Subject: [PATCH 07/11] Update todo.txt --- todo.txt | 84 +++++++------------------------------------------------- 1 file changed, 10 insertions(+), 74 deletions(-) diff --git a/todo.txt b/todo.txt index e7fda4e..459798d 100644 --- a/todo.txt +++ b/todo.txt @@ -1,75 +1,11 @@ -Features: - - -Patches. - -9 Hotspot config. -9 Upload/download banks. -9 Delete bank warning dialo. -7 Settings dialog doesn't have back button nav. - - - have to make sure it's set in the USER's environment. - -10 Test missing plugin handling. -10 Handle 12TET and Midi control types, trigger types. - - -7 Popless loading of presets. 10hz hipass? -4 Bypass view? - -4 Midi Bindings. -3 OpenSound wire control protocol bindings. - - - -Bugs: - -Delete bank confirmation. - -Deal with aftermath of config. :-/ -pulseaudio --kill - -Reconnect of controls after config change. - -Run when there's no midi device. - -Crash when changing input channels to mono. - -frequency response is routed to both instances of ToobInput. Did we fail to detect the instanceID change? - -scrollto fix for Load Dialog. - - -Access Point: must disable wpa_supplicant when running Access Point. - - -Config issues: - -Build: cmake was installed by code. :-/ Package hell. - -Open source copyrights. - -10 JACK_PROMISCUOUS_SERVER -- must be set in all user environments. Create jack group, add JACK_PROMISCUOUS_SERVER to jackd. RTPriority for Jack? - -10 Wireless host. dnsmasq configuration. - -add pipedal.local to etc/hosts. - -/etc/dhcpcd.config: - nohook wpa_supplicant - -Dependents: - -libnl-3-dev libnl-genl-3-dev -libnl-3-200 libnl-genl-3-200 - - - - - - - - - - +SCRUM ACTIVITIES LIST +Pri Description +----------------- +9 Move Activity List to Issues. +5 Re-use plugin instances when rebuilding pedalboard. +4 Popless loading of presets. 10hz hipass? +3 OpenSound support. +2 MIDI Routing. +2 Bypass view? +1 Handle LV2 12TET/19TET/24TET Controls From 2146d5ce537370f3e10cfe4f1598be118b5cf389 Mon Sep 17 00:00:00 2001 From: Robin Davies Date: Mon, 4 Oct 2021 14:11:51 -0400 Subject: [PATCH 08/11] Create CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..131e813 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +rerdavies@gmail.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. From c120f491eb9d43ed955b145beb5c49a8213ebb30 Mon Sep 17 00:00:00 2001 From: Robin Davies Date: Mon, 4 Oct 2021 14:17:06 -0400 Subject: [PATCH 09/11] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 37 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..6e4de50 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,37 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG] Description" +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Server (please complete the following information):** + - OS: [e.g. Raspbian, Ubuntu Gnome3 21.04, Windows 10] + - PiPedal Version [See X/Settings/About,...] + +**Client (please complete the following information):** + - Device: [e.g. iPhone6/Android Tablet/Android Phone/Windows 10] + - OS: [e.g. iOS8.1/Android 11/Windows 10] + - Browser [e.g. stock browser, safari, Chrome] + - Browser Version [e.g. 82.0.1] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..bbcbbe7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From 44c7f1735e479d5812d6b9db1ad61a7f8e0acf13 Mon Sep 17 00:00:00 2001 From: Robin Davies Date: Tue, 5 Oct 2021 05:41:44 -0400 Subject: [PATCH 10/11] Update todo.txt --- todo.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/todo.txt b/todo.txt index 459798d..d038c98 100644 --- a/todo.txt +++ b/todo.txt @@ -1,10 +1,7 @@ -SCRUM ACTIVITIES LIST Pri Description ----------------- -9 Move Activity List to Issues. 5 Re-use plugin instances when rebuilding pedalboard. -4 Popless loading of presets. 10hz hipass? 3 OpenSound support. 2 MIDI Routing. 2 Bypass view? From 981d60bed0668b043a70f15110983925090f356f Mon Sep 17 00:00:00 2001 From: Robin Davies Date: Mon, 18 Oct 2021 10:15:28 -0400 Subject: [PATCH 11/11] Update README.md --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 40d42ec..6cfb031 100644 --- a/README.md +++ b/README.md @@ -202,9 +202,14 @@ Run the following commands to install build tools required by the PiPedal build. sudo apt update sudo apt install cmake ninja-build -The PiPedal build process also requires version 14 or later of `node.js`. Type `node --version` to see if you have a version +The PiPedal build process also requires version 12 or later of `node.js`. Type `node --version` to see if you have a version of `node.js` installed already. Otherwise run the following commands as root to install the v14.x lts version of `node.js`: + sudo apt install nodejs npm + +If your distribution doesn't provide a suitable version of nodejs, you can install the current LTS version of nodejs +with + # install NodeJS lastest LTS release. curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash - sudo apt-get install -y nodejs @@ -215,7 +220,7 @@ Run the following commands to install dependent libraries required by the PiPeda sudo apt update sudo apt install liblilv-dev libboost-dev libjack-jackd2-dev libnl-3-dev libnl-genl-3-dev libsystemd-dev catch sudo apt install libasound2-dev - sudo apt install libwebsocketpp-dev + sudo apt install libwebsocketpp-dev authbind Run the following command to install and configure React dependencies.