Skip to content

Commit 3a56365

Browse files
committed
v1.0
MIDI export wholetone (Janko) keyboard layout color coding for synth blocks various improvements and fixes
1 parent 257e75e commit 3a56365

23 files changed

+1164
-163
lines changed

README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# PulseQueue
22

33
Minimalistic web-application for creating electronic music with virtual analog synthesizers.
4-
Initially designed as sketching tool but can be used as basic DAW.
4+
Initially designed as sketching tool but can be used for making full-fledged tracks.
55

66
**https://valent-in.github.io/pulseq/**
77

@@ -13,6 +13,7 @@ Initially designed as sketching tool but can be used as basic DAW.
1313
- Multi-layered step sequencer
1414
- Exportable synth presets
1515
- WAV audio export
16+
- MIDI export
1617

1718
## Music examples (YouTube)
1819
- [Cosmix - part 1](https://www.youtube.com/watch?v=KkLsClq37w4)
@@ -45,7 +46,10 @@ Some effects are CPU-heavy (especially reverb and phaser). This should be accoun
4546
WAV export duration may be limited on mobile browsers to about 10 minutes.
4647

4748
---
48-
Using Web Audio API and [Tone.js](https://github.com/Tonejs/Tone.js)
49+
Using Web Audio API and [Tone.js](https://github.com/Tonejs/Tone.js)
50+
File export sources:
51+
[bufferToWave](https://github.com/rwgood18/javascript-audio-file-dynamics-compressor),
52+
[midi-writer](https://github.com/carter-thaxton/midi-file).
4953

5054
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License version 3.
5155
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY.

css/style.css

Lines changed: 124 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ a {
115115
}
116116

117117
#header-tabs .tab--active {
118-
background-color: #133;
119-
border: 1px solid #577;
118+
background-color: #143;
119+
border: 1px solid #576;
120120
color: #ccc;
121121
}
122122

@@ -135,7 +135,7 @@ a {
135135
}
136136

137137
#pattern-footer .tab--active {
138-
background-color: #114;
138+
background-color: #224;
139139
border: 1px solid #55a;
140140
color: #ccc;
141141
}
@@ -316,7 +316,7 @@ button.button--play.button--play-loop {
316316
border-radius: 3px;
317317
flex-grow: 1;
318318
width: 100%;
319-
min-width: 40vw;
319+
min-width: 41vw;
320320
max-width: 55vh;
321321
padding: 10px 15px;
322322
margin: 4px;
@@ -338,6 +338,13 @@ button.button--play.button--play-loop {
338338
color: #aaa;
339339
font-weight: bold;
340340
align-self: flex-end;
341+
margin: 5px;
342+
}
343+
344+
@media (min-width: 720px) and (max-width: 1279px) {
345+
#synth-main > div {
346+
max-width: 41vw;
347+
}
341348
}
342349

343350
@media (min-width: 1280px) {
@@ -360,6 +367,38 @@ button.button--play.button--play-loop {
360367
}
361368
}
362369

370+
#synth-main > div.border-osc {
371+
border-top: 3px solid #777;
372+
}
373+
374+
#synth-main > div.border-osc-third {
375+
border-top: 3px solid #444;
376+
}
377+
378+
#synth-main > div.border-envelope {
379+
border-top: 3px solid #088;
380+
}
381+
382+
#synth-main > div.border-filter {
383+
border-top: 3px solid #890;
384+
}
385+
386+
#synth-main > div.border-osc-mod {
387+
border-top: 2px dashed #777;
388+
}
389+
390+
#synth-main > div.border-filter-mod {
391+
border-top: 2px dashed #890;
392+
}
393+
394+
#synth-main > div.border-amp-mod {
395+
border-top: 2px dashed #444;
396+
}
397+
398+
#synth-main > div.border-mod-envelope {
399+
border-top: 3px solid #62b;
400+
}
401+
363402
#synth-main > div > div:last-child {
364403
background-color: #191919;
365404
height: 100%;
@@ -505,62 +544,71 @@ input[type=range].range--volume {
505544
justify-content: center;
506545
}
507546

547+
#piano-container-outer.piano--scrolllock {
548+
overflow-x: hidden;
549+
}
550+
508551
#piano-container {
509-
height: 60px;
510-
display: flex;
511-
flex-wrap: nowrap;
552+
-webkit-user-select: none;
553+
user-select: none;
554+
padding: 1px 0;
512555
/*fix content cut*/
513556
min-width: 0;
514557
}
515558

516-
#piano-container::before,
517-
#piano-container:after {
518-
content: "";
519-
min-width: 4px;
520-
}
521-
522559
#piano-container.piano--hidden {
523560
display: none;
524561
}
525562

526-
.piano-key-white {
527-
height: 100%;
528-
min-width: 25px;
529-
background-color: #ccc;
530-
border-left: 1px solid #111;
531-
box-sizing: border-box;
532-
z-index: 1;
563+
#piano-container > div {
564+
display: flex;
533565
}
534566

