fragment-tools 0.1.13 → 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/.prettierignore +1 -2
  2. package/.prettierrc +23 -7
  3. package/README.md +28 -9
  4. package/bin/index.js +70 -10
  5. package/package.json +14 -6
  6. package/src/cli/build.js +125 -0
  7. package/src/cli/create.js +238 -0
  8. package/src/cli/createConfig.js +82 -0
  9. package/src/cli/createFragmentFile.js +70 -0
  10. package/src/cli/getEntries.js +85 -0
  11. package/src/cli/log.js +36 -24
  12. package/src/cli/plugins/check-dependencies.js +88 -42
  13. package/src/cli/plugins/hot-shader-replacement.js +408 -0
  14. package/src/cli/plugins/hot-sketch-reload.js +21 -25
  15. package/src/cli/plugins/save.js +101 -0
  16. package/src/cli/preview.js +55 -0
  17. package/src/cli/prompts.js +260 -0
  18. package/src/cli/run.js +131 -0
  19. package/src/cli/templates/blank/index.js +33 -0
  20. package/src/cli/templates/blank/meta.json +4 -0
  21. package/src/cli/templates/default/index.js +39 -0
  22. package/src/cli/templates/default/meta.json +5 -0
  23. package/src/cli/templates/fragment-gl/index.js +37 -0
  24. package/src/cli/templates/fragment-gl/meta.json +4 -0
  25. package/src/cli/templates/p5/index.js +32 -0
  26. package/src/cli/templates/p5/meta.json +5 -0
  27. package/src/cli/templates/p5-webgl/fragment.fs +14 -0
  28. package/src/cli/templates/p5-webgl/index.js +67 -0
  29. package/src/cli/templates/p5-webgl/meta.json +5 -0
  30. package/src/cli/templates/three-fragment/fragment.fs +10 -0
  31. package/src/cli/templates/three-fragment/index.js +95 -0
  32. package/src/cli/templates/three-fragment/meta.json +5 -0
  33. package/src/cli/templates/three-orthographic/index.js +55 -0
  34. package/src/cli/templates/three-orthographic/meta.json +5 -0
  35. package/src/cli/templates/three-perspective/index.js +52 -0
  36. package/src/cli/templates/three-perspective/meta.json +5 -0
  37. package/src/cli/utils.js +70 -0
  38. package/src/cli/ws.js +87 -78
  39. package/src/client/app/App.svelte +3 -3
  40. package/src/client/app/client.js +55 -39
  41. package/src/client/app/components/IconCross.svelte +18 -18
  42. package/src/client/app/components/Init.svelte +40 -8
  43. package/src/client/app/components/KeyBinding.svelte +22 -22
  44. package/src/client/app/helpers.js +42 -0
  45. package/src/client/app/hooks.js +20 -0
  46. package/src/client/app/inputs/Input.js +9 -9
  47. package/src/client/app/inputs/Keyboard.js +13 -15
  48. package/src/client/app/inputs/MIDI.js +14 -15
  49. package/src/client/app/inputs/Mouse.js +1 -1
  50. package/src/client/app/inputs/Webcam.js +89 -88
  51. package/src/client/app/lib/canvas-recorder/CanvasRecorder.js +41 -21
  52. package/src/client/app/lib/canvas-recorder/FrameRecorder.js +7 -6
  53. package/src/client/app/lib/canvas-recorder/H264Recorder.js +45 -0
  54. package/src/client/app/lib/canvas-recorder/MP4Recorder.js +7 -9
  55. package/src/client/app/lib/canvas-recorder/WebMRecorder.js +3 -4
  56. package/src/client/app/lib/canvas-recorder/mp4.js +1649 -15
  57. package/src/client/app/lib/canvas-recorder/utils.js +33 -17
  58. package/src/client/app/lib/gl/Geometry.js +11 -8
  59. package/src/client/app/lib/gl/Program.js +38 -19
  60. package/src/client/app/lib/gl/Renderer.js +163 -156
  61. package/src/client/app/lib/gl/Texture.js +113 -85
  62. package/src/client/app/lib/gl/index.js +12 -12
  63. package/src/client/app/lib/gl/utils.js +1 -3
  64. package/src/client/app/lib/helpers/frameDebounce.js +30 -30
  65. package/src/client/app/lib/loader/index.js +10 -10
  66. package/src/client/app/lib/loader/loadImage.js +15 -15
  67. package/src/client/app/lib/loader/loadScript.js +1 -1
  68. package/src/client/app/lib/paper-sizes.js +75 -76
  69. package/src/client/app/lib/presets.js +25 -5
  70. package/src/client/app/lib/tempo/Analyser.js +18 -17
  71. package/src/client/app/lib/tempo/Range.js +15 -12
  72. package/src/client/app/lib/tempo/index.js +34 -27
  73. package/src/client/app/modules/AudioAnalyser/Range.svelte +69 -72
  74. package/src/client/app/modules/AudioAnalyser/Spectrum.svelte +20 -19
  75. package/src/client/app/modules/AudioAnalyser.svelte +52 -35
  76. package/src/client/app/modules/Console/ConsoleLine.svelte +193 -172
  77. package/src/client/app/modules/Console.svelte +76 -74
  78. package/src/client/app/modules/Exports.svelte +62 -43
  79. package/src/client/app/modules/MidiPanel.svelte +100 -101
  80. package/src/client/app/modules/Monitor.svelte +57 -57
  81. package/src/client/app/modules/Params.svelte +128 -103
  82. package/src/client/app/renderers/2DRenderer.js +3 -3
  83. package/src/client/app/renderers/FragmentRenderer.js +30 -23
  84. package/src/client/app/renderers/P5GLRenderer.js +144 -0
  85. package/src/client/app/renderers/P5Renderer.js +10 -7
  86. package/src/client/app/renderers/THREERenderer.js +136 -94
  87. package/src/client/app/stores/audioAnalysis.js +3 -4
  88. package/src/client/app/stores/console.js +9 -10
  89. package/src/client/app/stores/errors.js +1 -1
  90. package/src/client/app/stores/exports.js +36 -20
  91. package/src/client/app/stores/index.js +2 -2
  92. package/src/client/app/stores/layout.js +143 -138
  93. package/src/client/app/stores/multisampling.js +4 -4
  94. package/src/client/app/stores/props.js +76 -13
  95. package/src/client/app/stores/renderers.js +26 -15
  96. package/src/client/app/stores/rendering.js +108 -89
  97. package/src/client/app/stores/sketches.js +7 -9
  98. package/src/client/app/stores/time.js +18 -18
  99. package/src/client/app/stores/utils.js +95 -38
  100. package/src/client/app/transitions/fade.js +3 -3
  101. package/src/client/app/transitions/index.js +6 -7
  102. package/src/client/app/transitions/splitX.js +2 -2
  103. package/src/client/app/transitions/splitY.js +2 -2
  104. package/src/client/app/triggers/Keyboard.js +88 -79
  105. package/src/client/app/triggers/MIDI.js +110 -84
  106. package/src/client/app/triggers/Mouse.js +73 -65
  107. package/src/client/app/triggers/Trigger.js +59 -58
  108. package/src/client/app/triggers/index.js +7 -7
  109. package/src/client/app/triggers/shared.js +5 -5
  110. package/src/client/app/ui/Build.svelte +70 -71
  111. package/src/client/app/ui/ErrorOverlay.svelte +118 -104
  112. package/src/client/app/ui/Field.svelte +393 -258
  113. package/src/client/app/ui/FieldGroup.svelte +106 -94
  114. package/src/client/app/ui/FieldSection.svelte +127 -116
  115. package/src/client/app/ui/FieldSpace.svelte +29 -30
  116. package/src/client/app/ui/FieldTrigger.svelte +256 -244
  117. package/src/client/app/ui/FieldTriggers.svelte +46 -46
  118. package/src/client/app/ui/FloatingParams.svelte +29 -30
  119. package/src/client/app/ui/Layout.svelte +31 -32
  120. package/src/client/app/ui/LayoutColumn.svelte +4 -4
  121. package/src/client/app/ui/LayoutComponent.svelte +239 -225
  122. package/src/client/app/ui/LayoutResizer.svelte +195 -176
  123. package/src/client/app/ui/LayoutRoot.svelte +6 -6
  124. package/src/client/app/ui/LayoutRow.svelte +4 -4
  125. package/src/client/app/ui/LayoutToolbar.svelte +191 -194
  126. package/src/client/app/ui/Module.svelte +134 -135
  127. package/src/client/app/ui/ModuleHeaderAction.svelte +81 -78
  128. package/src/client/app/ui/ModuleHeaderButton.svelte +12 -12
  129. package/src/client/app/ui/ModuleHeaderSelect.svelte +47 -37
  130. package/src/client/app/ui/ModuleRenderer.svelte +26 -27
  131. package/src/client/app/ui/OutputRenderer.svelte +112 -105
  132. package/src/client/app/ui/ParamsMultisampling.svelte +96 -95
  133. package/src/client/app/ui/ParamsOutput.svelte +130 -113
  134. package/src/client/app/ui/Preview.svelte +7 -8
  135. package/src/client/app/ui/SelectChevrons.svelte +27 -15
  136. package/src/client/app/ui/SketchRenderer.svelte +780 -667
  137. package/src/client/app/ui/SketchSelect.svelte +50 -44
  138. package/src/client/app/ui/fields/ButtonInput.svelte +61 -48
  139. package/src/client/app/ui/fields/CheckboxInput.svelte +67 -61
  140. package/src/client/app/ui/fields/ColorInput.svelte +294 -238
  141. package/src/client/app/ui/fields/FieldInputRow.svelte +8 -8
  142. package/src/client/app/ui/fields/ImageInput.svelte +123 -121
  143. package/src/client/app/ui/fields/Input.svelte +100 -111
  144. package/src/client/app/ui/fields/IntervalInput.svelte +268 -0
  145. package/src/client/app/ui/fields/ListInput.svelte +96 -96
  146. package/src/client/app/ui/fields/NumberInput.svelte +120 -116
  147. package/src/client/app/ui/fields/ProgressInput.svelte +99 -73
  148. package/src/client/app/ui/fields/Select.svelte +137 -124
  149. package/src/client/app/ui/fields/TextInput.svelte +10 -11
  150. package/src/client/app/ui/fields/VectorInput.svelte +86 -82
  151. package/src/client/app/utils/canvas.utils.js +189 -208
  152. package/src/client/app/utils/color.utils.js +138 -101
  153. package/src/client/app/utils/fields.utils.js +131 -0
  154. package/src/client/app/utils/file.utils.js +209 -37
  155. package/src/client/app/utils/glsl.utils.js +2 -2
  156. package/src/client/app/utils/glslErrors.js +49 -31
  157. package/src/client/app/utils/index.js +32 -29
  158. package/src/client/app/utils/math.utils.js +14 -10
  159. package/src/client/index.html +16 -16
  160. package/src/client/main.js +4 -4
  161. package/src/client/public/css/global.css +26 -16
  162. package/src/cli/db.js +0 -17
  163. package/src/cli/index.js +0 -198
  164. package/src/cli/plugins/db.js +0 -12
  165. package/src/cli/plugins/hot-shader-reload.js +0 -86
  166. package/src/cli/plugins/screenshot.js +0 -46
  167. package/src/cli/server.js +0 -153
  168. package/src/cli/templates/2d.js +0 -15
  169. package/src/cli/templates/blank.js +0 -13
  170. package/src/cli/templates/fragment.js +0 -18
  171. package/src/cli/templates/index.js +0 -27
  172. package/src/cli/templates/p5.js +0 -13
  173. package/src/cli/templates/three-fragment.js +0 -53
  174. package/src/cli/templates/three-orthographic.js +0 -23
  175. package/src/cli/templates/three-perspective.js +0 -20
  176. package/src/client/app/lib/canvas-recorder/FFMPEGRecorder.js +0 -56
  177. package/src/client/app/utils/props.utils.js +0 -51
  178. package/src/client/public/fonts/Inter-Bold.woff2 +0 -0
  179. package/src/client/public/fonts/Inter-Italic.woff2 +0 -0
  180. package/src/client/public/fonts/Inter-Regular.woff2 +0 -0
  181. package/src/client/public/fonts/Inter-SemiBold.woff2 +0 -0
  182. package/src/client/public/js/ffmpeg.min.js +0 -2
  183. package/src/client/public/js/ffmpeg.min.js.map +0 -1
  184. /package/src/cli/templates/{fragment.fs → fragment-gl/fragment.fs} +0 -0
