github.com-jaakkopasanen-AutoEq_-_2022-09-11_14-41-08 | |
by jaakkopasanen | |
Thumbnail | |
Download | |
Web page | |
Automatic headphone equalization from frequency responses | |
AutoEQ | |
TL;DR If you are here just looking to make your | |
headphones sound better, find your headphone model | |
inresults[1] folder's recommended headphones listand | |
follow instructions in Usage[2] section. | |
About This Project | |
AutoEQ is a project for equalizing headphone frequency | |
responses automatically and it achieves this by | |
parsingfrequency response measurements and producing | |
equalization settings which correct the headphone to a | |
neutral sound.This project currently has over 2500 | |
headphones covered in theresults[3] folder.See Usage[4] | |
for instructions how to use the results withdifferent | |
equalizer softwares andResults[5] section for details | |
about parameters and how the results wereobtained. | |
AutoEQ is not just a collection of automatically produced | |
headphone equalization settings but also a tool for | |
equalizingheadphones for yourself. autoeq.py provides | |
methods for reading data, equalizing it to a given | |
targetresponse and saving the results for usage with | |
equalizers. It's possible to use different compensation | |
(target)curves, apply tilt for making the headphones | |
brighter/darker and adding a bass boost. It's even | |
possible to make oneheadphone sound (roughly) like | |
another headphone. For more info about equalizing see | |
Equalizing[6]. Ifyou're looking for something light | |
weight to install as a dependency for your own project, | |
you'll findautoeq-pkg[7] much more suited for your needs. | |
Third major contribution of this project is the | |
measurement data and compensation curves all in a | |
numerical formatexcept for Crinacle's raw data. | |
Everything is stored as CSV files so they are easy to | |
process with any programminglanguage or even Microsoft | |
Excel. | |
Sennheiser HD 800[8] | |
Sennheiser HD 800 equalization results plotted | |
Usage | |
AutoEQ produces settings for basically all types of | |
equalizer apps. | |
Convolution Equalizers | |
Convolution equalizer is the most powerful type of | |
equalizer software. These equalizers allow extremly | |
precise controlover the frequency response and the | |
results are the same on all devices and platforms when | |
using the same FIR filter.Convolution equalizer is the | |
preferred way to use AutoEq results. | |
AutoEq supports convolution equalizers with FIR filters | |
as WAV files and with EqualizerAPO's GraphicEQ filter | |
type. Thedefault results contain FIR filters for both | |
44.1 kHz and 48 kHz sampling rates. Other sampling rates | |
are supported butnot given in the default results. | |
EqualizerAPO's GraphicEQ works with any sampling rate. | |
To use the FIR filters, download the appropriate WAV file | |
and import it to the EQ software of your choice. Please | |
keepin mind that not all EQ softwares support | |
convolution. Some equalizers can load multiple FIR | |
filters at the same time.Download both WAV files, create | |
a Zip file containing both and load the Zip file to for | |
example Roon. | |
See EqualizerApo[9] for instructions on how to use the | |
GraphicEQ. | |
Parametric Equalizers | |
Parametric equalizers have filters (bands) with user | |
adjustable gain, center frequency and quality Q. Keep in | |
mind thatparametric eq accuracy depends on the number of | |
filters available. Usually 10 filters produce very | |
goodresults but as little as 5 can be good enough. Keep | |
in mind that different parametric equalizers will produce | |
differentoutcomes with the same parameter values. | |
Parameters produced by AutoEq are equal with EqualizerAPO | |
using 48 kHz samplingrate. When using other equalizers or | |
sampling rates, it's always highly recommended to check | |
that the frequency responseof the equalizer matches the | |
parametric eq curve in the graphs. | |
All parametric equalizer except Peace require you to | |
configure the filter parameters manually with the | |
software userinterface. Some parametric equalizer use | |
filter width (band width) instead of Q. Filter width can | |
be calculated as:bw = Fc / Q where bw is the band width | |
in Herts, Fc is center frequency and Q is quality. Filter | |
width inoctaves can be calculated as: N = ln(1 + | |
1/(2*Q^2) + sqrt(((2*Q^2 + 1) / Q^2 )^2 / 4 - 1)) / ln(2) | |
where ln is thenatural logarithm. See | |
http://www.sengpielaudio.com/calculator-bandwidth.htm for | |
an online calculator. | |
It's very important to set preamp according to the value | |
given in the result README.md document. Parametric eq | |
filterswill produce positive gains and to avoid clipping | |
a preamp with negative gain is required. | |
Parametric eq settings can be used with Peace or any | |
other parametric eq which has at least 5 bands available. | |
Evenfewer bands is possible but pre-computed results | |
require to use minimum five first of the filters. | |
Parametric equalizerfilter parameters look like this: | |
| Type | Fc | Q | Gain || :------ | :------ | :--- | :---- | |
-- || Peaking | 28 Hz | 0.46 | 6.3 dB || Peaking | 162 Hz | |
| 0.91 | -2.3 dB || Peaking | 2237 Hz | 1.94 | -4.6 dB || | |
Peaking | 6093 Hz | 2.26 | -4.7 dB || Peaking | 8251 Hz | | |
3.71 | -2.9 dB | | |
Fixed Band Equalizers | |
Fixed band eq is more commonly known as graphic equalizer | |
but in order not to confuse with EqualizerAPO GraphicEQ | |
it iscalled like that in this project. Fixed band | |
equalizer is like parametric equalizer with several | |
peaking filters butdon't have adjustable frequency | |
information, only gain. All other types are preferred | |
over fixed band equalizers but onsome devices these are | |
the only available ones. | |
Fixed band equalizers have trouble compensating for | |
narrow notches and peaks that fall between two bands. | |
Good exampleis Sennheiser HD 800[10]with it's 6 kHz peak | |
that is right in between 4 kHz and 8 kHz bands of | |
standard 10-band equalizer.When using 10-band equalizer | |
check if the fixed band equalization curve is very | |
different than the desired equalizationcurve at some | |
frequency and adjust the nearby filters by ear for best | |
results. | |
Fixed band equalizer settings look like this: | |
| Type | Fc | Q | Gain || :------ | :------- | :--- | :--- | |
--- || Peaking | 31 Hz | 1.41 | 6.1 dB || Peaking | 62 Hz | |
| 1.41 | 3.0 dB || Peaking | 125 Hz | 1.41 | -1.1 dB || | |
Peaking | 250 Hz | 1.41 | -2.2 dB || Peaking | 500 Hz | | |
1.41 | -0.9 dB || Peaking | 1000 Hz | 1.41 | 0.1 dB || | |
Peaking | 2000 Hz | 1.41 | 3.6 dB || Peaking | 4000 Hz | | |
1.41 | -1.0 dB || Peaking | 8000 Hz | 1.41 | -4.1 dB || | |
Peaking | 16000 Hz | 1.41 | -7.5 dB | | |
Windows | |
has EqualizerAPO[11], Peace[12] and many media players | |
with parametric equalizers such asNeutron[13],Roon[14] | |
and Foobar2000[15]. | |
EqualizerAPO | |
It's possible to use plain EqualizerAPO[16] and edit | |
configuration file inC:\\Program | |
Files\\EqualizerAPO\\config\\config.txt. Replace contents | |
of the file with the GraphicEQ.txt file found inresults. | |
Preamp is not needed because it is incorporated into the | |
GraphicEQ line. UsingSennheiser HD 650[17]would make | |
config file look like this:GraphicEQ: 20 -0.5; 21 -0.5; | |
22 -0.5; 23 -0.5; 24 -0.5; 26 -0.5; 27 -0.5; 29 -0.5; 30 - | |
0.5; 32 -0.9; 34 -1.2; 36 -1.5; 38 -1.8; 40 -2.1; 43 - | |
2.4; 45 -2.4; 48 -2.5; 50 -2.6; 53 -3.0; 56 -3.2; 59 - | |
3.3; 63 -3.6; 66 -4.0; 70 -4.5; 74 -5.0; 78 -5.5; 83 - | |
5.9; 87 -6.3; 92 -6.7; 97 -7.0; 103 -7.3; 109 -7.6; 115 - | |
7.8; 121 -8.0; 128 -8.1; 136 -8.4; 143 -8.6; 151 -8.7; | |
160 -8.8; 169 -8.8; 178 -8.9; 188 -8.9; 199 -9.0; 210 - | |
9.0; 222 -9.0; 235 -8.9; 248 -8.8; 262 -8.6; 277 -8.5; | |
292 -8.4; 309 -8.3; 326 -8.2; 345 -8.1; 364 -7.9; 385 - | |
7.8; 406 -7.7; 429 -7.6; 453 -7.6; 479 -7.5; 506 -7.4; | |
534 -7.2; 565 -7.1; 596 -7.0; 630 -7.0; 665 -7.0; 703 - | |
7.0; 743 -7.0; 784 -7.1; 829 -7.1; 875 -7.1; 924 -7.0; | |
977 -7.1; 1032 -7.2; 1090 -7.3; 1151 -7.2; 1216 -7.0; | |
1284 -6.9; 1357 -6.7; 1433 -6.4; 1514 -6.2; 1599 -6.1; | |
1689 -5.9; 1784 -5.6; 1885 -5.4; 1991 -5.2; 2103 -5.1; | |
2221 -5.2; 2347 -5.5; 2479 -5.8; 2618 -6.2; 2766 -6.6; | |
2921 -6.9; 3086 -7.0; 3260 -6.8; 3443 -6.2; 3637 -5.6; | |
3842 -5.1; 4058 -4.6; 4287 -4.2; 4528 -4.2; 4783 -4.8; | |
5052 -5.2; 5337 -4.8; 5637 -4.3; 5955 -4.7; 6290 -4.9; | |
6644 -4.7; 7018 -4.8; 7414 -5.7; 7831 -6.3; 8272 -6.5; | |
8738 -6.5; 9230 -6.5; 9749 -6.5; 10298 -6.5; 10878 -6.5; | |
11490 -6.5; 12137 -6.5; 12821 -7.8; 13543 -9.9; 14305 - | |
9.7; 15110 -9.0; 15961 -11.0; 16860 -13.5; 17809 -14.5; | |
18812 -15.2; 19871 -15.7 | |
EqualizerAPO has a graphical user interface for adjusting | |
configurations. Launch the editor fromC:\\Program | |
Files\\EqualizerAPO\\Editor.exe. | |
equalizerapo-editor[18] | |
EqualizerAPO Editor GUI | |
Peace | |
Peace[19] is a GUI for manipulating parametric eq | |
filterswith EqualizerAPO. Peace also has visualization | |
for the end result equalization frequency response, | |
profile manager formultiple different eq settings and a | |
switch for disabling everything among other features. | |
Load eq settings into Peaceby clicking Import button and | |
select the ParametricEQ.txt file. Set the preamp to value | |
mentioned in theresults. | |
peace[20] | |
Peace with full GUI for EqualizerAPO | |
Android | |
Android has several different equalizer options but not | |
too many powerful apps which work with all apps. Wavelet | |
is the bestoption for newer Androids (version 9 and up) | |
but older devices have a built-in fixed band equalizer | |
which works system widebut the center frequencies and Q | |
values vary so might need to produce your own results[21]. | |
Wavelet | |
Wavelet[22] is an Android app which comes withall the | |
AutoEq eq profiles built in. The app works with all music | |
apps so is closest to system-wide equalizer one canhave | |
on Android without rooting. The equalizer built into this | |
app is very powerful and can represent the AutoEqprofiles | |
very accurately. There is also an option to tune the | |
sound with graphic equalizer. Wavelet has the | |
bestBluetooth device compatibility of all the tested eq | |
apps on Android. | |
The main functionalities of Wavelet are free (including | |
AutoEq profiles and graphic eq) but some extra features | |
can beunlocked with an in-app purchase. | |
Wavelet[23] | |
Neutron | |
Neutron[24] is a music player with parametric | |
equalizerand comes with all of the AutoEq profiles built | |
in but is not free. | |
USB Audio Player PRO | |
USB Audio Player PRO[25] is an Android appwith improved | |
USB audio drivers for usage with USB DACs. USB Audio | |
PlayerPRO is not system-wide but works with local files | |
and many streaming services though not with Spotify. USB | |
Audio Playerhas Toneboosters Morphit plugin which has | |
parametric equalizer. This app and the plugin are not | |
free. | |
Music EQ Equalizer | |
The best app for system wide equalization on older | |
Android phones (without rooting) isMusic Equalizer EQ[26] | |
which is a 10-band standardequalizer. Gains for each band | |
can be adjusted with only 1 dB resolution but this isn't | |
a problem because the averageerror is then only 0.25 dB, | |
hardly noticeable. Bigger problem is the potential narrow | |
peaks and notches between thebands' center frequencies | |
since there isn't really anything that can be done for | |
those. See notes aboutfixed band equalizers[27]. | |
The app starts in the presets view so you need to click | |
the left arrow in the top left corner to get to the | |
manual view. Here youcan adjust the bands. Set each band | |
level to the closest value to what the equalization | |
settings ask. Pre-computed resultsonly support standard | |
10-band equalizers which have band center frequencies at | |
31, 63, 125, 250, 500, 1000, 2000, 4000,8000 and 16000 | |
Hz. Q values are not adjustable so you don't have to | |
worry about those even though they are given in theresult | |
settings. | |
Viper4Android | |
Viper4Android[28] is a system-wideconvolution based | |
equalizer (and much more) on Android but it requires | |
rooting of the device. Viper4Android is supportedwith | |
impulse response (WAV) files. For rooted users this is | |
the best option. | |
JamesDSP | |
JamesDSP[29] is an alternative toViper4Android. It | |
provides a system wide solution, has a convolution engine | |
but requires rooting. | |
Linux | |
PulseEffects / EasyEffects | |
PulseEffects / EasyEffects[30] is a Linux module with | |
wide variety of signalprocessing tools including | |
convolution and parametric equalizers. | |
From version 4.7.2 onwards PulseEffects added support for | |
convolution FIR filters. This is the recommended way to | |
applyAutoEq presets. Navigate to the plugins tab and add | |
the convolver plugin, then click the waveform button | |
above the stereo width controls (or just the 'Impulses' | |
button as of 6.1.x), click "Import impulse" and select | |
the AutoEqgenerated WAV file. You may also need to | |
manually click 'load' in the Impulses menu for the filter | |
to be fully loaded. PulseEffects' convolver requires you | |
to set the input gain to prevent clipping. The gain | |
requiredby parametric eq should be sufficient, maybe 0.5 | |
dB of negative gain more. Depending on the version, you | |
may need torename the .wav file as .irs. | |
To use parametric eq, from version 6.0.0 onwards, first | |
select the plugins tab atthe bottom of the screen, add | |
the equalizer plugin, and load APO settings by clicking | |
"Load APO Preset" andselecting the ParametricEQ.txt file. | |
For EasyEffects <= 6.1.3, Pre-amp can be adjusted with | |
the input slider.Later versions support reading this from | |
ParametricEQ.txt. | |
From version 5.0.0 onwards, PulseEffects was renamed to | |
EasyEffects and uses PipeWire instead of PulseAudio as | |
backend.Load eq settings by clicking the top center cog & | |
clicking Import ACO Presets button and select the | |
ParametricEQ.txtfile. Pre-amp can be adjusted with the | |
input slider. | |
For versions prior to v4.8.0, adjust filter parameters by | |
clicking the cog button on each filterand set type to | |
"Bell", mode to "APO" and adjust the gain with the | |
slider. Number of filters can be changed by clickingthe | |
screwdriver and wrench button. | |
pulseeffects[31] | |
OSX / MacOS | |
System wide parametric EQ solutions on OSX typically rely | |
on separate plugin hosting software and the actual | |
pluginwhich does the actual equalization. | |
Pardon the lack of documentation for these. I have not | |
tested any of the methods myself but they have been | |
suggested byhelpful AutoEQ users. | |
SoundSource[32] is the easiest way to use AutoEq on Mac | |
since it comes with all of theprofiles built in. The | |
software is however not free. | |
Audio plugin hosts include:- Apple's own AU Lab[33] hosts | |
AU plugins and can be used as a system-wide audio output | |
via BlackHole[34] or Soundflower[35].- MenuBus[36] has a | |
free version but is no longer actively developed.- | |
Hosting AU[37] with BlackHole[38] orSoundflower[39] can | |
be used as a system wide AU plugin host. | |
EQ plugins include:- Voxengo PrimeEQ[40] is a parametric | |
EQ plugin but is not free.- Fabfilter Pro Q3[41] is | |
another parametric EQ plugin, moreexpensive than Voxengo | |
but might be easier to install and use. Note: Pro Q3 uses | |
a different system and all Q values need to be multiplied | |
by 1.41!- LAConvolver plugin[42] is a free convolver EQ | |
which works with impulse response WAV files.- AUNBandEq | |
comes built in with Mac OSX. Works at least with | |
HostingAU + BlackHole | |
hostingau+blackhole[43] | |
Tutorials:- Apple AU Lab + Soundflower + AUNBandEQ | |
Tutorial[44] AU Lab Permission Issue[45] | |
eqMac | |
eqMac[46] is a Free & Open Source[47] System Wide | |
equalizer for macOS.eqMac has a Free 10 Band EQ and an | |
Unlimited Band EQ (paid) with built-in AutoEQ | |
Integration! (Expert EQ) | |
autoeq-promo.png[48] | |
iOS | |
iOS unfortunately doesn't allow system-wide equalizers, | |
so the only options are either music players with built- | |
inequalizer or hardware solutions[49]. | |
Neutron | |
Neutron[50] is a music player with parametric equalizer | |
andcomes with all of the AutoEq profiles built in but is | |
not free. | |
EQE | |
EQE[51] is a system wide parametric equalizer on iOS but | |
requires jailbreaking. Hereare instructions on how to set | |
it up: | |
https://www.reddit.com/r/headphones/comments/dqbt81 | |
/psaifyouhaveajailbrokeniphoneyoucan/ | |
Hardware | |
Some devices have built-in equalizers and since they do | |
the processing in the device, they work with any source | |
whichcan connect to the device. | |
Qudelix 5K[52] is a portable DAC and amplifierwith wired | |
and Bluetooth connectivity and 10 band parametric | |
equalizer. | |
Radsone EasStudio ES100[53] is a Bluetooth DAC and amp | |
with built-in 10 bandequalizer. Since this is a hardware | |
solution it will work withpractically any source. | |
Equalizing | |
autoeq.py is the tool used to produce the equalization | |
results from measurement data. There is nofancy graphical | |
user interface but instead it is used from command line. | |
Installing | |
* Download and install Git: https://git- | |
scm.com/downloads. When installing Git on Windows, | |
use Windows SSL verificationinstead of Open SSL or | |
you might run into problems when installing project | |
dependencies. | |
* Download and install 64-bit Python 3.10[54]. Make | |
sure to check Add Python 3.10 to PATH. | |
* You may need to install libsndfile[55] if you're | |
having problems with soundfilewhen installing | |
requirements.txt. | |
* On Linux you may need to install Python dev | |
packagesbashsudo apt install python3-dev python3-pip | |
python3-venv | |
* On Linux you may need to install pip[56] | |
* On Windows you may need to installMicrosoft Visual | |
C++ Redistributable for Visual Studio 2015, 2017, and | |
2019[57] | |
* Open a terminal / command prompt. On Windows, search | |
cmd in the start menu. | |
* Clone AutoEqbashgit clone | |
https://github.com/jaakkopasanen/AutoEq.git | |
* Go to AutoEq locationbashcd AutoEq | |
* Check Python version. You should see Python 3.10.x | |
printed out. If you see for example 3.11.x, you need | |
to install Python 3.10.bashpython --version | |
* Create a python virtual environmentbashpython -m venv | |
venv | |
* Activate virtualenv```bash | |
On Windows | |
venv\\Scripts\\activate.bat | |
On Linux and Mac | |
. venv/bin/activate- Update pipbashpython -m pip install - | |
U pip- Install required packagesbashpython -m pip install | |
-U -r requirements.txt- Verify installation. If | |
everything went well, you'll see the list of command line | |
parameters AutoEq accepts.bashpython autoeq.py --help``` | |
When coming back at a later time you'll only need to | |
activate virtual environment again```bash | |
On Windows | |
cd AutoEqvenv\\Scripts\\activate.bat | |
On Linux and Mac | |
cd AutoEq. venv/bin/activate``` | |
To learn more about virtual environments, read Python' | |
venv documentation[58]. | |
Updating | |
AutoEq is in active development and gets new | |
measurements, results and features all the time. You can | |
get the latestversion from gitbashgit pull | |
Dependencies may change from time to time, you can update | |
to the latest withbashpython -m pip install -U -r | |
requirements.txt | |
Command Line Arguments | |
```usage: autoeq.py [-h] --inputdir INPUTDIR [--outputdir | |
OUTPUTDIR] [--standardizeinput] [--newonly] [-- | |
compensation COMPENSATION] [--equalize] [--parametriceq] | |
[--fixedbandeq] [--rockbox] [--fc FC] [--q Q] [-- | |
tenbandeq] [--maxfilters MAXFILTERS] [--convolutioneq] [-- | |
fs FS] [--bitdepth BITDEPTH] [--phase PHASE] [--fres | |
FRES] [--bassboost BASSBOOST] [--iembassboost | |
IEMBASSBOOST] [--tilt TILT] [--soundsignature | |
SOUNDSIGNATURE] [--maxgain MAXGAIN] [--trebleflower | |
TREBLEFLOWER] [--treblefupper TREBLEFUPPER] [-- | |
treblegaink TREBLEGAINK] [--showplot] [--threadcount] | |
optional arguments: -h, --help show this help message and | |
exit --inputdir INPUTDIR Path to input data directory. | |
Will look for CSV files in the data directory and | |
recursively in sub-directories. --outputdir OUTPUTDIR | |
Path to results directory. Will keep the same relative | |
paths for files found in inputdir. --standardizeinput | |
Overwrite input data in standardized sampling and bias? -- | |
newonly Only process input files which don't have results | |
in output directory. --compensation COMPENSATION File | |
path to CSV containing compensation (target) curve. | |
Compensation is necessary when equalizing because all | |
input data is raw microphone data. See "compensation", | |
"innerfidelity/resources" and "headphonecom/resources". -- | |
equalize Will run equalization if this parameter exists, | |
no value needed. --parametriceq Will produce parametric | |
eq settings if this parameter exists, no value needed. -- | |
fixedbandeq Will produce fixed band eq settings if this | |
parameter exists, no value needed. --rockbox Will produce | |
a Rockbox .cfg file with 10 band eq settings if this | |
parameter exists,no value needed. --fc FC Comma separated | |
list of center frequencies for fixed band eq. --q Q Comma | |
separated list of Q values for fixed band eq. If only one | |
value is passed it is used for all bands. Q value can be | |
calculated from bandwidth in N octaves by Q = | |
2^(N/2)/(2^N-1). --tenbandeq Shortcut parameter for | |
activating standard ten band eq optimization. -- | |
maxfilters MAXFILTERS Maximum number of filters for | |
parametric EQ. Multiple cumulative optimization runs can | |
be done by giving multiple filter counts separated by | |
"+". "5+5" would create 10 filters where the first 5 are | |
usable independently from the rest 5 and the last 5 can | |
only be used with the first 5. This allows to have | |
muliple configurations for equalizers with different | |
number of bands available. Not limited by default. -- | |
convolutioneq Will produce impulse response for | |
convolution equalizers if this parameter exists, no value | |
needed. --fs FS Sampling frequency in Hertz for impulse | |
response and parametric eq filters. Single value or | |
multiple values separated by commas eg 44100,48000. When | |
multiple values are given only the first one will be used | |
for parametric eq. Defaults to 44100. --bitdepth BITDEPTH | |
Number of bits for every sample in impulse response. | |
Defaults to 16. --phase PHASE Impulse response phase | |
characteristic. "minimum", "linear" or "both". Defaults | |
to "minimum" --fres FRES Frequency resolution for impulse | |
responses. If this is 20 then impulse response frequency | |
domain will be sampled every 20 Hz. Filter length for | |
impulse responses will be fs/fres. Defaults to 10. -- | |
bassboost BASSBOOST Bass boost shelf. Sub-bass | |
frequencies will be boosted by this amount. Can be either | |
a single value for a gain in dB or a comma separated list | |
of three values for parameters of a low shelf filter, | |
where the first is gain in dB, second is center frequency | |
(Fc) in Hz and the last is quality (Q). When only a | |
single value (gain) is given, default values for Fc and Q | |
are used which are 105.0 Hz and 0.71, respectively. For | |
example "--bassboost=6" or "--bassboost=9.5,150,0.69". -- | |
iembassboost IEMBASSBOOST iembassboost argument has been | |
removed, use "--bassboost" instead! --tilt TILT Target | |
tilt in dB/octave. Positive value (upwards slope) will | |
result in brighter frequency response and negative value | |
(downwards slope) will result in darker frequency | |
response. 1 dB/octave will produce nearly 10 dB | |
difference in desired value between 20 Hz and 20 kHz. | |
Tilt is applied with bass boost and both will affect the | |
bass gain. --soundsignature SOUNDSIGNATURE File path to a | |
sound signature CSV file. Sound signature is added to the | |
compensation curve. Error data will be used as the sound | |
signature target if the CSV file contains an error column | |
and otherwise the raw column will be used. This means | |
there are two different options for using sound | |
signature: 1st is pointing it to a result CSV file of a | |
previous run and the 2nd is to create a CSV file with | |
just frequency and raw columns by hand (or other means). | |
The Sound signature graph will be interpolated so any | |
number of point at any frequencies will do, making it | |
easy to create simple signatures with as little as two or | |
three points. --maxgain MAXGAIN Maximum positive gain in | |
equalization. Higher max gain allows to equalize deeper | |
dips in frequency response but will limit output volume | |
if no analog gain is available because positive gain | |
requires negative digital preamp equal to maximum | |
positive gain. Defaults to 6.0. --trebleflower | |
TREBLEFLOWER Lower bound for transition region between | |
normal and treble frequencies. Treble frequencies can | |
have different max gain and gain K. Defaults to 6000.0. -- | |
treblefupper TREBLEFUPPER Upper bound for transition | |
region between normal and treble frequencies. Treble | |
frequencies can have different max gain and gain K. | |
Defaults to 8000.0. --treblegaink TREBLEGAINK Coefficient | |
for treble gain, affects both positive and negative gain. | |
Useful for disabling or reducing equalization power in | |
treble region. Defaults to 1.0. --showplot Plot will be | |
shown if this parameter exists, no value needed. -- | |
threadcount THREADCOUNT Amount of threads to use for | |
processing results. If set to "max" all the threads | |
available will be used. Using more threads result in | |
higher memory usage. Defaults to 1.``` | |
Examples | |
Reproducing Results | |
Reproducing pre-computed results for oratory1990 measured | |
on-ear headphones:bashpython autoeq.py -- | |
input_dir="measurements/oratory1990/data/onear" -- | |
output_dir="my_results/oratory1990/harman_over-ear_2018" - | |
-compensation="compensation/harman_over- | |
ear_2018_wo_bass.csv" --equalize --parametric_eq -- | |
max_filters=5+5 --ten_band_eq --bass_boost=4.0 -- | |
convolution_eq --fs=44100,48000 | |
Reproducing pre-computed results for Rtings measured | |
IEMs:bashpython autoeq.py -- | |
input_dir="measurements/rtings/data/inear" -- | |
output_dir="my_results/rtings/avg" -- | |
compensation="measure | |
ments/rtings/resources/rtings_compensation_avg.csv" -- | |
equalize --parametric_eq --max_filters=5+5 --ten_band_eq - | |
-bass_boost=6.0 --convolution_eq --fs=44100,48000 | |
All parameters used for pre-computed results can be found | |
in the results/update.py script. | |
Equalizing Individual Headphones | |
Equalizing Sennheiser HD 650 and saving results to | |
my_results/HD650:bashpython autoeq.py -- | |
input_dir="measure | |
ments/innerfidelity/data/onear/Sennheiser HD 650" -- | |
output_dir="my_results/HD650" -- | |
compensation="measurements | |
/innerfidelity/resources/innerfidelity_harman_over- | |
ear_2018_wo_bass.csv" --equalize --bass_boost=4 -- | |
show_plot --convolution_eq --fs=44100,48000 | |
Fixed Band Equalizers | |
Filter parameters for fixed band equalizers can be | |
adjusted with --q and --fc parameters. Producing fixed | |
bandequalizer settings for Sony WH-1000XM3 app:bashpython | |
autoeq.py -- | |
input_dir="measurements/oratory1990/data/onear/Sony WH- | |
1000XM3" --output_dir="my_results/Sony WH-1000XM3 (app)" - | |
-compensation="compensation/harman_over- | |
ear_2018_wo_bass.csv" --equalize --bass_boost=4.0 -- | |
fixed_band_eq --fc=400,1000,2500,6300,16000 --q=1.05 | |
Using Sound Signatures | |
AutoEQ provides a way to play around with different sound | |
signatures easily. The use-cases include making | |
headphonesdeviate from the neutral target or making one | |
headphone sound like another. | |
Equalizing Sennheiser HD 800 to sound like Sennheiser HD | |
650 using pre-computed results. Both have been measured | |
byoratory1990 so we'll use those measurements. Pre- | |
computed results include 4dB of bass boost for over-ear | |
headphones andtherefore we need to apply a bass boost of | |
4dB here as well.bashpython autoeq.py -- | |
input_dir="measurements/oratory1990/data/onear/Sennheiser | |
HD 800" --output_dir="my_results/Sennheiser HD 800 (HD | |
650)" --compensation="compensation/harman_over- | |
ear_2018_wo_bass.csv" -- | |
sound_signature="results/oratory1990/harman_over- | |
ear_2018/Sennheiser HD 650/Sennheiser HD 650.csv" -- | |
equalize --parametric_eq --max_filters=5+5 --ten_band_eq - | |
-bass_boost=4 --convolution_eq --fs=44100,48000 | |
Equalizing Massdrop x Sennheiser HD 800 to sound like AKG | |
K701. There is no K701 measurement made by oratory1990 | |
sowe'll use Innerfidelity's measurement for the sound | |
signature. The list of recommended results always points | |
to bestmeasurement so you can check there which one to | |
use (measurement system can be found in the | |
URL).bashpython autoeq.py -- | |
input_dir="measurements/oratory1990/data/onear/Sennheiser | |
HD 800" --output_dir="my_results/Sennheiser HD 800 | |
(K701)" --compensation="compensation/harman_over- | |
ear_2018_wo_bass.csv" -- | |
sound_signature="results/innerfide | |
lity/innerfidelity_harman_over-ear_2018/AKG K701/AKG | |
K701.csv" --equalize --parametric_eq --max_filters=5+5 -- | |
ten_band_eq --bass_boost=4 --convolution_eq -- | |
fs=44100,48000 | |
Equalizing HiFiMAN HE400S to sound like Massdrop x Meze | |
99 Noir. HE400S is measured only by Innerfidelity so | |
we'll pointcompensation file pointing to Innerfidelity's | |
calibrated Harman target. Meze 99 Noir has massive | |
natural bass boost andto capture that we need to relax | |
max gain to +12dB.bashpython autoeq.py -- | |
input_dir="measurements/innerfidelity/data/onear/HiFiMAN | |
HE400S" --output_dir="my_results/HE400S (99 Noir)" -- | |
compe | |
nsation="measurements/innerfidelity/resources/innerfi | |
delity_harman_over-ear_2018_wo_bass.csv" -- | |
sound_signature="results/oratory1990/harman_over- | |
ear_2018/Meze 99 Noir/Meze 99 Noir.csv" --equalize -- | |
parametric_eq --max_filters=5+5 --ten_band_eq -- | |
bass_boost=4 --max_gain=8 | |
Applying V-shaped sound signature to Audeze Mobius. First | |
step is to create the sound signature file. Save this | |
tomy_data/v.csv:csvfrequency,raw20,4.01000,- | |
4.010000,4.020000,0.0Then use it by providing the path to | |
--sound_signature parameter. We'll set bass boost to 0dB | |
because the soundsignature already has a significant bass | |
boost. Of course it's possible to add bass boost on top | |
of the sound signaturefile if you want even more | |
bass.bashpython autoeq.py -- | |
input_dir="measurements/rtings/data/onear/Audeze Mobius" - | |
-output_dir="my_results/Audeze Mobius (V-signature)" -- | |
com | |
pensation="measurements/rtings/resources/rtings_compens | |
ation_avg.csv" --sound_signature="my_data/v.csv" -- | |
equalize --parametric_eq --max_filters=5+5 --ten_band_eq - | |
-bass_boost=4.0 | |
Results | |
The main principle used by AutoEQ for producing the | |
equalization function is to invert the error curve. Error | |
is thedifference between raw microphone data and the | |
compensation (target) curve. If headphone's frequency | |
response is 4 dBbelow the target at 20 Hz equalization | |
function will have +4 dB boost at 20 Hz. In reality | |
simply inverting the error isnot sufficient since | |
measurements and equalization have several problems that | |
need to be addressed, seeTechnical Challenges[59] for | |
more details. | |
Results provided in this project currently have all the | |
headphone measurements from- Crinacle[60]- Headphone.com | |
[61]- Innerfidelity[62]- oratory1990[63]- Reference Audio | |
Analyzer[64]- Rtings[65]with the exception of Reference | |
Audio Analyzer measurements done on the SF1 system. | |
Results are organized by source/target/headphone so a | |
Sennheiser HD 650 measured by Innerfidelity and tuned to | |
acalibrated Harman target would be found | |
ininnerfidelity/innerfidelityharmanover- | |
ear_2018/Sennheiser HD 650[66].Multiple measurements of | |
the same headphone by the same measurement entity are | |
averaged. All different measurements foraveraging have | |
been renamed with snXXX (serial number) or sample X in | |
the end of the name to distinguish from theaveraged data | |
which has no suffixes in the name. | |
oratory1990 measurements have been done on Gras 43AG and | |
43AC couplers, the same which were used to develop | |
Harmantarget responses by Olive et al. and therefore use | |
Harman target responses for the equalization targets. | |
These resultsare recommended over all other measurements | |
because of this reason. Harman target data is in the | |
compensation folder. | |
Crinacle's in-ear measurements have been performed with | |
IEC 60318-4 coupler and are therefore compatible | |
withHarman in-ear targets. This fact also earns | |
Crinacle's measurements second highest ranking | |
recommendation afteroratory1990. Crinacle's over-ear | |
measurements use the same ear simulator attached to a | |
MiniDSP ears pinna. Themeasurements done on this system | |
are not as accurate as oratory1990's but because of the | |
high quality ear simulator,these are a bit better than | |
rest. | |
Innerfidelity, Rtings and Headphone.com measurements have | |
been performed on Head Acoustics HMSII.3 measurement | |
system.This system is not an industry standard anymore | |
because of the rigid pinnae. The Headphone.com | |
measurements are the oldones which are no longer | |
available. These are not to be consfused with the new | |
measurements Resolve is producing usingGRAS system. | |
Reference Audio Analyzer have three different measurement | |
systems[67]none of which seem to represent human hearing | |
particularly well. The most recent HDM-X system is close | |
to the HeadAcoustics HMSII.3 systems but seems to suffer | |
a bit more in the bass range. HDM1 is clearly worse than | |
other systemsand the measurements done on the SF1 system | |
are not included at all because that is a flat plate | |
coupler. IEM measurementsare done with what looks like a | |
tubing coupler and these don't look very accurate. | |
Reference Audio Analyzermeasurements and results are a | |
last resort. | |
All of the results use frequency response targets that | |
were specifically developed for this project except | |
oratory1990and Crinacle's IEM measurements which use | |
standard Harman targets. The target curves were developed | |
by calibratingmeasurements against reference measurements | |
by oratory1990 and Crinacle (IEMs) and modifying the | |
Harman 2018 over-earand 2019 in-ear targets with the | |
calibration data. | |
None of these targets have bass boost seen in Harman | |
target responses and therefore a +4dB boost was applied | |
for allover-ear headphones, +6dB for in-ear headphones | |
and no boost for earbuds. Harman targets actually ask for | |
about +6dB forover-ears and +9dB for in-ears but since | |
some headphones cannot achieve this with positive gain | |
limited to +6dB, asmaller boost was selected. Above 6 to | |
12 kHz data is filtered more heavily to avoid equalizing | |
the narrow dips andnotches that depend heavily on the | |
listener's own ears. | |
oratory1990 IEM Target | |
In-ear results with oratory1990 target (formerly "Usound" | |
target) are not longer given because the new 2019 | |
Harmanin-ear fixes the +10 kHz problems of the 2017 | |
target. Also it is easy to transform results created for | |
Harman 2019 tooratory1990 target without running the | |
processing yourself if you are using parametric equalizer | |
and have two filters(bands) available by adding these two | |
to your eq software: | |
| Type | Fc | Q | Gain || :------ | :--- | :--- | :--- || | |
Peaking | 113 | 0.75 | 3.5 || Peaking | 3766 | 0.63 | - | |
2.3 | | |
The results will be remarkably similar to results | |
produced with the actual oratory1990 target: | |
oratory1990 vs Harman in-ear 2019[68] | |
Of course it's still possible to produce native results | |
with oratory1990 target by pointing compensation to | |
theoratory1990 target file: -- | |
compensation="compensation/oratory1990.csv or-- | |
compensation="compensation/oratory1990_wo_bass.csv | |
Innerfidelity Target by Super Best Audio Friends Forum User | |
"Serious" | |
Innerfidelity and Headphone.com measured headphones | |
previously usedSBAF-Serious target[69] only.The SBAF- | |
Serious curve is no longer used for these measurements | |
since a new targets were developed by calibrating | |
Harmantargets. This is a modified version of | |
Innerfidelity target curve produced by a user called | |
Serious on Super Best AudioFriends forum. This curve | |
doesn't have any glaring problems and is quite well | |
balanced overall. Curve was turned into acompensation for | |
raw microphone data and tilted 0.2 dB / octave brighter. | |
Innerfidelity measurements are recommendedover | |
Headphone.com measurements because SBAF-Serious target | |
was developed for Innerfidelity. SBAF-Serious curve | |
wasmodified to be suitable for Headphone.com | |
measurements. CSV data files for Innerfidelity | |
andHeadphone.com are at | |
innerfidelity/resources/innerfidelity_compensation_sbaf- | |
serious.csv | |
andheadphonecom/resources/headphonecom_compensation_sbaf- | |
serious.csv, respectively. | |
Rtings Targets | |
Rtings measured headphones have a frequency response | |
target made for this project. This treble average target | |
is using anaverage of frequency responses of all Rtings | |
measured headphones in the treble range with small manual | |
reduction of the9kHz peak and the Rtings native response | |
below 2500 Hz without bass boost. Three different targets | |
were compared inlistening tests and the treble average | |
target was found to sound the best. Other two were the | |
Rtings native target curveand calibrated and uncalibrated | |
versions of SBAF Serious target curve. Rtings uses the | |
same measurement system asInnerfidelity uses so in theory | |
the uncalibrated SBAF Serious target should work | |
similarly with Rtings but listeningtests found the treble | |
average target to be slightly better. Rtings havea very | |
informative video[70] about how they are doing the | |
measurements andhow they came up with the target they use. | |
All of these Rtings targets retired when new calibrated | |
Harman targets were developed for Rtings measurements. | |
Technical Challenges | |
Simply inverting headphone frequency response deviation | |
from target response does not usually produce | |
sufficientresults. Some problems are caused by | |
imperfections in measurements, some are reliability | |
issues and some are practicalend-user problems. Rtings | |
has a good video on Youtube[71] about measurementsystem | |
challenges and solutions which is definitely worth | |
checking out. Innerfidelity also has a veryeducational | |
video on Youtube[72] about measurements and what | |
constitutes as aneutral sound. Main takeoffs are that | |
bass and treble measurements are very inconsistent, | |
neutral sound is not very welldefined yet and on-ear | |
headphones have big reliability problems in 8 to 9kHz | |
range due to resonances which move whenheadphone | |
placement is changed. Harman international has done some | |
solid research into preferred headphone frequencyresponse | |
but since that research was done on a different | |
measurement system the target does not apply directly | |
toInnerfidelity (Summer 2018) and Headphone.com | |
measurements. | |
There is very little that can be done for fighting bass | |
inconsistencies because the same problems will be there | |
whetherequalization is used or not. Headphones simply | |
have different bass responses on different listeners | |
(heads). Thereforebass is taken as is in AutoEQ and | |
equalized as if there was nothing wrong with it. Your | |
mileage may vary. Luckily basshas smaller impact on music | |
and having too much bass (especially sub-bass) doesn't | |
create problems of the same magnitudeas having too much | |
treble. | |
Moving resonances around 8 to 9kHz may cause big problems | |
if not taken into account. Spikes and dips in this range | |
areof great amplitude and very narrow. If one equalizes | |
these spikes and dips according to frequency response | |
measurementin worst case scenario a spike will move in a | |
place of dip when headphone is moved, and therefore the | |
spike is amplifiedsignificantly, leading to a very sharp | |
and piercing sound signature. To counter these problems | |
by default AutoEQ uses heavysmoothing and limited | |
positive gain above 6 to 8kHz. This way the equalization | |
will follow a broader trend of the regionand will not | |
care so much about narrow spikes and dips. Also positive | |
gain is limited to 0dB as an extra safety measureagainst | |
amplifying spikes due to moving the headphone. | |
Suppressing a narrow dip even further is not an optimal | |
thing to do but in practice haslittle negative effect on | |
the sound. Both of these measures will also alleviate | |
upper treble measurement inconsistenciesabove 11 to 12 | |
kHz. | |
A practical end-user problem is if too high positive gain | |
is allowed which asks for equal amount of negative | |
digitalpre-amp to prevent clipping. This negative preamp | |
will limit maximum volume produced by the system if there | |
is no analoggain available. If a dedicated headphone | |
amplifier is available or if the motherboard/soundcard | |
can drive the headphonesloud enough even when using high | |
negative preamp larger --max_gain values can be used. By | |
default --max_gain is setto +6dB so as not to cripple the | |
user's volume too much. Max gain will clip the | |
equalization curve which produces sharp kinksin it. Sharp | |
changes in equalization may produce unwanted equalization | |
artifacts. To counter this AutoEQ rounds thecorners | |
whenever max gain clips the curve. | |
Parametric Equalizer Optimization | |
AutoEQ has an optimizer to fit several peaking filters to | |
the desired equalization curve. Optimization is part | |
heuristicinitialization and part mathematical | |
optimization. | |
In the initialization phase peaks are detected from the | |
target curve and a peaking filter is created to match the | |
peak'sheight (gain) and location (frequency). This way, | |
the optimizer finds a suitable number of filters to | |
optimize. If the bassregion has no peaks and therefore is | |
missing filters entirely, a maximum of two filters will | |
be added at 20 Hz and 60 Hz. | |
A way to limit the number of filters used is provided | |
with max_filters parameter. If there are too many filters | |
afterinitialization, some filters are removed. First | |
filters with small gain (< 0.2 dB and < 0.33 dB) are | |
removed. If there are toomany filters after reduction of | |
small gain filters, nearby filters are attempted to | |
merge. Merged filter will be in themid point of the | |
merged filters. If merging filters did not reduce the | |
count enough, smallest filters are removed untilcount | |
matches maximum allowed number of filters. Image below | |
shows initialization for 1More MK801 headphone. Red | |
dotsare the peaks of filters before reduction and green | |
dots are the peaks after reduction. | |
filter-initialization[73] | |
Equalization target and initial peak filters for | |
optimization before and after filter number limitation | |
After suitable number of filters have been achieved and | |
filter center frequencies and gains have been set to | |
appropriatevalues a mathematical optimization is | |
performed to fit sum frequency response of all filters to | |
match as close aspossible the desired curve. Optimization | |
is based on gradient descent and will attempt to minimize | |
meansquared error between the sum frequency response of | |
the filters and the target. When improvements in the | |
error aregetting too small to make a practical difference | |
the optimization is stopped. Animation below shows | |
progress from theinitialization to a close finished curve. | |
optimization-animation[74] | |
Optimization of parametric eq filters (click to play) | |
Contact | |
Issues[75] are the way to go if you are experiencing | |
problems, haveideas or if there is something unclear | |
about how things are done or documented. | |
You can find me in Reddit[76] andHead-fi[77] if you just | |
want to say hello. | |
To restore the repository download the bundle | |
wget https://archive.org/download/github.com-jaakkopasanen-AutoEq_-_2022-… | |
and run: | |
git clone jaakkopasanen-AutoEq_-_2022-09-11_14-41-08.bundle | |
Source: https://github.com/jaakkopasanen/AutoEq[78] | |
Uploader: jaakkopasanen[79] | |
Upload date: 2022-09-11 | |
References | |
1. ./results (link) | |
2. #usage (link) | |
3. ./results (link) | |
4. #usage (link) | |
5. #results (link) | |
6. #equalizing (link) | |
7. https://github.com/jaakkopasanen/autoeq-pkg (link) | |
8. ./results/oratory1990/harman_over-ear_2018/Sennheiser%20HD%20800/Sennheiser… | |
9. #EqualizerAPO (link) | |
10. ./results/oratory1990/harman_over-ear_2018/Sennheiser%20HD%20800 (link) | |
11. #equalizerapo (link) | |
12. #peace (link) | |
13. https://www.microsoft.com/en-us/p/neutron-music-player/9nblggh4vp2h?active… | |
14. https://roonlabs.com/ (link) | |
15. https://www.foobar2000.org/ (link) | |
16. https://sourceforge.net/projects/equalizerapo/ (link) | |
17. ./results/oratory1990/harman_over-ear_2018/Sennheiser%20HD%20650 (link) | |
18. //web.archive.org/web/2im_/https://i.imgur.com/lHhRBuA.png (img) | |
19. https://sourceforge.net/projects/peace-equalizer-apo-extension/ (link) | |
20. //web.archive.org/web/2im_/https://i.imgur.com/e0POEbF.png (img) | |
21. #equalizing (link) | |
22. https://play.google.com/store/apps/details?id=com.pittvandewitt.wavelet (l… | |
23. //web.archive.org/web/2im_/https://i.imgur.com/UGiBwFX.png (img) | |
24. https://play.google.com/store/apps/details?id=com.neutroncode.mp (link) | |
25. https://play.google.com/store/apps/details?id=com.extreamsd.usbaudioplayer… | |
26. https://play.google.com/store/apps/details?id=mediam.music.equalizer (link) | |
27. #fixed-band-equalizers (link) | |
28. https://forum.xda-developers.com/showthread.php?t=2191223 (link) | |
29. https://forum.xda-developers.com/android/apps-games/app-reformed-dsp-manag… | |
30. https://github.com/wwmm/easyeffects (link) | |
31. //web.archive.org/web/2im_/https://user-images.githubusercontent.com/32952… | |
32. https://rogueamoeba.com/soundsource/ (link) | |
33. https://www.apple.com/apple-music/apple-digital-masters/ (link) | |
34. https://github.com/ExistentialAudio/BlackHole (link) | |
35. https://github.com/mattingalls/Soundflower (link) | |
36. https://www.menubus.audio/versions (link) | |
37. http://ju-x.com/hostingau.html (link) | |
38. https://github.com/ExistentialAudio/BlackHole (link) | |
39. https://github.com/mattingalls/Soundflower (link) | |
40. https://www.voxengo.com/product/primeeq/ (link) | |
41. https://www.fabfilter.com/products/pro-q-3-equalizer-plug-in (link) | |
42. http://audio.lernvall.com/ (link) | |
43. //web.archive.org/web/2im_/https://user-images.githubusercontent.com/38220… | |
44. https://www.superbestaudiofriends.org/index.php?threads/systemwide-eq-on-m… | |
45. https://discussions.apple.com/thread/8552731 (link) | |
46. https://eqmac.app (link) | |
47. https://github.com/bitgapp/eqmac (link) | |
48. //web.archive.org/web/2im_/https://raw.githubusercontent.com/bitgapp/eqMac… | |
49. #Hardware (link) | |
50. https://apps.apple.com/app/neutron-music-player/id766858884 (link) | |
51. https://github.com/rweichler/EQE (link) | |
52. https://www.qudelix.com/products/qudelix-5k-dac-amp (link) | |
53. https://www.radsone.com/earstudio (link) | |
54. https://www.python.org/getit/ (link) | |
55. http://www.mega-nerd.com/libsndfile/ (link) | |
56. https://pip.pypa.io/en/stable/installing/ (link) | |
57. https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visu… | |
58. https://docs.python.org/3.8/library/venv.html (link) | |
59. #technical-challenges (link) | |
60. https://crinacle.com/ (link) | |
61. http://graphs.headphone.com/ (link) | |
62. https://www.innerfidelity.com/headphone-measurements (link) | |
63. https://www.reddit.com/r/oratory1990 (link) | |
64. https://reference-audio-analyzer.pro/en/catalog-reports.php?sp_1=1&tp=1 (l… | |
65. https://www.rtings.com/headphones (link) | |
66. ./results/innerfidelity/innerfidelity_harman_over-ear_2018/Sennheiser%20HD… | |
67. https://reference-audio-analyzer.pro/en/stands.php (link) | |
68. //web.archive.org/web/2im_/https://i.imgur.com/kGYBOev.png (img) | |
69. https://www.superbestaudiofriends.org/index.php?threads/innerfidelity-fr-t… | |
70. https://www.youtube.com/watch?v=HNEI3qLZEKo (link) | |
71. https://www.youtube.com/watch?v=HNEI3qLZEKo (link) | |
72. https://www.youtube.com/watch?v=SDRHFNfFCFU (link) | |
73. //web.archive.org/web/2im_/https://i.imgur.com/UlMb2jK.png (img) | |
74. //web.archive.org/web/2im_/https://i.imgur.com/pM7JYAb.gif (img) | |
75. https://github.com/jaakkopasanen/AutoEq/issues (link) | |
76. https://www.reddit.com/user/jaakkopasanen (link) | |
77. https://www.head-fi.org/members/jaakkopasanen.491235/ (link) | |
78. https://github.com/jaakkopasanen/AutoEq (link) | |
79. https://github.com/jaakkopasanen (link) | |
Date Published: 2022-09-12 01:07:32 | |
Identifier: github.com-jaakkopasanen-AutoEq_-_2022-09-11_14-41-08 | |
Item Size: 2147483647 | |
Media Type: software | |
# Topics | |
GitHub;code;software;git | |
# Collections | |
github_narabot_mirror | |
# Uploaded by | |
@narabot | |
# Similar Items | |
View similar items | |
PHAROS | |