Package: ezbeq
ezbeqA simple web browser forbeqcataloguewhich integrates withminidsp-rsfor local remote control of a minidsp or HTP-1.SetupWindows / MacOSPython is required so use an appropriate package manager to install it.chocolateyis a convenient choice for Windowshomebrewis the equivalent for MacOSLinuxUse your distro package manager to install python.InstallationExample is provided for rpi users$ ssh pi@myrpi
$ sudo apt install python3 python3-venv python3-pip libyaml-dev
$ mkdir python
$ cd python
$ python3 -m venv ezbeq
$ cd ezbeq
$ . bin/activate
$ pip install ezbeqUsing with a MinidspInstall minidsp-rs as per the provided instructionshttps://github.com/mrene/minidsp-rs#installationUsing with a Monolith HTP-1See the configuration section belowUpgrade$ ssh pi@myrpi
$ cd python/ezbeq
$ . bin/activate
$ pip install --upgrade --force-reinstall ezbeqthen restart the appRunning the app manually$ ssh pi@myrpi
$ cd python/ezbeq
$ . bin/activate
$ ./bin/ezbeq
  Loading config from /home/pi/.ezbeq/ezbeq.yml
  2021-01-16 08:43:15,374 - twisted - INFO - __init__ - Serving ui from /home/pi/python/ezbeq/lib/python3.8/site-packages/ezbeq/uiNow openhttp://youripaddress:8080/index.htmlin your browserConfigurationSee$HOME/.ezbeq/ezbeq.ymlThe only intended option for override is the port option which sets the port the UI and API is accessible on. This defaults to 8080.Using a custom catalogueIfcatalogueUrlis added to the configuration, e.g.catalogueUrl: http://localhost:9999ezbeq will instead load the catalogue fromhttp://localhost:9999/database.jsonThis provides the ability to run ezbeq against a custom, or locally provided, catalogue.Configuring DevicesThe devices section contains a list of supported device, the format varies by the type of device and each item is a named device with the name subsequently appearing the UI (if multiple devices are listed)MinidspDefault values are shown, the only required value is the type fieldminidsp:
    cmdTimeout: 10
    exe: minidsp
    ignoreRetcode: false
    options: ''
    slotChangeDelay: false
    type: minidspcmdTime: default timeout in seconds for a command sent to minidsp-rs to completeexe: location of the minidsp-rs executableignoreRetcode: if true, errors generated by minidsp-rs will be ignored (for debugging/local testing only)options: additional command line switches to pass to minidsp-rs (refer to minidsp-rs docs for details)type: minidspslotChangeDelay: if true, the command to change the slot is always sent to minidsp-rs as a separate command.By default, it is assumed the Minidsp 2x4HD is in use. To use a different model, specify via the device_type option. For example:minidsp:
    cmdTimeout: 10
    exe: minidsp
    ignoreRetcode: false
    options: ''
    type: minidsp
    device_type: 4x10In order for the ezbeq ui to update when the device status is updated outside of ezbeq (e.g. using minidsp remote control), additional configuration is required to enable theminidsp rs websocket interfaceThis requires 2 optional additional values in the configurationwsDeviceId: 0
  wsIp: 127.0.0.1:5380wsIpis the address of the[http_server]from/etc/minidsp/config.tomlwsDeviceIdis the device id provided byminidsp probe, in this example 2 device ids (0 and 1) are available$ minidsp probe                                                                                                                                                                                