@@ -1,9 +1,8 @@
1
- import Range from "./Range.js";
1
+ import Range from './Range.js';
2
2
 
3
3
  const defaultRanges = [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125];
4
4
 
5
5
  class Analyser {
6
-
7
6
  /**
8
7
  * @param {Object} params
9
8
  * @param {AudioContext} [params.context]
@@ -20,10 +19,10 @@ class Analyser {
20
19
  this.context = context;
21
20
 
22
21
  this.ranges = [];
23
-
24
- this._analyser = this.context.createAnalyser()
22
+
23
+ this._analyser = this.context.createAnalyser();
25
24
  this._analyser.smoothingTimeConstant = smoothingTimeConstant;
26
- this._analyser.fftSize = fftSize;
25
+ this._analyser.fftSize = fftSize;
27
26
 
28
27
  this.master = this.context.createGain();
29
28
  this.master.connect(this._analyser);
@@ -31,15 +30,15 @@ class Analyser {
31
30
  const { frequencyBinCount } = this._analyser;
32
31
 
33
32
  this.frequencyBinCount = frequencyBinCount;
34
- this.freqByteData = new Uint8Array(frequencyBinCount);
35
- this.timeByteData = new Uint8Array(frequencyBinCount);
33
+ this.freqByteData = new Uint8Array(frequencyBinCount);
34
+ this.timeByteData = new Uint8Array(frequencyBinCount);
36
35
 
37
36
  this.setRanges(ranges);
38
37
  }
39
38
 
40
39
  /**
41
40
  * Set the weight of the ranges used for the analysis
42
- * @param {Number[]} [ranges]
41
+ * @param {Number[]} [ranges]
43
42
  */
44
43
  setRanges(ranges = defaultRanges) {
45
44
  if (this.ranges.length > 0) {
@@ -86,9 +85,9 @@ class Analyser {
86
85
  update(deltaTime) {
87
86
  this._analyser.getByteFrequencyData(this.freqByteData);
88
87
 
89
- for (let i = 0; i < this.ranges.length; i++) {
90
- this.ranges[i].update(deltaTime, this.freqByteData);
91
- }
88
+ for (let i = 0; i < this.ranges.length; i++) {
89
+ this.ranges[i].update(deltaTime, this.freqByteData);
90
+ }
92
91
  }
93
92
 
94
93
  /**
@@ -100,7 +99,7 @@ class Analyser {
100
99
 
101
100
  /**
102
101
  * Connect a MediaStream to the analyser
103
- * @param {MediaStream} stream
102
+ * @param {MediaStream} stream
104
103
  */
105
104
  connectMediaStream(stream) {
106
105
  if (this.source) {
@@ -108,25 +107,27 @@ class Analyser {
108
107
  }
109
108
 
110
109
  this.source = this.context.createMediaStreamSource(stream);
111
- this.source.connect(this.master);
110
+ this.source.connect(this.master);
112
111
  }
113
112
 
114
113
  /**
115
114
  * Connect a HTMLMediaElement to the analyser
116
- * @param {MediaElement} audio
115
+ * @param {MediaElement} audio
117
116
  */
118
117
  connectMediaElement(element) {
119
118
  if (this.source) {
120
119
  this.disconnect();
121
120
  }
122
121
 
123
- this.source = this.context.createMediaElementSource(element)
124
- this.source.connect(this.master);
122
+ this.source = this.context.createMediaElementSource(element);
123
+ this.source.connect(this.master);
125
124
  }
126
125
 
127
126
  getRange(index) {
128
127
  if (index >= this.rangeCount) {
129
- console.log(`Range ${index} is not available. RangeCount: ${this.rangeCount}`);
128
+ console.log(
129
+ `Range ${index} is not available. RangeCount: ${this.rangeCount}`,
130
+ );
130
131
  return;
131
132
  }
132
133
 
@@ -1,12 +1,11 @@
1
1
  class Range {
2
-
3
2
  constructor(start, end) {
4
3
  this.start = start;
5
4
  this.end = end;
6
5
 
7
6
  this.BEAT_HOLD_TIME = 300; // between 0 and 1000
8
7
  this.BEAT_DECAY_RATE = 0.992; // between 0 and 1
9
- this.BEAT_MIN = 0.1; // between 0 and 1
8
+ this.BEAT_MIN = 0.1; // between 0 and 1
10
9
 
11
10
  this._volume = 0;
12
11
  this.beatCutOff = 0;
@@ -50,23 +49,27 @@ class Range {
50
49
  const index = this.listeners.indexOf(listener);
51
50
 
52
51
  this.listeners.splice(index, 1);
53
- }
52
+ };
54
53
  }
55
54
 
56
55
  update(deltaTime, freqByteData) {
57
- this._volume = 0;
56
+ this._volume = 0;
58
57
 
59
- for (let i = this.start; i < this.end; i++) {
58
+ for (let i = this.start; i < this.end; i++) {
60
59
  this._volume += freqByteData[i];
61
- }
60
+ }
62
61
 
63
- this._volume /= (this.end - this.start) * 256;
62
+ this._volume /= (this.end - this.start) * 256;
64
63
 
65
- // detect beat
66
- if (this.beatTime >= this.BEAT_HOLD_TIME && this._volume > this.beatCutOff && this._volume > this.BEAT_MIN) {
64
+ // detect beat
65
+ if (
66
+ this.beatTime >= this.BEAT_HOLD_TIME &&
67
+ this._volume > this.beatCutOff &&
68
+ this._volume > this.BEAT_MIN
69
+ ) {
67
70
  for (let i = 0; i < this.listeners.length; i++) {
68
71
  this.listeners[i]();
69
- }
72
+ }
70
73
 
71
74
  this.beatCutOff = this._volume * 1.15;
72
75
  this.beatTime = 0;
@@ -78,7 +81,7 @@ class Range {
78
81
  this.beatCutOff = Math.max(this.beatCutOff, this.BEAT_MIN);
79
82
  }
80
83
  }
81
- }
84
+ }
82
85
 
83
86
  dispose() {
84
87
  this.start = null;
@@ -86,7 +89,7 @@ class Range {
86
89
 
87
90
  this.BEAT_HOLD_TIME = null;
88
91
  this.BEAT_DECAY_RATE = null;
89
- this.BEAT_MIN = null;
92
+ this.BEAT_MIN = null;
90
93
 
91
94
  this._volume = null;
92
95
  this.beatCutOff = null;
@@ -1,7 +1,6 @@
1
- import Analyser from "./Analyser.js";
1
+ import Analyser from './Analyser.js';
2
2
 
3
3
  class Tempo {
4
-
5
4
  constructor({
6
5
  context = new AudioContext(),
7
6
  ranges,
@@ -18,21 +17,24 @@ class Tempo {
18
17
 
19
18
  this.listeners = [];
20
19
 
21
- document.addEventListener("touchend", unlock, true);
22
- document.addEventListener("mousedown", unlock, true);
23
- document.addEventListener("click", unlock, true);
20
+ document.addEventListener('touchend', unlock, true);
21
+ document.addEventListener('mousedown', unlock, true);
22
+ document.addEventListener('click', unlock, true);
24
23
 
25
- document.addEventListener("touchend", unlock, true);
26
- document.addEventListener("mousedown", unlock, true);
27
- document.addEventListener("click", unlock, true);
24
+ document.addEventListener('touchend', unlock, true);
25
+ document.addEventListener('mousedown', unlock, true);
26
+ document.addEventListener('click', unlock, true);
28
27
 
29
28
  function unlock() {
30
- if (context.state === "suspended" || context.state === "interrupted") {
29
+ if (
30
+ context.state === 'suspended' ||
31
+ context.state === 'interrupted'
32
+ ) {
31
33
  context.resume();
32
34
 
33
- document.removeEventListener("touchend", unlock, true);
34
- document.removeEventListener("mousedown", unlock, true);
35
- document.removeEventListener("click", unlock, true);
35
+ document.removeEventListener('touchend', unlock, true);
36
+ document.removeEventListener('mousedown', unlock, true);
37
+ document.removeEventListener('click', unlock, true);
36
38
  }
37
39
 
38
40
  return;
@@ -60,7 +62,7 @@ class Tempo {
60
62
  }
61
63
 
62
64
  getRanges() {
63
- const rangesWithoutMaster = [...this.analyser.ranges]
65
+ const rangesWithoutMaster = [...this.analyser.ranges];
64
66
  rangesWithoutMaster.splice(this.analyser.ranges.length - 1, 1);
65
67
 
66
68
  return rangesWithoutMaster;
@@ -79,18 +81,24 @@ class Tempo {
79
81
  }
80
82
 
81
83
  listen() {
82
- navigator.getUserMedia({
83
- audio: true,
84
- video: false
85
- }, (stream) => {
86
- this.analyser.connectMediaStream(stream);
87
-
88
- if (this.autoUpdate) {
89
- this.start();
90
- }
91
- }, (error) => {
92
- console.error(`Tempo :: cannot access microphone. Make sure to allow usage of the microphone.`);
93
- });
84
+ navigator.getUserMedia(
85
+ {
86
+ audio: true,
87
+ video: false,
88
+ },
89
+ (stream) => {
90
+ this.analyser.connectMediaStream(stream);
91
+
92
+ if (this.autoUpdate) {
93
+ this.start();
94
+ }
95
+ },
96
+ (error) => {
97
+ console.error(
98
+ `Tempo :: cannot access microphone. Make sure to allow usage of the microphone.`,
99
+ );
100
+ },
101
+ );
94
102
  }
95
103
 
96
104
  start() {
@@ -130,9 +138,8 @@ class Tempo {
130
138
  this.context = null;
131
139
  this.running = null;
132
140
 
133
- console.log("Tempo :: dispose", this);
141
+ console.log('Tempo :: dispose', this);
134
142
  }
135
-
136
143
  }
137
144
 
138
145
  export default Tempo;
@@ -1,93 +1,90 @@
1
1
  <script>
2
- import { onDestroy, onMount } from "svelte";
2
+ import { onDestroy, onMount } from 'svelte';
3
3
 
4
- import { audioAnalysis } from "../../stores/audioAnalysis";
4
+ import { audioAnalysis } from '../../stores/audioAnalysis';
5
5
 
6
+ export let rowCount = 10;
7
+ export let index;
6
8
 
9
+ let rows = Array(rowCount).fill({ node: null });
10
+ let range = audioAnalysis.getRange(index);
7
11
 
8
- export let rowCount = 10;
9
- export let index;
12
+ let offUpdate;
10
13
 
11
- let rows = Array(rowCount).fill({ node: null });
12
- let range = audioAnalysis.getRange(index);
14
+ onMount(() => {
15
+ offUpdate = audioAnalysis.onUpdate(() => {
16
+ const { volume } = range;
17
+ const count = rowCount * volume;
13
18
 
14
- let offUpdate;
19
+ const full = Math.floor(count);
20
+ const temp = count - full;
15
21
 
16
- onMount(() => {
17
- offUpdate = audioAnalysis.onUpdate(() => {
18
- const { volume } = range;
19
- const count = rowCount * volume;
22
+ for (let i = rows.length - 1; i >= 0; i--) {
23
+ const index = rows.length - i;
24
+ const node = rows[i];
20
25
 
21
- const full = Math.floor(count);
22
- const temp = count - full;
23
-
24
- for(let i = rows.length - 1; i >= 0; i--) {
25
- const index = rows.length - i;
26
- const node = rows[i];
27
-
28
- if (index < full) {
29
- node.style.setProperty('--opacity', 1);
30
- } else {
31
- node.style.setProperty('--opacity', 0);
26
+ if (index < full) {
27
+ node.style.setProperty('--opacity', 1);
28
+ } else {
29
+ node.style.setProperty('--opacity', 0);
30
+ }
32
31
  }
33
- }
32
+ });
34
33
  });
35
- });
36
-
37
- onDestroy(() => {
38
- if (offUpdate) {
39
- offUpdate();
40
- offUpdate = null;
41
- }
42
- });
43
34
 
35
+ onDestroy(() => {
36
+ if (offUpdate) {
37
+ offUpdate();
38
+ offUpdate = null;
39
+ }
40
+ });
44
41
  </script>
45
42
 
46
43
  <div class="range" style={`grid-template-rows: repeat(${rows.length}, 1fr)`}>
47
- {#each rows as row, i }
44
+ {#each rows as row, i}
48
45
  <div class="row" bind:this={rows[i]}></div>
49
46
  {/each}
50
47
  </div>
51
48
 
52
49
  <style>
53
- .range {
54
- position: relative;
55
-
56
- display: grid;
57
- row-gap: 2px;
58
- padding: 3px 0;
59
- }
60
-
61
- .range:not(:last-child):after {
62
- content: '';
63
-
64
- position: absolute;
65
- top: 0;
66
- right: -2px;
67
- bottom: 0;
68
- width: 1px;
69
-
70
- background-color: var(--color-border-input);
71
- }
72
-
73
- .row {
74
- position: relative;
75
- background: rgba(0, 0, 0, 0.3);
76
- border-radius: 2px;
77
- }
78
-
79
- .row:before {
80
- content: "";
81
-
82
- position: absolute;
83
- top: 0;
84
- left: 0;
85
-
86
- width: 100%;
87
- height: 100%;
88
-
89
- background-color: var(--color-active);
90
- opacity: var(--opacity, 0);
91
- border-radius: 2px;
92
- }
50
+ .range {
51
+ position: relative;
52
+
53
+ display: grid;
54
+ row-gap: 2px;
55
+ padding: 3px 0;
56
+ }
57
+
58
+ .range:not(:last-child):after {
59
+ content: '';
60
+
61
+ position: absolute;
62
+ top: 0;
63
+ right: -2px;
64
+ bottom: 0;
65
+ width: 1px;
66
+
67
+ background-color: var(--color-border-input);
68
+ }
69
+
70
+ .row {
71
+ position: relative;
72
+ background: rgba(0, 0, 0, 0.3);
73
+ border-radius: 2px;
74
+ }
75
+
76
+ .row:before {
77
+ content: '';
78
+
79
+ position: absolute;
80
+ top: 0;
81
+ left: 0;
82
+
83
+ width: 100%;
84
+ height: 100%;
85
+
86
+ background-color: var(--color-active);
87
+ opacity: var(--opacity, 0);
88
+ border-radius: 2px;
89
+ }
93
90
  </style>
@@ -1,31 +1,32 @@
1
1
  <script>
2
- import Range from "./Range.svelte";
3
- import { audioAnalysis } from "../../stores/audioAnalysis";
4
-
5
- $: ranges = audioAnalysis.getRanges();
2
+ import Range from './Range.svelte';
3
+ import { audioAnalysis } from '../../stores/audioAnalysis';
6
4
 
5
+ $: ranges = audioAnalysis.getRanges();
7
6
  </script>
8
7
 
9
- <div class="spectrum" style={`grid-template-columns: repeat(${ranges.length}, 1fr)`}>
10
- {#each ranges as r, rangeIndex }
8
+ <div
9
+ class="spectrum"
10
+ style={`grid-template-columns: repeat(${ranges.length}, 1fr)`}
11
+ >
12
+ {#each ranges as r, rangeIndex}
11
13
  <Range rowCount={12} index={rangeIndex} />
12
14
  {/each}
13
15
  </div>
14
16
 
15
17
  <style>
16
- .spectrum {
17
- position: relative;
18
-
19
- display: grid;
20
- column-gap: 3px;
21
- width: 100%;
22
- aspect-ratio: 3 / 1;
23
- grid-template-columns: repeat(10, 1fr);
24
- padding: 0 3px;
18
+ .spectrum {
19
+ position: relative;
25
20
 
26
- border-radius: var(--border-radius-input);
27
- background-color: var(--color-background-input);
28
- box-shadow: inset 0 0 0 1px var(--color-border-input);
29
- }
21
+ display: grid;
22
+ column-gap: 3px;
23
+ width: 100%;
24
+ aspect-ratio: 3 / 1;
25
+ grid-template-columns: repeat(10, 1fr);
26
+ padding: 0 3px;
30
27
 
28
+ border-radius: var(--border-radius-input);
29
+ background-color: var(--color-background-input);
30
+ box-shadow: inset 0 0 0 1px var(--color-border-input);
31
+ }
31
32
  </style>
@@ -1,68 +1,85 @@
1
1
  <script>
2
- import Field from "../ui/Field.svelte";
3
- import FieldGroup from "../ui/FieldGroup.svelte";
4
- import Module from "../ui/Module.svelte";
5
- import Spectrum from "./AudioAnalyser/Spectrum.svelte";
6
- import { audioAnalysis } from "../stores/audioAnalysis.js";
7
- import { onDestroy, onMount } from "svelte";
2
+ import Field from '../ui/Field.svelte';
3
+ import FieldGroup from '../ui/FieldGroup.svelte';
4
+ import Module from '../ui/Module.svelte';
5
+ import Spectrum from './AudioAnalyser/Spectrum.svelte';
6
+ import { audioAnalysis } from '../stores/audioAnalysis.js';
7
+ import { onDestroy, onMount } from 'svelte';
8
8
 
9
- onMount(() => {
10
- audioAnalysis.listen();
11
- });
9
+ onMount(() => {
10
+ audioAnalysis.listen();
11
+ });
12
12
 
13
- onDestroy(() => {
14
- audioAnalysis.stop();
15
- })
13
+ onDestroy(() => {
14
+ audioAnalysis.stop();
15
+ });
16
16
 
17
+ function handleChangeDecay(event) {
18
+ audioAnalysis.master.decay = event.detail;
19
+ }
17
20
 
18
- function handleChangeDecay(event) {
19
- audioAnalysis.master.decay = event.detail;
20
- }
21
-
22
- function handleChangeHold(event) {
23
- audioAnalysis.master.hold = event.detail;
24
- }
25
-
26
- function handleChangeMin(event) {
27
- audioAnalysis.master.min = event.detail;
28
- }
21
+ function handleChangeHold(event) {
22
+ audioAnalysis.master.hold = event.detail;
23
+ }
29
24
 
25
+ function handleChangeMin(event) {
26
+ audioAnalysis.master.min = event.detail;
27
+ }
30
28
  </script>
31
29
 
32
30
  <Module name="Audio Analyser">
33
31
  <Field
34
32
  key="source"
35
33
  value="microphone"
36
- params={{ options: ["microphone", "audioplayer"]}}
34
+ params={{ options: ['microphone', 'audioplayer'] }}
37
35
  />
38
36
  <Field key="spectrum">
39
37
  <Spectrum />
40
38
  </Field>
41
39
  <FieldGroup name="global">
42
- <Field key="decay" value={audioAnalysis.master.decay} params={{min: 0, max: 1, step: 0.01}} on:change={handleChangeDecay}/>
43
- <Field key="hold" value={audioAnalysis.master.hold} params={{min: 0, max: 1, step: 0.01}} on:change={handleChangeHold}/>
44
- <Field key="min" value={audioAnalysis.master.min} params={{min: 0, max: 1, step: 0.01}} on:change={handleChangeMin}/>
40
+ <Field
41
+ key="decay"
42
+ value={audioAnalysis.master.decay}
43
+ params={{ min: 0, max: 1, step: 0.01 }}
44
+ on:change={handleChangeDecay}
45
+ />
46
+ <Field
47
+ key="hold"
48
+ value={audioAnalysis.master.hold}
49
+ params={{ min: 0, max: 1, step: 0.01 }}
50
+ on:change={handleChangeHold}
51
+ />
52
+ <Field
53
+ key="min"
54
+ value={audioAnalysis.master.min}
55
+ params={{ min: 0, max: 1, step: 0.01 }}
56
+ on:change={handleChangeMin}
57
+ />
45
58
  </FieldGroup>
46
59
  {#if audioAnalysis.getRanges().length > 0}
47
- {#each audioAnalysis.getRanges() as range, rangeIndex }
48
- <FieldGroup name={`range ${range.start}-${range.end}`} collapsed key={rangeIndex}>
60
+ {#each audioAnalysis.getRanges() as range, rangeIndex}
61
+ <FieldGroup
62
+ name={`range ${range.start}-${range.end}`}
63
+ collapsed
64
+ key={rangeIndex}
65
+ >
49
66
  <Field
50
67
  key="decay"
51
68
  value={range.decay}
52
- params={{min: 0, max: 1, step: 0.01}}
53
- on:change={(e) => range.decay = e.detail}
69
+ params={{ min: 0, max: 1, step: 0.01 }}
70
+ on:change={(e) => (range.decay = e.detail)}
54
71
  />
55
72
  <Field
56
73
  key="hold"
57
74
  value={range.hold}
58
- params={{min: 0, max: 1, step: 0.01}}
59
- on:change={(e) => range.hold = e.detail}
75
+ params={{ min: 0, max: 1, step: 0.01 }}
76
+ on:change={(e) => (range.hold = e.detail)}
60
77
  />
61
78
  <Field
62
79
  key="min"
63
80
  value={range.min}
64
- params={{min: 0, max: 1, step: 0.01}}
65
- on:change={(e) => range.min = e.detail}
81
+ params={{ min: 0, max: 1, step: 0.01 }}
82
+ on:change={(e) => (range.min = e.detail)}
66
83
  />
67
84
  </FieldGroup>
68
85
  {/each}