535-
.piano-key-white span {
536-
display: inline-block;
537-
padding-top: 32px;
538-
color: #b5b5b5;
539-
pointer-events: none;
540-
-webkit-user-select: none;
541-
user-select: none;
567+
#piano-container > div:first-child {
568+
padding-left: 17px;
569+
}
570+
571+
.piano-key {
572+
width: 35px;
573+
min-width: 35px;
574+
height: 35px;
575+
border: 1px solid #696969;
576+
border-radius: 3px;
577+
margin: 1px;
578+
position: relative;
542579
}
543580

544-
.piano-key-white:first-child {
545-
border-left: none;
546-
border-bottom-left-radius: 3px;
581+
.piano-key > .note-mark {
582+
font-weight: bold;
583+
position: absolute;
584+
right: 0;
585+
bottom: 0;
547586
}
548587

549-
.piano-key-white:last-child {
550-
border-bottom-right-radius: 3px;
588+
.c4-key-mark {
589+
color: #768;
590+
}
591+
592+
.piano-key > .letter-mark {
593+
padding-left: 2px;
594+
font-size: 14px;
595+
color: transparent;
596+
}
597+
598+
#piano-container.show-letters .letter-mark {
599+
color: #588;
600+
}
601+
602+
.piano-key-white {
603+
background-color: #ccc;
551604
}
552605

553606
.piano-key-black {
554-
box-sizing: border-box;
555-
margin-left: -10px;
556-
margin-right: -10px;
557-
min-width: 20px;
558-
height: 50%;
559607
background-color: #333;
560-
border-bottom: 6px solid #111;
561-
border-left: 2px solid #111;
562-
border-right: 2px solid #111;
563-
z-index: 2;
608+
}
609+
610+
.key--pressed {
611+
box-shadow: inset 0 0 0 3px #c18600;
564612
}
565613

566614
.synth-list-entry {
@@ -649,7 +697,8 @@ input[type=range].range--volume {
649697

650698
#synth-list-caption-area {
651699
float: right;
652-
padding: 4px;
700+
padding: 2px;
701+
margin: 2px;
653702
-webkit-user-select: none;
654703
user-select: none;
655704
}
@@ -678,6 +727,7 @@ input[type=range].range--volume {
678727

679728
.modal-box {
680729
border: 2px solid #333;
730+
border-radius: 3px;
681731
background-color: #191919;
682732
padding: 12px;
683733
box-sizing: border-box;
@@ -686,12 +736,6 @@ input[type=range].range--volume {
686736
overflow-y: auto;
687737
}
688738

689-
@media (min-width:500px) {
690-
.modal-box {
691-
border-radius: 3px;
692-
}
693-
}
694-
695739
.modal-alert-box {
696740
min-width: 240px;
697741
}
@@ -819,6 +863,10 @@ button.button--highlight-orange {
819863
box-shadow: inset 0 0 0 2px orange;
820864
}
821865

866+
button.button--highlight-yellow {
867+
box-shadow: inset 0 0 0 1px #890;
868+
}
869+
822870
#menu-synth-list-container {
823871
max-width: 55vh;
824872
width: 75vw;
@@ -890,7 +938,6 @@ button.button--highlight-orange {
890938
border-radius: 3px;
891939
margin: 8px auto 8px auto;
892940
padding: 8px 32px;
893-
overflow: hidden;
894941
-webkit-user-select: none;
895942
user-select: none;
896943
cursor: pointer;
@@ -934,6 +981,18 @@ input[type=file]:focus + span {
934981
background-color: rgba(100, 100, 0, 0.4);
935982
}
936983

984+
#synth-name-container {
985+
display: flex;
986+
align-items: baseline;
987+
white-space: nowrap;
988+
}
989+
990+
#input-synth-name {
991+
width: 10rem;
992+
flex-grow: 1;
993+
margin-left: 8px;
994+
}
995+
937996
#button-import-synth {
938997
position: relative;
939998
overflow: hidden;
@@ -942,7 +1001,7 @@ input[type=file]:focus + span {
9421001
vertical-align: middle;
9431002
}
9441003

945-
#selsct-synth-preset {
1004+
#select-synth-preset {
9461005
max-width: 5rem;
9471006
}
9481007

@@ -1202,4 +1261,19 @@ button.button--arrow-up {
12021261
#synth-list-caption-area {
12031262
padding: 4px 16px;
12041263
}
1264+
}
1265+
1266+
@media (hover: hover) {
1267+
#pattern-main.add-scrollbar-spacing {
1268+
border-right: 1px solid #222;
1269+
}
1270+
1271+
#pattern-main.add-scrollbar-spacing > table {
1272+
margin-right: 16px;
1273+
}
1274+
1275+
#arrange-main.add-scrollbar-spacing {
1276+
padding-bottom: 16px;
1277+
border-bottom: 1px solid #222;
1278+
}
12051279
}

css/table-pattern.css

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
border-top: none;
7171
border-right: 1px solid #444;
7272
border-left: 1px solid #444;
73-
color: #b5b5b5;
73+
font-weight: bold;
7474
}
7575

7676
#pattern-main table td:nth-child(2) {
@@ -95,6 +95,7 @@
9595
background-color: #111;
9696
border: 1px solid #696969;
9797
border-bottom-right-radius: 3px;
98+
font-weight: normal;
9899
}
99100

100101
#note-length-control:before {

0 commit comments

Comments
 (0)