Found 2x4HD with serial 911111 at ws://localhost/devices/0/ws [hw_id: 10, dsp_version: 100]
Found 2x4HD with serial 911112 at ws://localhost/devices/1/ws [hw_id: 10, dsp_version: 100]Using, and controlling, multiple devices independently is supported but does require use of theoptionskey in order to direct commands to the right device. Precise configuration of this option depends on the minidsp-rs setup so is out of scope of this readme. Typical configuration would involve use of the--tcpoption combined with changes tominidsp.tomlas mentioned in theminidsp-rs docs.For reference, a community provided example configuration guide can be found viaavsA full list of supported models is provided below.Minidsp VariantsDevice support largely tracksminidsp-rs device support.BEQ MV adjustments are applied to input peq channels only.2x4HDsetdevice_type: 24HDBEQ filters are written to both input channels.Flexconfigure as per 2x4HDaddslotChangeDelay: trueto workaround issues with slow slot changingDirac mode (PEQ on output) is only supported at present via a custom configuration.DDRC-24setdevice_type: DDRC24BEQ filters are written to all output channels.DDRC-88setdevice_type: DDRC88BEQ filters are written to output channel 3 by default.Add thesw_channelsconfig key to override this, provide a list of channel indexes (0 based) to which the filters should be written. For example to write to the last two output channels:device_type: DDRC88
sw_channels:
- 6
- 74x10setdevice_type: 4x10The limited biquad capacity (5 per channel) means that filters are split across input and output channels and there is no capacity for user filters.10x10setdevice_type: 10x10The limited biquad capacity (6 per channel) means that filters are split across input and output channels and the last 2 biquads per output channel are left under user control.To avoid this, use the crossover biquads to hold the remaining beq biquads. This leaves the output PEQ untouched. Setuse_xoto one of the following values to activate this mode:all : apply beq to both crossover groups0 (or true) : apply beq to crossover group 01 : apply beq to crossover group 1SHDsetdevice_type: SHDBEQ filters are written to all output channels.Custom LayoutsTODOMonolith HTP1htp1:
    ip: 192.168.1.181
    channels:
    - sub1
    autoclear: trueBEQ filters are loaded into the bottom 10 slots of the specified channels only.ip: ip address of the HTP1channels: list of channels to apply filters to (sub1, sub2 and sub3 are the standard subwoofer channels in the HTP1)autoclear: if set to true, BEQ filters will be reset on power state or input changeJRiver Media CenterMedia Network must be enabledjriver:
    address: 192.168.1.181:52199
    auth:
      user: foo
      pass: thisismypass
    secure: true  
    channels:
    - SW
    - C9
    - C10
    block: 2address: the ip and port on which the Media Center media network is listeningauth is optional, leave this out if MCWS is not securedsecure is optional, leave this out if SSL is not usedsupported channels are L R C SW SL SR RL RR and C9 upto C32 (if more than 8 channel output is used)block is 1 or 2 and refers to the dsp slots Parametric Equalizer and Parametric Equalizer 2 respectivelyThis information isnotvalidated, it is left to the user to configure the output format on the zone to match the supplied configuration.Q-SysQ-Sys Designeris supported via theQRCprotocolqsys:
    ip: 192.168.1.181
    port: 1710
    timeout_secs: 2
    components: 
    - beq
    content_info:
    - beq_movie_info:
        text.1: title
        text.2: genres
        text.3: audio_types
        text.4: mv_adjust
        text.5: overview
        text.6: images[0]
        text.7: images[1]
    type: qsysConfiguration of the audio pipeline in Q-Sys Designer is left as an exercise for the user.2 alternative implementations are possible.One uses aIIR Custom Filtercomponent which must be connected to component which provides a text field.This can be implemented using either aText Controlleror aCustom Control.This component allows for a mapping of a text field control key to aCatalogueEntryfield name.Two fields have special treatment:filters: will be set in a format that can be linked to a IIR Custom Filter and feeds it with the required biquad coefficients.images: there can be a variable number of images so each individual image can be specified in a separate fieldThe alternative approache uses aParametric Equalisercomponent which should be configured with:at least 10 bandsq factorThe component name should be supplied in the configuration above.Note that this format does not support variable Q shelf filters.CamillaDSPCamillaDSPis supported via itswebsocketapi which means CamillaDSP must be started with additional options:-pto specify the port-ato specify the listen address (required if ezbeq runs on a different host to camilladsp)camilla:
    ip: 192.168.1.181
    port: 1710
    timeout_secs: 2
    channels: 
    - 4
    - 7
    type: camilladspip: the ip on which camilladsp is listeningport: the port on which camilladsp is listeningchannels: a list of channel numbers to which BEQ filters will be appendedOn load, the camilladsp configuration will be updated as follows:each filter will be added to theFilterssection inIIRformat using one of the Peaking, HighShelf or LowShelf filter types. Filter names will be BEQ1 to BEQ10each filter will be appended to thePipelinefor the specified channel, an entry of typeFilterwill be added if not already present for that channelOn unload, the camilladsp configuration will be updated as follows:the filters will deleted from theFilterssectionthe filters will be removed from thePipelinesectionUser controlled master volume adjustments are supported using theVolumefilter if that filter has been configured in the pipeline.BEQ specific input gain adjustments are supported via the use of aGainfilter which is inserted into the pipeline ahead of the BEQ filters themselves.Starting ezbeq on bootupThis is optional but recommended, it ensures the app starts automatically whenever the rpi boots up and makes
sure it restarts automatically if it ever crashes.We will achieve this by creating and enabling asystemdservice.Create a file ezbeq.service in the appropriate location for your distro (e.g./etc/systemd/system/for debian)::[Unit]
Description=ezbeq
After=network.target

[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi
ExecStart=/home/pi/python/ezbeq/bin/ezbeq
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.targetenable the service and start it up::$ sudo systemctl enable ezbeq.service
$ sudo service ezbeq start
$ sudo journalctl -u ezbeq.service
-- Logs begin at Sat 2019-08-17 12:17:02 BST, end at Sun 2019-08-18 21:58:43 BST. --
Aug 18 21:58:36 swoop systemd[1]: Started ezbeq.reboot and repeat step 2 to verify the recorder has automatically started