Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
136 commits
Select commit Hold shift + click to select a range
60be0ca
Added pink noise EQ functions
MRSallee Mar 31, 2026
b7b0f92
Shift play function
MRSallee Mar 31, 2026
ca0bd82
Auto tone sweetp
MRSallee Mar 31, 2026
820889c
Sound tools -> Combined component
MRSallee Mar 31, 2026
3b3c0dc
Added music player (basic)
MRSallee Mar 31, 2026
a9afefb
Apply EQ toggle added
MRSallee Apr 1, 2026
089c7b7
Grab handles on music timeline
MRSallee Apr 1, 2026
64489bc
Visualizer for audio
MRSallee Apr 1, 2026
2a50942
Play button color
MRSallee Apr 1, 2026
60dadfc
Store / restore music choice
MRSallee Apr 1, 2026
4f30347
Click and draggable EQ graph
MRSallee Apr 1, 2026
1402be8
EQ filter selection
MRSallee Apr 2, 2026
0328203
Fixed music autoplaying
MRSallee Apr 2, 2026
83ba21a
Improved mouse behavior
MRSallee Apr 2, 2026
56ae03b
Scroll EQ into view
MRSallee Apr 2, 2026
5e8cc9f
Keyboard to delete EQ nodes
MRSallee Apr 2, 2026
eff0e27
EQ node tweaks
MRSallee Apr 2, 2026
e35c947
Moved music player down
MRSallee Apr 2, 2026
e3979b4
Reverted style.css
MRSallee Apr 2, 2026
003a214
Reset EQ clickable
MRSallee Apr 2, 2026
9c23e04
Label position fix
MRSallee Apr 2, 2026
0f433b4
Tone gen follows EQ node drag
MRSallee Apr 2, 2026
7836b61
Fixed keyboard appearing when dragging EQ on mobile
MRSallee Apr 3, 2026
b40f4bd
Scroll over inputs + Deselect
MRSallee Apr 3, 2026
65558dd
Fixed variants in table bug
MRSallee Apr 5, 2026
e536d36
Music live playback: EQ preamp on bypass, pink-weighted level match
MRSallee Apr 5, 2026
79bdf61
Play button borders
MRSallee Apr 5, 2026
314040b
Fixed bug with num samples
MRSallee Apr 5, 2026
38cf1c6
Commented out headphone db
MRSallee Apr 5, 2026
7db2359
Resolved issue showing variants (again)
MRSallee Apr 6, 2026
46c7d5f
Immediately loading spinners
MRSallee Apr 6, 2026
221863b
Normalize EQ curves
MRSallee Apr 11, 2026
3d9dd3b
Normalize EQ'd audio with existing normalization logic
MRSallee Apr 11, 2026
dca1e7b
Reduced sticky lag when dragging EQ node
MRSallee Apr 11, 2026
669298c
EQ node sticks to curve
MRSallee Apr 11, 2026
5676ea1
Grabby hands
MRSallee Apr 11, 2026
49217e2
Default Q increases with frequency
MRSallee Apr 12, 2026
bd6ce1f
Apply EQ on/off shortcut
MRSallee Apr 12, 2026
9ea3741
Visualize playing frequency response
MRSallee Apr 12, 2026
b5f0e37
Removed variable Q values
MRSallee Apr 12, 2026
80151ed
Resolved sticky EQ nodes on drag
MRSallee Apr 12, 2026
7f17eac
Arrow key behavior refinement
MRSallee Apr 15, 2026
c433c92
EQ constraints
MRSallee Apr 19, 2026
19d85d4
EQ constraints collapse
MRSallee Apr 19, 2026
f6b1d4d
Remove scroll jacking for inputs
MRSallee Apr 19, 2026
865db25
Cleaned up Constraints
MRSallee Apr 19, 2026
d0a04f9
Compact import/export buttons
MRSallee Apr 19, 2026
f502d82
Constraints application changes
MRSallee Apr 19, 2026
adbec0a
Re-ordered EQ tab
MRSallee Apr 19, 2026
e3b73ac
Graphic EQ mode
MRSallee Apr 19, 2026
90ac1a6
Constraint presets
MRSallee Apr 19, 2026
258c05f
Restore last-used constraint preset
MRSallee Apr 19, 2026
749e1d0
Constraints custom presets
MRSallee Apr 19, 2026
361bc81
Pre-filled EQ model & target dropdowns
MRSallee Apr 19, 2026
2a079a0
EQ just 3x traces
MRSallee Apr 19, 2026
5ae76dd
Disable Auto EQ for graphic EQ
MRSallee Apr 19, 2026
8d6a07a
Style tweaks
MRSallee Apr 19, 2026
0dd4635
10-band Graphic EQ preset
MRSallee Apr 19, 2026
7622144
Change auto EQ constraint
MRSallee Apr 19, 2026
89eb503
Renamed EQ constraints file
MRSallee Apr 19, 2026
e885afe
Goofy EQ target selection fix
MRSallee Apr 20, 2026
d696bcd
EQ graph manip via mouse only
MRSallee Apr 20, 2026
aa27f54
Fix (maybe) music file selection on iOS
MRSallee Apr 20, 2026
4ec6f27
Ignore comp targets for EQ
MRSallee Apr 20, 2026
48021d5
Reduced line height on EQ filters
MRSallee Apr 20, 2026
3d17ea0
Fixed comp target exclusion
MRSallee Apr 20, 2026
b0177ed
Icon improvements
MRSallee Apr 20, 2026
4a6ddf4
Click and drag range selection
MRSallee Apr 20, 2026
79cf250
Tab index for EQ inputs
MRSallee Apr 20, 2026
1531e8f
Loops sweep
MRSallee Apr 21, 2026
00114a9
Removed pops on sweep
MRSallee Apr 21, 2026
e753a85
Adjust filters during tone gen sweep w/o disruption
MRSallee Apr 21, 2026
7b52e7e
X button on lsitening range.
MRSallee Apr 21, 2026
cf25a07
Double tap space anywhere to sweep
MRSallee Apr 21, 2026
cd6e3e5
Smaller icons
MRSallee Apr 21, 2026
28400ea
Target styles + load order
MRSallee Apr 21, 2026
9c91dfe
Sine sweep floor = 2 sec
MRSallee Apr 21, 2026
8a1f040
Hide comp target
MRSallee Apr 21, 2026
0af0b45
Target style tweak
MRSallee Apr 21, 2026
a819af8
Clean up EQ if phone removed
MRSallee Apr 21, 2026
76bf420
Safari drag fixes (big)
MRSallee Apr 21, 2026
e8df897
Safari audio engine fix
MRSallee Apr 21, 2026
aa50401
2-channel EQ
MRSallee Apr 21, 2026
f4116bb
Fixed: XM6 constraints not cascading
MRSallee Apr 22, 2026
629501e
Re-ordered constraints
MRSallee Apr 22, 2026
c8a9c79
constraints json update
MRSallee Apr 22, 2026
68e0047
Fixed re-importing same file
MRSallee Apr 22, 2026
96ec8db
Fixed L+R traces for 2-channel headphone EQ
MRSallee Apr 22, 2026
6d3fce3
Reset clears both L and R traces
MRSallee Apr 22, 2026
2888fa4
Change history draft
MRSallee Apr 23, 2026
2960189
Resolved bugs w/ history
MRSallee Apr 23, 2026
98f2916
A-B compare + pinning
MRSallee Apr 23, 2026
2df5de1
Tone gen add filter 0.1dB
MRSallee Apr 23, 2026
8cd901a
New auto icon
MRSallee Apr 23, 2026
82829d8
Start w/ 5 filters and auto create new ones
MRSallee Apr 23, 2026
7c480dd
Pick all models from EQ screen
MRSallee Apr 24, 2026
b2f0c25
Fixed level matching on A-B
MRSallee Apr 24, 2026
116f024
EQ selected models data model implemented
MRSallee May 2, 2026
0b231fd
Cleaned up target model selection / data model
MRSallee May 2, 2026
97a93a9
Pin active models to top of targets dropdown
MRSallee May 2, 2026
9dc6737
Fixed: Exported EQ profile values are rounded
MRSallee May 3, 2026
613f32a
Longer tone sweeps
MRSallee May 3, 2026
d77f93f
Alternating sweep loop
MRSallee May 3, 2026
250f26b
Fixed: Uploading same file twice fails
MRSallee May 3, 2026
ba91c11
User volume setting
MRSallee May 3, 2026
1130ac1
Scroll Q while dragging
MRSallee May 3, 2026
79eb9a2
Shift + drag multiple ranges for sound tools
MRSallee May 3, 2026
e83347a
Settings icon style
MRSallee May 3, 2026
76010b6
EQ pre-selected target stability
MRSallee May 3, 2026
8feb602
Restore manageTable items
MRSallee May 3, 2026
f19edc3
Pin active phones to EQ dropdown
MRSallee May 3, 2026
0ab5b3d
Display uploaded FR and targets reliably
MRSallee May 3, 2026
4043967
Cal file support
MRSallee May 3, 2026
c358137
Fixed removing EQ bands + Auto EQ band # limit
MRSallee May 3, 2026
a18fae1
Shareable EQ URLs
MRSallee May 6, 2026
ed63d77
Apple music integration
MRSallee May 7, 2026
9c87781
Apple Music sharing
MRSallee May 7, 2026
9f1ca18
Share AM song times
MRSallee May 7, 2026
184e36f
Fixed variants dropdown not apeparing
MRSallee May 7, 2026
0744770
EQ target fixes
MRSallee May 7, 2026
b077ebf
Reduce OG trace opacity
MRSallee May 7, 2026
c97c215
Shareable uploads bruhhh
MRSallee May 7, 2026
02023a8
Update URL when trace uploaded
MRSallee May 7, 2026
1e85795
Skip init phones when loading EQ vals
MRSallee May 7, 2026
2e76ffb
Fix: Constraints were acting as a low-pass filter
MRSallee May 7, 2026
3adc57b
Fixed player order
MRSallee May 7, 2026
c5f0af1
Fixed space bar jank on buttons
MRSallee May 7, 2026
f2d9f8a
Reset EQ when EQ trace is removed
MRSallee May 7, 2026
b1e6741
Fixed: EQ reset with constraints presets
MRSallee May 7, 2026
ef1db72
Share URL bugs
MRSallee May 9, 2026
8e62b59
Fixed: share added on init for mutli-sample
MRSallee May 9, 2026
bc96abb
Fixed hiding music
MRSallee May 9, 2026
53114cd
Apple Music history
MRSallee May 9, 2026
5811cd6
Apple Search style updates
MRSallee May 9, 2026
766acc5
Apple search style
MRSallee May 9, 2026
352650f
Refactored code
jeromeof May 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
data_mrs/*
.DS_Store
/devicePEQ/
dev.sh
17 changes: 10 additions & 7 deletions Documentation.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@ Most parts of the interface are arranged using flexboxes, and rearranged
with CSS media queries to detect screen width and aspect ratio.

There are three main layouts:
* The desktop layout places the graph window at the top with the selector and manager side by side below it.
* The mobile layout (for narrow screens) stacks everything vertically with the selector above the manager.
* When the screen is very wide relative to its height, the selector and manager are stacked as in the mobile layout but placed right of the graph window.

- The desktop layout places the graph window at the top with the selector and manager side by side below it.
- The mobile layout (for narrow screens) stacks everything vertically with the selector above the manager.
- When the screen is very wide relative to its height, the selector and manager are stacked as in the mobile layout but placed right of the graph window.

If the screen is narrow enough, the toolbar below the graph window will
collapse to avoid clutter. The entire toolbar can be shown by clicking
Expand Down Expand Up @@ -120,6 +121,7 @@ natural spline tends to emphasize little bumps in the data, making it
worse even than linear interpolation.

Mathematically, a smoothing spline minimizes a weighted sum of:

1. All the square differences between the original and smoothed values, and
2. The integral of the square of the second derivative of the smoothed function.

Expand Down Expand Up @@ -324,9 +326,10 @@ cross-section along the ring, like a thick washer. Three modifications
are made to this ring in order to account for human perception, or maybe
imperfect perceptual uniformity of HCL space, or even unsuitability for
lines rather than color fields.
* Hues are shifted so cool colors like blues and greens appear less often, and reds and yellows more often.
* Hues are shifted towards six colors with evenly spaced hues—the primary and secondary colors red, yellow, green, cyan, blue, and purple.
* Chroma and luminance are shifted so that yellows are brighter and bolder, and blues darker.

- Hues are shifted so cool colors like blues and greens appear less often, and reds and yellows more often.
- Hues are shifted towards six colors with evenly spaced hues—the primary and secondary colors red, yellow, green, cyan, blue, and purple.
- Chroma and luminance are shifted so that yellows are brighter and bolder, and blues darker.

Channels are separated from one another primarily by adjusting hue and
chroma. Channels with different luminance don't look related. The
Expand Down Expand Up @@ -355,4 +358,4 @@ it does not and they may overlap.

If there is only one label, or if a suitable position for a label can't
be found, it's placed at the top left corner. If there is a hidden
baseline curve, its label is placed at the bottom of the graph.
baseline curve, its label is placed at the bottom of the graph.
48 changes: 36 additions & 12 deletions config.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
// Configuration options
const init_phones = ["BKF"], // Optional. Which graphs to display on initial load. Note: Share URLs will override this set
DIR = "data/", // Directory where graph files are stored
DIR = "/data/", // Directory where graph files are stored
// DIR = "https://squig.link/headphones/data/", // Directory where graph files are stored
// num_samples = 3,
default_channels = ["L","R"], // Which channels to display. Avoid javascript errors if loading just one channel per phone
default_normalization = "dB", // Sets default graph normalization mode. Accepts "dB" or "Hz"
default_norm_db = 60, // Sets default dB normalization point
default_norm_hz = 500, // Sets default Hz normalization point (500Hz is recommended by IEC)
max_channel_imbalance = 5, // Channel imbalance threshold to show ! in the channel selector
alt_layout = true, // Toggle between classic and alt layouts
alt_sticky_graph = true, // If active graphs overflows the viewport, does the graph scroll with the page or stick to the viewport?
alt_animated = false, // Determines if new graphs are drawn with a 1-second animation, or appear instantly
alt_header = true, // Display a configurable header at the top of the alt layout
Expand All @@ -30,7 +31,7 @@ const init_phones = ["BKF"], // Optional. Which graphs to display on
targetDashed = false, // If true, makes target curves dashed lines
targetColorCustom = false, // If false, targets appear as a random gray value. Can replace with a fixed color value to make all targets the specified color, e.g. "black"
targetRestoreLastUsed = false, // Restore user's last-used target settings on load
labelsPosition = "default", // Up to four labels will be grouped in a specified corner. Accepts "top-left," bottom-left," "bottom-right," and "default"
labelsPosition = "bottom-left", // Up to four labels will be grouped in a specified corner. Accepts "top-left," bottom-left," "bottom-right," and "default"
stickyLabels = true, // "Sticky" labels
analyticsEnabled = true, // Enables Google Analytics 4 measurement of site usage
exportableGraphs = true, // Enables export graph button
Expand All @@ -39,15 +40,41 @@ const init_phones = ["BKF"], // Optional. Which graphs to display on
extraEQEnabled = true, // Enable parametic eq function
extraEQBands = 10, // Default EQ bands available
extraEQBandsMax = 20, // Max EQ bands available
extraToneGeneratorEnabled = true; // Enable tone generator function
extraToneGeneratorEnabled = true, // Enable tone generator function
extraPinkNoiseEnabled = true, // Pink noise through parametric EQ (Equalizer tab)
extraMusicEnabled = true; // Local file music player through parametric EQ (Equalizer tab)

// Specify which targets to display
const targets = [
{ type:"Neutral", files:["Diffuse Field","Etymotic","Free Field","Innerfidelity ID"] },
{ type:"Neutral", files:["KEMAR DF","Diffuse Field","Etymotic","Free Field","Innerfidelity ID"] },
{ type:"Reviewer", files:["Antdroid","Bad Guy","Banbeucmas","Crinacle","Precogvision","Super Review"] },
{ type:"Preference", files:["Harman","Rtings","Sonarworks"] }
];

// Tilt / Preference Adjustments
const
default_y_scale = "40db", // Default Y scale; values: ["20db", "30db", "40db", "50db", "crin"]
default_DF_name = "KEMAR DF", // Default RAW DF name
dfBaseline = true, // If true, DF is used as baseline when custom df tilt is on
default_bass_shelf = 8, // Default Custom DF bass shelf value
default_tilt = -0.8, // Default Custom DF tilt value
default_ear = 0, // Default Custom DF ear gain value
default_treble = 0,
tiltableTargets = [], // Targets that are allowed to be tilted
compTargets = ["KEMAR DF"], // Targets that are allowed to be used for compensation
preference_bounds_name = "Bounds", // Preference bounds file prefix (null to disable)
preference_bounds_dir = "data/pref_bounds/",// Directory containing bounds files
preference_bounds_startup = false; // Show bounds curve on startup

const harmanFilters = [
{ name: "Harman C1 2024 IE", tilt: -0.9, bass_shelf: 1, ear: 0, treble: 0.5 },
{ name: "Harman C2 2024 IE", tilt: -0.3, bass_shelf: 0.5, ear: -0.2, treble: 1 },
{ name: "Harman C3 2024 IE", tilt: -2.1, bass_shelf: 0, ear: 0, treble: 10 },
{ name: "Harman C4 2024 IE", tilt: -2.1, bass_shelf: 0, ear: 0.5, treble: 3.7 },
{ name: "Harman 2013 OE", tilt: 0, bass_shelf: 4.8, ear: 0, treble: -4.4 },
{ name: "Harman 2015 OE", tilt: 0, bass_shelf: 6.6, ear: 0, treble: -1.4 },
{ name: "Harman 2018 OE", tilt: 0, bass_shelf: 6, ear: -1, treble: -4 },
];


// *************************************************************
Expand Down Expand Up @@ -88,7 +115,8 @@ function tsvParse(fr) {
.filter(t => !isNaN(t[0]) && !isNaN(t[1]));
}

// Apply stylesheet based layout options above
// Main app uses style-alt (+ theme) only. Legacy classic layout lives in style.css for old
// standalone pages (e.g. graph_hp.html) that link it directly — not loaded here.
function setLayout() {
function applyStylesheet(styleSheet) {
var docHead = document.querySelector("head"),
Expand All @@ -101,12 +129,8 @@ function setLayout() {
docHead.append(linkTag);
}

if ( !alt_layout ) {
applyStylesheet("style.css");
} else {
applyStylesheet("style-alt.css");
applyStylesheet("style-alt-theme.css");
}
applyStylesheet("style-alt.css");
applyStylesheet("style-alt-theme.css");
}
setLayout();

Expand Down
Loading