CamillaDSP - Cross-platform IIR and FIR engine for crossovers, room correction etc

Hi here...

I finally made it 🙂

I have created an good enough README.md file on my GitHub :
GitHub - Lykkedk/SuperPlayer: Hacking software & scripts to play music

Properly lot's of gramma's and misspelling, sry... i'am non native English 😱
It should be good, but if i get corrections or maybe some advise i can correct it pretty easy now 😀

I did not touch the instructions.pdf for now; which are included when an git clone is executed

Jesper.

Jesper, I think its working. My DAC is changing sample rate. I had to edit the clip gains in the *.yml cuz I use -12db. Not sure it is using my filters though. Do I need to edit all the *.yml files to point to my actual filter files? I use .dbl format.
 
Morning!

Did you follow my guide README.md on github wineds?

Jesper, I think its working. My DAC is changing sample rate.
Great 🙂

I had to edit the clip gains in the *.yml cuz I use -12db
Yes... Clipgain does depends on the filter used, so if -12dB gives you results without clipping it's good

Not sure it is using my filters though. Do I need to edit all the *.yml files to point to my actual filter files? I use .dbl format.

Let me explain the flow:

[LMS] ----> squeezelite(squeeze) ----> loopback (camilla_in) ----> (camilladsp does her things here) ----> loopback (sound_out / the dac, etc...)
So when squeezelite detects a change in samplerate it executes e.g exec_96000.py
Code:
from subprocess import *
import time

from websocket import create_connection
ws = create_connection("ws://127.0.0.1:3011")

ws.send("setconfigname:/home/tc/DSP_Engine/filters/null_96000.yml")

ws.send("reload")
Then the exec_96000.yml calls the null_96000.yml.
So to answer your'e quistion, if you have music with 96000Hz you also have to have an .yml with this samplerate and fir's/biquads with the right samplerate too!

If you just leave the null_96000.yml as is, the thing will work when samplerate is changing to 96000Hz, running through a filter without anything applied to the pipeline, except for clipgain 0.0dB

Code:
---
devices:
  samplerate: 96000
  buffersize: 8192
  target_level: 4096
  adjust_period: 5

  capture:
    type: Alsa
    channels: 2
    device: "camilla_in"
    format: S32LE
  playback:
    type: Alsa
    channels: 2
    device: "sound_out"
    format: S32LE

filters:
  clipgain_L:
    type: Gain
    parameters:
      gain: -0.0
      inverted: false

  clipgain_R:
    type: Gain
    parameters:
      gain: -0.0
      inverted: false

pipeline:
- type: Filter
  channel: 0
  names:
    - clipgain_L
- type: Filter
  channel: 1
  names:
    - clipgain_R

And yes the .yml's must point to the right filters:
This is a .yml from my "real" Player:
(I run two filters a Prefilter and the final correction filter as can be seen in the .yml)
Code:
---
devices:
  samplerate: 44100
  buffersize: 4096 #8192
  target_level: 2048 #4096
  adjust_period: 5

  capture:
    type: Alsa
    channels: 2
    device: "camilla_in"
    format: S32LE
  playback:
    type: Alsa
    channels: 2
    device: "sound_out"
    format: S32LE

filters:
  L_prefir:
    type: Conv
    parameters:
      type: File
      filename: [COLOR="Red"]/home/tc/DSP_Engine/filters/44100/L_red_RP_Pre_44100.bin[/COLOR]
      format: FLOAT32LE

  R_prefir:
    type: Conv
    parameters:
      type: File
      filename: [COLOR="red"]/home/tc/DSP_Engine/filters/44100/R_red_RP_Pre_44100.bin[/COLOR]
      format: FLOAT32LE

  L_fir:
    type: Conv
    parameters:
      type: File
      filename: [COLOR="red"]/home/tc/DSP_Engine/filters/44100/L_normal_44100.bin[/COLOR]
      format: FLOAT32LE

  R_fir:
    type: Conv
    parameters:
      type: File
      filename: [COLOR="red"]/home/tc/DSP_Engine/filters/44100/R_normal_44100.bin[/COLOR]
      format: FLOAT32LE

  clipgain_L:
    type: Gain
    parameters:
      gain: -6.0
      inverted: false

  clipgain_R:
    type: Gain
    parameters:
      gain: -6.0
      inverted: false

pipeline:
- type: Filter
  channel: 0
  names:
    - L_prefir
