Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
midiviz
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PLN
midiviz
Commits
902d99cc
Commit
902d99cc
authored
Sep 28, 2026
by
PLN (Algolia)
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
devcon: the artwork's square grid in place of the CRT scanlines
parent
50994aed
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
13 additions
and
7 deletions
+13
-7
midiviz.py
midiviz.py
+13
-7
No files found.
midiviz.py
View file @
902d99cc
...
@@ -386,6 +386,10 @@ class Theme(NamedTuple):
...
@@ -386,6 +386,10 @@ class Theme(NamedTuple):
# much of it -- a warm hue darkened toward black is brown, the same hue
# much of it -- a warm hue darkened toward black is brown, the same hue
# thinned over navy stays itself (how the DevCon site layers its colour).
# thinned over navy stays itself (how the DevCon site layers its colour).
tint_over_page
:
bool
tint_over_page
:
bool
# The texture's pitch, in base px: 0 = the CRT (fine lines, a vertical
# every fourth), anything else = a square grid at that pitch -- the
# DevCon artwork's graph paper.
scan_grid
:
float
# The dark ink ramp, sampled at levels 1..4, IS the dark surface ramp -- which
# The dark ink ramp, sampled at levels 1..4, IS the dark surface ramp -- which
...
@@ -404,7 +408,7 @@ THEMES: dict[str, Theme] = {
...
@@ -404,7 +408,7 @@ THEMES: dict[str, Theme] = {
spec_peak
=
(
0xc8
,
0xa8
,
0xff
,
90
),
spec_peak
=
(
0xc8
,
0xa8
,
0xff
,
90
),
scan
=
((
0xa0
,
0x60
,
0xff
,
16
),
(
0xa0
,
0x60
,
0xff
,
9
)),
scan
=
((
0xa0
,
0x60
,
0xff
,
16
),
(
0xa0
,
0x60
,
0xff
,
9
)),
bar_frac
=
0.22
,
bold
=
False
,
ui_font
=
"mono"
,
bar_frac
=
0.22
,
bold
=
False
,
ui_font
=
"mono"
,
fam_hue
=
FAM_HUE
,
tint_over_page
=
False
,
fam_hue
=
FAM_HUE
,
tint_over_page
=
False
,
scan_grid
=
0.0
,
),
),
# Indoors on a pale desktop. Still a lens, still the violet arc, still a
# Indoors on a pale desktop. Still a lens, still the violet arc, still a
# decay gradient the eye can follow -- the ink simply runs the other way.
# decay gradient the eye can follow -- the ink simply runs the other way.
...
@@ -424,7 +428,7 @@ THEMES: dict[str, Theme] = {
...
@@ -424,7 +428,7 @@ THEMES: dict[str, Theme] = {
spec_peak
=
(
0x4a
,
0x2a
,
0x78
,
110
),
spec_peak
=
(
0x4a
,
0x2a
,
0x78
,
110
),
scan
=
((
0x50
,
0x3a
,
0x78
,
10
),
(
0x50
,
0x3a
,
0x78
,
6
)),
scan
=
((
0x50
,
0x3a
,
0x78
,
10
),
(
0x50
,
0x3a
,
0x78
,
6
)),
bar_frac
=
0.22
,
bold
=
False
,
ui_font
=
"mono"
,
bar_frac
=
0.22
,
bold
=
False
,
ui_font
=
"mono"
,
fam_hue
=
FAM_HUE
,
tint_over_page
=
False
,
fam_hue
=
FAM_HUE
,
tint_over_page
=
False
,
scan_grid
=
0.0
,
),
),
# Direct sunlight, and built for nothing else. Near-white page, heavy ink
# Direct sunlight, and built for nothing else. Near-white page, heavy ink
# at every decay level (a "dim" state outdoors is a blank state), thicker
# at every decay level (a "dim" state outdoors is a blank state), thicker
...
@@ -451,7 +455,8 @@ THEMES: dict[str, Theme] = {
...
@@ -451,7 +455,8 @@ THEMES: dict[str, Theme] = {
chrome_hue
=
216.0
,
# #457aff, the site's electric blue
chrome_hue
=
216.0
,
# #457aff, the site's electric blue
spec
=
SpecRamp
(
0.058
,
-
0.45
,
0.85
,
0.75
,
-
0.30
,
40
,
140
),
spec
=
SpecRamp
(
0.058
,
-
0.45
,
0.85
,
0.75
,
-
0.30
,
40
,
140
),
spec_peak
=
(
0x07
,
0xff
,
0xda
,
160
),
# the site's mint
spec_peak
=
(
0x07
,
0xff
,
0xda
,
160
),
# the site's mint
scan
=
((
0x00
,
0x3d
,
0xff
,
14
),
(
0x00
,
0x3d
,
0xff
,
8
)),
# Pale cyan #a2edf2 hairlines, the artwork's grid on its gradient.
scan
=
((
0xa2
,
0xed
,
0xf2
,
13
),
(
0xa2
,
0xed
,
0xf2
,
13
)),
# The site sets everything that is not body copy in Jersey 15, so
# The site sets everything that is not body copy in Jersey 15, so
# every digit here is too.
# every digit here is too.
bar_frac
=
0.34
,
bold
=
True
,
ui_font
=
"jersey"
,
bar_frac
=
0.34
,
bold
=
True
,
ui_font
=
"jersey"
,
...
@@ -461,7 +466,7 @@ THEMES: dict[str, Theme] = {
...
@@ -461,7 +466,7 @@ THEMES: dict[str, Theme] = {
# #df96ef, gate = mint #07ffda, gate2 = cyan #46dbee, family = orange
# #df96ef, gate = mint #07ffda, gate2 = cyan #46dbee, family = orange
# #ff7700, other = the chrome's blue, note = the artwork's rose.
# #ff7700, other = the chrome's blue, note = the artwork's rose.
fam_hue
=
(
223
,
16
,
290
,
171
,
191
,
28
,
216
,
350
),
fam_hue
=
(
223
,
16
,
290
,
171
,
191
,
28
,
216
,
350
),
tint_over_page
=
True
,
tint_over_page
=
True
,
scan_grid
=
14.0
,
),
),
# Direct sunlight, and built for nothing else. Near-white page, heavy ink
# Direct sunlight, and built for nothing else. Near-white page, heavy ink
# at every decay level (a "dim" state outdoors is a blank state), thicker
# at every decay level (a "dim" state outdoors is a blank state), thicker
...
@@ -488,7 +493,7 @@ THEMES: dict[str, Theme] = {
...
@@ -488,7 +493,7 @@ THEMES: dict[str, Theme] = {
spec_peak
=
(
0x18
,
0x0c
,
0x38
,
190
),
spec_peak
=
(
0x18
,
0x0c
,
0x38
,
190
),
scan
=
None
,
scan
=
None
,
bar_frac
=
0.34
,
bold
=
True
,
ui_font
=
"mono"
,
bar_frac
=
0.34
,
bold
=
True
,
ui_font
=
"mono"
,
fam_hue
=
FAM_HUE
,
tint_over_page
=
False
,
fam_hue
=
FAM_HUE
,
tint_over_page
=
False
,
scan_grid
=
0.0
,
),
),
}
}
# Cycle order for the `d` key and the menu: darkest to brightest page, so the
# Cycle order for the `d` key and the menu: darkest to brightest page, so the
...
@@ -1663,13 +1668,14 @@ def build_widget(port_label: str, reader: "Reader | None", scale: float = 1.0,
...
@@ -1663,13 +1668,14 @@ def build_widget(port_label: str, reader: "Reader | None", scale: float = 1.0,
pm
=
QtGui
.
QPixmap
(
w
,
h
)
pm
=
QtGui
.
QPixmap
(
w
,
h
)
pm
.
fill
(
QtGui
.
QColor
(
0
,
0
,
0
,
0
))
pm
.
fill
(
QtGui
.
QColor
(
0
,
0
,
0
,
0
))
p
=
QtGui
.
QPainter
(
pm
)
p
=
QtGui
.
QPainter
(
pm
)
step
=
max
(
2
,
round
(
3
*
self
.
dens
))
grid
=
self
.
theme
.
scan_grid
step
=
max
(
2
,
round
((
grid
or
3
)
*
self
.
dens
))
hz
,
vt
=
self
.
theme
.
scan
hz
,
vt
=
self
.
theme
.
scan
p
.
setPen
(
QtGui
.
QColor
(
*
hz
))
p
.
setPen
(
QtGui
.
QColor
(
*
hz
))
for
y
in
range
(
0
,
h
,
step
):
for
y
in
range
(
0
,
h
,
step
):
p
.
drawLine
(
0
,
y
,
w
,
y
)
p
.
drawLine
(
0
,
y
,
w
,
y
)
p
.
setPen
(
QtGui
.
QColor
(
*
vt
))
p
.
setPen
(
QtGui
.
QColor
(
*
vt
))
for
x
in
range
(
0
,
w
,
step
*
4
):
for
x
in
range
(
0
,
w
,
step
if
grid
else
step
*
4
):
p
.
drawLine
(
x
,
0
,
x
,
h
)
p
.
drawLine
(
x
,
0
,
x
,
h
)
p
.
end
()
p
.
end
()
self
.
_scan
=
pm
self
.
_scan
=
pm
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment