admin commited on
Commit
f3988d9
·
0 Parent(s):

Initial commit

Browse files
Files changed (7) hide show
  1. .gitattributes +35 -0
  2. .gitignore +1 -0
  3. README.md +10 -0
  4. css/musicvision.css +90 -0
  5. index.html +43 -0
  6. js/player.js +221 -0
  7. src/bg.jpg +3 -0
.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bin.* filter=lfs diff=lfs merge=lfs -text
5
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.model filter=lfs diff=lfs merge=lfs -text
12
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
13
+ *.onnx filter=lfs diff=lfs merge=lfs -text
14
+ *.ot filter=lfs diff=lfs merge=lfs -text
15
+ *.parquet filter=lfs diff=lfs merge=lfs -text
16
+ *.pb filter=lfs diff=lfs merge=lfs -text
17
+ *.pt filter=lfs diff=lfs merge=lfs -text
18
+ *.pth filter=lfs diff=lfs merge=lfs -text
19
+ *.rar filter=lfs diff=lfs merge=lfs -text
20
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
21
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
22
+ *.tflite filter=lfs diff=lfs merge=lfs -text
23
+ *.tgz filter=lfs diff=lfs merge=lfs -text
24
+ *.xz filter=lfs diff=lfs merge=lfs -text
25
+ *.zip filter=lfs diff=lfs merge=lfs -text
26
+ *.zstandard filter=lfs diff=lfs merge=lfs -text
27
+ *.tfevents* filter=lfs diff=lfs merge=lfs -text
28
+ *.db* filter=lfs diff=lfs merge=lfs -text
29
+ *.ark* filter=lfs diff=lfs merge=lfs -text
30
+ **/*ckpt*data* filter=lfs diff=lfs merge=lfs -text
31
+ **/*ckpt*.meta filter=lfs diff=lfs merge=lfs -text
32
+ **/*ckpt*.index filter=lfs diff=lfs merge=lfs -text
33
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
34
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
35
+ *.jpg filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ test.*
README.md ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Music Vision
3
+ emoji: 🎵
4
+ colorFrom: indigo
5
+ colorTo: yellow
6
+ sdk: static
7
+ pinned: false
8
+ license: apache-2.0
9
+ short_description: Audio visualization circle effect tool
10
+ ---
css/musicvision.css ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ td {
2
+ white-space: nowrap;
3
+ overflow: hidden;
4
+ text-align: center;
5
+ width: 20%;
6
+ }
7
+
8
+ td:nth-child(2),
9
+ td:nth-child(5),
10
+ td:nth-child(7) {
11
+ text-align: right;
12
+ }
13
+
14
+ td:nth-child(1),
15
+ td:nth-child(3),
16
+ td:nth-child(6) {
17
+ text-align: left;
18
+ }
19
+
20
+ td:nth-child(4) {
21
+ text-align: center;
22
+ }
23
+
24
+ table {
25
+ table-layout: fixed;
26
+ }
27
+
28
+ body {
29
+ background-color: black;
30
+ margin: 0 !important;
31
+ }
32
+
33
+ .first {
34
+ opacity: 1 !important;
35
+ }
36
+
37
+ #upl {
38
+ position: fixed;
39
+ top: 0;
40
+ width: 100%;
41
+ height: auto;
42
+ display: block;
43
+ background-color: #1a1c2f;
44
+ opacity: 0;
45
+ transition: opacity 0.618s linear;
46
+ }
47
+
48
+ #upl:hover {
49
+ opacity: 1;
50
+ }
51
+
52
+ canvas {
53
+ aspect-ratio: 16/9;
54
+ margin: 0 auto;
55
+ display: block;
56
+ }
57
+
58
+ p,
59
+ #bgFile,
60
+ #musicFile {
61
+ color: white;
62
+ }
63
+
64
+ #bgFile {
65
+ text-align-last: right;
66
+ }
67
+
68
+ #startStop {
69
+ text-align: center;
70
+ }
71
+
72
+ .bg {
73
+ background-image: url('../src/bg.jpg');
74
+ background-repeat: no-repeat;
75
+ background-size: cover;
76
+ background-position: center;
77
+ top: 0 !important;
78
+ left: 0 !important;
79
+ filter: opacity(0.618);
80
+ display: block;
81
+ width: 100%;
82
+ height: 100%;
83
+ position: absolute;
84
+ z-index: -1;
85
+ }
86
+
87
+ td p,
88
+ td a {
89
+ font-size: x-small;
90
+ }
index.html ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html>
2
+
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>Audio Visual Circle Effect</title>
6
+ <link rel="stylesheet" href="./css/musicvision.css" type="text/css" />
7
+ <script type="text/javascript" src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
8
+ <script type="text/javascript" src="./js/player.js"></script>
9
+ </head>
10
+
11
+ <body>
12
+ <div id="upl" class="first">
13
+ <table border="0" width="100%">
14
+ <tr>
15
+ <td>
16
+ <button id="fullscreen">Fullscreen</button>
17
+ </td>
18
+ <td>
19
+ <p id="tip">Upload audio to be visualized👉</p>
20
+ </td>
21
+ <td>
22
+ <input type="file" id="musicFile" accept=".mp3,.wav,.m4a,.flac">
23
+ </td>
24
+ <td>
25
+ <input type="button" id="startStop" name="startStop" value="Pause">
26
+ </td>
27
+ <td>
28
+ <input type="file" id="bgFile" accept=".png,.jpg,.gif,.bmp">
29
+ </td>
30
+ <td>
31
+ <p>👈Upload background image</p>
32
+ </td>
33
+ <td>
34
+ <button id="home">Restore to initial background</button>
35
+ </td>
36
+ </tr>
37
+ </table>
38
+ </div>
39
+ <div class="bg"></div>
40
+ <canvas id="wrap"></canvas>
41
+ </body>
42
+
43
+ </html>
js/player.js ADDED
@@ -0,0 +1,221 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // 加载语言
2
+ let zh_CN = ($("title").text() == "音频可视化圆环特效");
3
+
4
+ // 初始化文件
5
+ function clearInputFiles(inputId) {
6
+ let inputElement = document.getElementById(inputId);
7
+ if (inputElement.files && inputElement.files.length > 0) {
8
+ let reader = new FileReader();
9
+ reader.readAsArrayBuffer(inputElement.files[0]);
10
+ reader.onload = function () {
11
+ inputElement.value = '';
12
+ };
13
+ }
14
+ }
15
+
16
+ // 还原背景图
17
+ function recover_bg() {
18
+ $(".bg").css("background-image", "url(./src/bg.jpg)");
19
+ clearInputFiles("bgFile");
20
+ }
21
+
22
+ // 加载全屏按钮
23
+ function openFullscreen(elem) {
24
+ if (elem.requestFullscreen) {
25
+ elem.requestFullscreen();
26
+ } else if (elem.mozRequestFullScreen) { // Firefox
27
+ elem.mozRequestFullScreen();
28
+ } else if (elem.webkitRequestFullscreen) { // Chrome, Safari and Opera
29
+ elem.webkitRequestFullscreen();
30
+ } else if (elem.msRequestFullscreen) { // IE/Edge
31
+ elem.msRequestFullscreen();
32
+ }
33
+ }
34
+
35
+ // exit fullscreen
36
+ function closeFullscreen() {
37
+ if (document.exitFullscreen) {
38
+ document.exitFullscreen();
39
+ } else if (document.mozCancelFullScreen) { // Firefox
40
+ document.mozCancelFullScreen();
41
+ } else if (document.webkitExitFullscreen) { // Chrome, Safari and Opera
42
+ document.webkitExitFullscreen();
43
+ } else if (document.msExitFullscreen) { // IE/Edge
44
+ document.msExitFullscreen();
45
+ }
46
+ }
47
+
48
+ function loadFullscreen() {
49
+ // fullscreen related
50
+ document.getElementById("fullscreen").addEventListener("click", function () {
51
+ if (document.fullscreenElement) {
52
+ closeFullscreen();
53
+ } else {
54
+ openFullscreen(document.documentElement);
55
+ }
56
+ });
57
+
58
+ document.addEventListener('fullscreenchange', function () {
59
+ if (document.fullscreenElement) {
60
+ document.getElementById("fullscreen").innerText = zh_CN ? "退出全屏" : "Exit fullscreen";
61
+ } else {
62
+ document.getElementById("fullscreen").innerText = zh_CN ? "全屏" : "Fullscreen";
63
+ }
64
+ });
65
+ }
66
+
67
+ // 检查设备类型
68
+ function checkDeviceType() {
69
+ const userAgent = navigator.userAgent || window.opera;
70
+ if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent)) {
71
+ let warning = zh_CN ? "请使用 PC 端浏览器查看!" : "Please view on PC browsers!"
72
+ $("body").remove();
73
+ $("html").append(`<body><h1 style="text-align: center; font-size: xxx-large;">${warning}</h1></body>`);
74
+ return false;
75
+ }
76
+ return true;
77
+ }
78
+
79
+ window.onload = function () {
80
+ if (!checkDeviceType()) return;
81
+ wrap.width = window.innerWidth - 1;
82
+ wrap.height = window.innerHeight - 1;
83
+ let canvasCtx = wrap.getContext("2d");
84
+ let AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext;
85
+ let audioContext = new AudioContext();
86
+ canvasCtx.shadowColor = "white";
87
+ canvasCtx.shadowBlur = 10;
88
+
89
+ $("#home").click(function () {
90
+ recover_bg();
91
+ });
92
+
93
+ $('#upl').hover(function () {
94
+ $(this).removeClass("first");
95
+ });
96
+
97
+ $('#bgFile').change(function () {
98
+ if (this.files.length <= 0) return;
99
+ if (this.files[0].size > 5242880) {
100
+ alert(zh_CN ? '文件大小超过 5M' : 'File size larger than 5M');
101
+ return;
102
+ }
103
+ let file = this.files[0];
104
+ let reader = new FileReader();
105
+ reader.readAsDataURL(file);
106
+ reader.onload = function () {
107
+ $('.bg').css('background-image', 'url(' + reader.result + ')');
108
+ };
109
+ });
110
+
111
+ $('#musicFile').change(function () {
112
+ if (this.files.length == 0) {
113
+ $("#tip").text(zh_CN ? "上传待可视化的音频👉" : "Upload audio to be visualized👉");
114
+ return;
115
+ }
116
+ audioContext.close();
117
+ audioContext = new AudioContext();
118
+ $("#startStop").val(zh_CN ? '暂停' : 'Pause');
119
+ let file = $('#musicFile')[0].files[0];
120
+ let fileReader = new FileReader();
121
+ fileReader.readAsArrayBuffer(file);
122
+ fileReader.onload = function (e) {
123
+ let count = 0;
124
+ $('#tip').text(zh_CN ? '开始解码' : 'Start decoding')
125
+ let timer = setInterval(function () {
126
+ count++;
127
+ $('#tip').text((zh_CN ? '正在解码中, 已耗时 ' : 'In decoding, already used ') + count + 's')
128
+ }, 1000)
129
+ audioContext.decodeAudioData(e.target.result, function (buffer) {
130
+ clearInterval(timer)
131
+ $('#tip').text((zh_CN ? '解码成功, 总耗时 ' : 'Decoded successfully, total time ') + count + 's');
132
+ let audioBufferSourceNode = audioContext.createBufferSource();
133
+ let analyser = audioContext.createAnalyser();
134
+ audioBufferSourceNode.connect(analyser);
135
+ analyser.connect(audioContext.destination);
136
+ audioBufferSourceNode.buffer = buffer;
137
+ audioBufferSourceNode.start();
138
+ startStop.onclick = function () {
139
+ if (audioContext.state === 'running') {
140
+ audioContext.suspend().then(function () {
141
+ $("#startStop").val(zh_CN ? '播放' : 'Play');
142
+ });
143
+ } else if (audioContext.state === 'suspended') {
144
+ audioContext.resume().then(function () {
145
+ $("#startStop").val(zh_CN ? '暂停' : 'Pause');
146
+ });
147
+ }
148
+ }
149
+ let oW = wrap.width;
150
+ let oH = wrap.height;
151
+ let color1 = canvasCtx.createLinearGradient(oW / 2, oH / 2 - 10, oW / 2, oH / 2 - 150);
152
+ color1.addColorStop(0, '#1E90FF');
153
+ color1.addColorStop(.25, '#FF7F50');
154
+ color1.addColorStop(.5, '#8A2BE2');
155
+ color1.addColorStop(.75, '#4169E1');
156
+ color1.addColorStop(1, '#00FFFF');
157
+ let color2 = canvasCtx.createLinearGradient(0, 0, oW, oH);
158
+ color2.addColorStop(0, '#1E90FF');
159
+ color2.addColorStop(.25, '#FFD700');
160
+ color2.addColorStop(.5, '#8A2BE2');
161
+ color2.addColorStop(.75, '#4169E1');
162
+ color2.addColorStop(1, '#FF0000');
163
+ let output = new Uint8Array(180);
164
+ let du = 2;
165
+ let R = 200;
166
+ let W = 2;
167
+ (function drawSpectrum() {
168
+ analyser.getByteFrequencyData(output);
169
+ canvasCtx.clearRect(0, 0, wrap.width, wrap.height);
170
+ for (let i = 0; i < 360; i++) {
171
+ let value = output[i] / 10;
172
+ canvasCtx.beginPath();
173
+ canvasCtx.lineWidth = W;
174
+ Rv1 = (R - value);
175
+ Rv2 = (R + value);
176
+ canvasCtx.moveTo((Math.sin((i * du) / 180 * Math.PI) * Rv1 + oW / 2), -Math.cos((i * du) / 180 * Math.PI) * Rv1 + oH / 2);
177
+ canvasCtx.lineTo((Math.sin((i * du) / 180 * Math.PI) * Rv2 + oW / 2), -Math.cos((i * du) / 180 * Math.PI) * Rv2 + oH / 2);
178
+ canvasCtx.strokeStyle = color1;
179
+ canvasCtx.stroke();
180
+ }
181
+ canvasCtx.font = "italic bold 20px Microsoft Yahei";
182
+ canvasCtx.fillStyle = color2;
183
+ canvasCtx.textAlign = "center";
184
+ canvasCtx.textBaseline = "middle";
185
+ canvasCtx.fillText(file.name.split('.mp3')[0], oW / 2, oH / 2);
186
+ requestAnimationFrame(drawSpectrum);
187
+ })();
188
+
189
+ $(window).resize(function () {
190
+ wrap.width = window.innerWidth - 1;
191
+ wrap.height = window.innerHeight - 1;
192
+ let oW = wrap.width;
193
+ let oH = wrap.height;
194
+ (function drawSpectrum() {
195
+ analyser.getByteFrequencyData(output);
196
+ canvasCtx.clearRect(0, 0, wrap.width, wrap.height);
197
+ for (let i = 0; i < 360; i++) {
198
+ let value = output[i] / 10;
199
+ canvasCtx.beginPath();
200
+ canvasCtx.lineWidth = W;
201
+ Rv1 = (R - value);
202
+ Rv2 = (R + value);
203
+ canvasCtx.moveTo((Math.sin((i * du) / 180 * Math.PI) * Rv1 + oW / 2), -Math.cos((i * du) / 180 * Math.PI) * Rv1 + oH / 2);
204
+ canvasCtx.lineTo((Math.sin((i * du) / 180 * Math.PI) * Rv2 + oW / 2), -Math.cos((i * du) / 180 * Math.PI) * Rv2 + oH / 2);
205
+ canvasCtx.strokeStyle = color1;
206
+ canvasCtx.stroke();
207
+ }
208
+ canvasCtx.font = "italic bold 20px Microsoft Yahei";
209
+ canvasCtx.fillStyle = color2;
210
+ canvasCtx.textAlign = "center";
211
+ canvasCtx.textBaseline = "middle";
212
+ canvasCtx.fillText(file.name.split('.mp3')[0], oW / 2, oH / 2);
213
+ requestAnimationFrame(drawSpectrum);
214
+ })();
215
+ });
216
+ })
217
+ }
218
+ });
219
+
220
+ loadFullscreen();
221
+ }
src/bg.jpg ADDED

Git LFS Details

  • SHA256: 28cef375367bc1bd5d84bb10f9321a369a58f615750854a49a8357cbbe59fa59
  • Pointer size: 131 Bytes
  • Size of remote file: 853 kB