- type: Filter
  channel: 1
  names:
    - R_prefir

- type: Filter
  channel: 0
  names:
    - L_fir
- type: Filter
  channel: 1
  names:
    - R_fir

- type: Filter
  channel: 0
  names:
    - clipgain_L
- type: Filter
  channel: 1
  names:
    - clipgain_R

Make's sense ???

Jesper.
 
Hi Jesper. I got the auto sample rates working with my filters. But only if I kill squeezelite-custom and restart it using your parameters after reboot. viz :

sudo /mnt/mmcblk0p2/tce/squeezelite-custom -n piCorePlayer -o squeeze -a 160:4::1 -b 10000:20000 -r 44100-192000:2500 -U -U -z

After that the PS command shows in putty :

/mnt/mmcblk0p2/tce/squeezelite-custom -n piCorePlayer -o squeeze -a 160 4 1 -b 10000 20000 -r 44100 192000 2500 -U -U -z

Without killing squeezelite-custom after reboot I get this from PS :

/mnt/mmcblk0p2/tce/squeezelite-custom -n piCorePlayer -o squeeze -a 160 4 1 -b 10000 20000 -r 44100 192000 2500 -U -U

Is the problem the -z option? or the extra space before -b? I can't see how to set -z in the pcp web interface. What does it do?
 
Hi...

After that the PS command shows in putty :

/mnt/mmcblk0p2/tce/squeezelite-custom -n piCorePlayer -o squeeze -a 160 4 1 -b 10000 20000 -r 44100 192000 2500 -U -U -z

Without killing squeezelite-custom after reboot I get this from PS :

/mnt/mmcblk0p2/tce/squeezelite-custom -n piCorePlayer -o squeeze -a 160 4 1 -b 10000 20000 -r 44100 192000 2500 -U -U

The two lines actually does the same thing.
The -z you paste when starting it manually is only to have it running as a daemon.
When squeezeite-custom is started at boot, it is started through some script doing the same thing as the -z daemon.

What you shhould do is to change the parameters in the squeezelite webinterface, save the settings and watch for that pCP telling you that squeezelite is running.
I'am sure that problem is the pCP squeezelite settings!

When i start my testrig player the ps outout is like this ;
tc@piCorePlayer:~$ ps aux | grep squeezelite*
1432 root 0:01 /mnt/mmcblk0p2/tce/squeezelite-custom -n piCorePlayer -o squeeze -a 80 4 1 -b 10000 20000 -r 44100 192000 2500 -s 192.168.1.29 -U -U

Jesper.
 

Attachments

  • Screenshot from 2020-07-19 07-51-14.png
    Screenshot from 2020-07-19 07-51-14.png
    58 KB · Views: 312
Minor update: I have now tested v0.3.1 enough to make it a proper release. There are new binaries to download but they contain no changes from the 0.3.1-alpha. No need to update if you are already running that one.

Another piece of news is that I now have a proper Mac to test things on. Right now I'm using it to listen to music with Spotify -> virtual sound card (BlackHole) -> CamillaDSP (dummy filter, resampling and rate adjust active) -> built in headphone output. It's working just fine 🙂

Oh and one more thing. I have started building a gui for configuring CamillaDSP. It's based on React.js, so it runs in the browser and will communicate with CamillaDSP via the websocket server. Remote control will be possible! At the moment it's mostly a mock-up and I probably need at least a few more weeks before it's usable. I'm quite new to React (and javascript) so it's not going very fast but it's a very useful learning experience.
 
Oh and one more thing. I have started building a gui for configuring CamillaDSP. It's based on React.js, so it runs in the browser and will communicate with CamillaDSP via the websocket server. Remote control will be possible! At the moment it's mostly a mock-up and I probably need at least a few more weeks before it's usable. I'm quite new to React (and javascript) so it's not going very fast but it's a very useful learning experience.

Looking forward to this 🙂

I guess you give the possibilities to configure the .yml files online, with all it's parameters (chunksize, samplerate, resampling, gain etc... etc..)

Well i donno if you have the option in mind to make it possible to apply some EQ directly to the pipeline. Let me explain: I have some filter which i could find very interessting to have some EQ applied at maybe the "bass <200Hz" area, this way i can better determine if i bother to make some new filters/firs for this!... hope you understand?

Aka'a a standalone apply able equalizer 😀

Jesper.
 
Oh and one more thing. I have started building a gui for configuring CamillaDSP. It's based on React.js, so it runs in the browser and will communicate with CamillaDSP via the websocket server. Remote control will be possible! At the moment it's mostly a mock-up and I probably need at least a few more weeks before it's usable. I'm quite new to React (and javascript) so it's not going very fast but it's a very useful learning experience.

Very cool. I would suggest switching to typescript. It’s much cleaner and let’s you make less mistakes. I could give you some pointers here and there.
 
Looking forward to this 🙂

I guess you give the possibilities to configure the .yml files online, with all it's parameters (chunksize, samplerate, resampling, gain etc... etc..)
Yes that is exactly the plan!

This is how it looks right now. Devices and filters are almost done, I'm working on mixers, and haven't started on the pipeline yet. Yes I know it's ugly, but I won't spend time on the looks until it's working 🙂

camillagui.jpg

Well i donno if you have the option in mind to make it possible to apply some EQ directly to the pipeline. Let me explain: I have some filter which i could find very interessting to have some EQ applied at maybe the "bass <200Hz" area, this way i can better determine if i bother to make some new filters/firs for this!... hope you understand?

Aka'a a standalone apply able equalizer 😀

Jesper.
It will be easy to add for example a shelf to boost/attenuate everything <200Hz. Or a Peaking filter to only modify around a specific frequency. Is this what you mean?
 
Would be really great if the ui would plot the actual combined frequency/phase response of a channel. You could use something like react-charts for that. This might help converting the FIR (and IIR) coefficients to frequency and phase response graphs. And if you can actually do that, than it's a small step to also incorporate the frequency response of the unfiltered system, so you can immediately see what your doing. Final major milestone would be a proper FIR filter designer via a web interface 😀
 
Would be really great if the ui would plot the actual combined frequency/phase response of a channel. You could use something like react-charts for that. This might help converting the FIR (and IIR) coefficients to frequency and phase response graphs. And if you can actually do that, than it's a small step to also incorporate the frequency response of the unfiltered system, so you can immediately see what your doing. Final major milestone would be a proper FIR filter designer via a web interface 😀
Yes I think some plotting would be quite useful. First I'll just make it work, then the plan is to start by including the functionality of the show_config python script. That will keep me busy for a while. Then we'll see about more stuff 🙂
Thanks for the tips on fili and react-charts, they seem to have a lot of the stuff I will need.
 
Trying to apply a fir filter on a file. all I get as output file is noise.
Can anyone point me where is the error?

Code:
devices:
 samplerate: 88200
 chunksize: 65536
 enable_resampling: true
 resampler_type: AccurateAsync
 queuelimit: 128
 capture_samplerate: 44100
 capture:
  type: File
  channels: 2
  filename: /opt/02.wav
  format: S16LE
 playback:
  type: File
  channels: 2
  filename: /dev/stdout
  format: S24LE

filters:
 fir:
  type: Conv
  parameters:
   type: File
   filename: /opt/impulse.txt
   format: TEXT

pipeline:
 - type: Filter
   channel: 0
   names:
    - fir
 - type: Filter
   channel: 1
   names:
    - fir

Command:

Code:
camilladsp /opt/test88.yml | sox -V4 -G -t raw -b 24 -e signed-integer -c 2 -r 88200 -L - -t wav out.wav
 
Yes that is exactly the plan!

This is how it looks right now. Devices and filters are almost done, I'm working on mixers, and haven't started on the pipeline yet. Yes I know it's ugly, but I won't spend time on the looks until it's working 🙂

View attachment 862714


It will be easy to add for example a shelf to boost/attenuate everything <200Hz. Or a Peaking filter to only modify around a specific frequency. Is this what you mean?

Yes, more or less.
Well i'am not programmer, but having the possibility to apply the EQ directly to the "pipeline" will make life easier for me 🙂

Anyway how do i make an boost from around 200Hz to 20Hz most easy as it is now?

Jesper.
 
A flat boast (Shelf) or a gradually rising boast (Peak)?

Shelf:

filters:
shelf:
type: Biquad
parameters:
type: Highshelf
freq: 200
slope: 6
gain: 3

or...

Peak:

filters:
peak:
type: Biquad
parameters:
type: Peaking
freq: 20000
q: 0.5
gain: 3


This is me trying to do educated-guessing as I have not yet run the Camilla system.. but I checked the git-hub examples.

//