daydreamer-json commited on
Commit
97c44ca
·
verified ·
1 Parent(s): f5b2b6d

Add umm_audiosync_test

Browse files
Files changed (2) hide show
  1. gi_jukebox_copy.html +268 -0
  2. umm_audiosync_test.html +279 -0
gi_jukebox_copy.html ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang='en'>
3
+ <head>
4
+ <title>N/A</title>
5
+ <meta charset='utf-8'>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.00">
7
+ <meta name="robots" content="noindex,nofollow,noarchive">
8
+ <script src="https://code.jquery.com/jquery-3.6.1.min.js" integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>
9
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/howler/2.2.3/howler.min.js" integrity="sha512-6+YN/9o9BWrk6wSfGxQGpt3EUK6XeHi6yeHV+TYD2GR0Sj/cggRpXr1BrAQf0as6XslxomMUxXp2vIl+fv0QRA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
10
+ <script src="https://cdn.plyr.io/3.7.3/plyr.js"></script>
11
+ <script src="https://cdn.jsdelivr.net/npm/hls.js@latest/dist/hls.min.js"></script>
12
+ <link rel="stylesheet" href="https://cdn.plyr.io/3.7.3/plyr.css" />
13
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,[email protected],100..700,0..1,-50..200" />
14
+ <link href="https://cdn.jsdelivr.net/gh/daydreamer-json/SomeFontRepo@main/somefontrepo.css" rel="stylesheet" type="text/css" media="all">
15
+ <style>
16
+ html, body {
17
+ color: #fff;
18
+ background: #000;
19
+ margin: 0;
20
+ padding: 0;
21
+ line-height: 1;
22
+ width: 100vw;
23
+ height: 100vh;
24
+ font-family: 'SDK_JP_Web', system-ui;
25
+ }
26
+ #h2string1, #h2string2 {
27
+ margin: 0;
28
+ padding: 0;
29
+ line-height: 1;
30
+ }
31
+ #main {
32
+ position: absolute;
33
+ top: 50%;
34
+ left: 50%;
35
+ transform: translate(-50%, -50%);
36
+ text-align: center;
37
+ margin: 0;
38
+ padding: 0;
39
+ white-space: normal;
40
+ letter-spacing: -0.02em;
41
+ text-shadow: 0 0 30px #cccccc;
42
+ z-index: 100;
43
+ }
44
+ #cover_bg_container {
45
+ width: 100vw;
46
+ height: 100vh;
47
+ overflow: hidden;
48
+ }
49
+ #cover_bg {
50
+ z-index: 95;
51
+ width: 100vw;
52
+ height: 100vh;
53
+ opacity: 0.3;
54
+ object-fit: cover;
55
+ object-position: 50% 50%;
56
+ }
57
+ #trackInfoContainer {
58
+ position: absolute;
59
+ top: 50%;
60
+ left: 50%;
61
+ transform: translate(-50%, -50%);
62
+ text-align: center;
63
+ margin: 0;
64
+ padding: 0;
65
+ white-space: normal;
66
+ letter-spacing: -0.02em;
67
+ text-shadow: 0 0 30px #cccccc;
68
+ z-index: 150;
69
+ }
70
+ #trackInfoBgMask {
71
+ width: 100vw;
72
+ height: 100vh;
73
+ text-align: center;
74
+ margin: 0;
75
+ padding: 0;
76
+ white-space: normal;
77
+ letter-spacing: -0.02em;
78
+ background: rgba(0, 0, 0, 0.01);
79
+ backdrop-filter: blur(20px);
80
+ z-index: 149;
81
+ }
82
+ .do-not-select {
83
+ user-select: none;
84
+ }
85
+ .do-not-bold {
86
+ font-weight: normal;
87
+ }
88
+ </style>
89
+ </head>
90
+ <body>
91
+ <div id='cover_bg_container'>
92
+ <img id='cover_bg' src='' style='display: none;'>
93
+ </div>
94
+ <div id='main'>
95
+ <h2 id='h2string1' class='do-not-select do-not-bold'>&nbsp;</h1>
96
+ <h1 id='h1string1' class='do-not-select do-not-bold'>&nbsp;</h1>
97
+ <div id='trackInfo' class='do-not-select'>
98
+ <h3 id='trackInfo_trackName' class='do-not-bold' style='display: none;'>&nbsp;</h3>
99
+ <h4 id='trackInfo_albumName' class='do-not-bold' style='display: none;'>&nbsp;</h4>
100
+ <h4 id='trackInfo_artistName' class='do-not-bold' style='display: none;'>&nbsp;</h4>
101
+ <p id='trackInfo_copyright' style='display: none;'>&nbsp;</p>
102
+ </div>
103
+ </div>
104
+ <div id='trackInfoBgMask'><p>&nbsp;</p></div>
105
+ <div id='trackInfoContainer' class='do-not-select'>
106
+ <h2 id='h2string2' class='do-not-select do-not-bold'>Album External Links</h2>
107
+ <p><a href=''>Apple Music</a></p>
108
+ <p><a href=''>Spotify</a></p>
109
+ <p><a href=''>VGMdb</a></p>
110
+ <p><a href=''>MusicBrainz</a></p>
111
+ </div>
112
+ <script>
113
+ let BASE_SETTINGS = {
114
+ base64var: {
115
+ pageTitle: 'R2Vuc2hpbiBJbXBhY3QgTXVzaWMgSnVrZWJveA==',
116
+ h2string1: 'R2Vuc2hpbiBJbXBhY3QgTXVzaWMgSnVrZWJveA=='
117
+ },
118
+ audioRootURL: 'https://raw.githubusercontent.com/daydreamer-json/discography_cdn_005/main/mhy/genshin',
119
+ playStartButtonText_init_pc: 'CLICK TO PLAY',
120
+ playStartButtonText_init_mobile: 'TAP TO PLAY',
121
+ playStartButtonText_loading: 'LOADING ...',
122
+ playStartButtonText_playing: 'NOW PLAYING',
123
+ trackInfoLabel_loading: 'Loading ...',
124
+ forceCompressedFormat: true
125
+ };
126
+ function detectMobileDevice() {
127
+ if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
128
+ return 'mobile'
129
+ } else {
130
+ return 'pc'
131
+ }
132
+ }
133
+ function display_deobfuscate() {
134
+ document.title = atob(BASE_SETTINGS.base64var.pageTitle);
135
+ document.getElementById('h2string1').textContent = atob(BASE_SETTINGS.base64var.h2string1);
136
+ }
137
+ function randomTrackSelector(db) {
138
+ let randomizedAlbumIndex = Math.floor(Math.random() * db.list.length);
139
+ let randomizedDiscIndex = Math.floor(Math.random() * db.list[randomizedAlbumIndex].discs.length);
140
+ let randomizedTrackIndex = Math.floor(Math.random() * db.list[randomizedAlbumIndex].discs[randomizedDiscIndex].tracks.length);
141
+ return {
142
+ albumIndex: randomizedAlbumIndex,
143
+ discIndex: randomizedDiscIndex,
144
+ trackIndex: randomizedTrackIndex
145
+ };
146
+ }
147
+ function playAudioURLBuilder(db, randomTrackSelectorOutput) {
148
+ let deviceType = detectMobileDevice();
149
+ /*
150
+ let bpsArray = new Array();
151
+ for (let i = 0; i < db.list[randomTrackSelectorOutput.albumIndex].availableFmts.length; i++) {
152
+ bpsArray.push(db.list[randomTrackSelectorOutput.albumIndex].availableFmts[i].bps);
153
+ };
154
+ bpsArray.sort((a, b) => b - a);
155
+ */
156
+ let formatPath = '';
157
+ let formatExt = '';
158
+ if (BASE_SETTINGS.forceCompressedFormat) {
159
+ formatPath = db.list[randomTrackSelectorOutput.albumIndex].availableFmts[db.list[randomTrackSelectorOutput.albumIndex].availableFmts.length - 1].path;
160
+ formatExt = db.list[randomTrackSelectorOutput.albumIndex].availableFmts[db.list[randomTrackSelectorOutput.albumIndex].availableFmts.length - 1].ext;
161
+ } else if (deviceType == 'pc') {
162
+ formatPath = db.list[randomTrackSelectorOutput.albumIndex].availableFmts[0].path;
163
+ formatExt = db.list[randomTrackSelectorOutput.albumIndex].availableFmts[0].ext;
164
+ } else if (deviceType == 'mobile') {
165
+ formatPath = db.list[randomTrackSelectorOutput.albumIndex].availableFmts[db.list[randomTrackSelectorOutput.albumIndex].availableFmts.length - 1].path;
166
+ formatExt = db.list[randomTrackSelectorOutput.albumIndex].availableFmts[db.list[randomTrackSelectorOutput.albumIndex].availableFmts.length - 1].ext;
167
+ }
168
+ let trackTotal = 0;
169
+ let trackCountArray = new Array();
170
+ for (let i = 0; i < db.list[randomTrackSelectorOutput.albumIndex].discs.length; i++) {
171
+ trackTotal += db.list[randomTrackSelectorOutput.albumIndex].discs[i].tracks.length;
172
+ trackCountArray.push(db.list[randomTrackSelectorOutput.albumIndex].discs[i].tracks.length);
173
+ };
174
+ let selectedTrackNum = 0;
175
+ if (randomTrackSelectorOutput.discIndex == 0) {
176
+ selectedTrackNum = randomTrackSelectorOutput.trackIndex + 1;
177
+ } else {
178
+ let E7BF25ECDBAAF938 = 0;
179
+ for (let i = 0; i < randomTrackSelectorOutput.discIndex; i++) {
180
+ E7BF25ECDBAAF938 += trackCountArray[i];
181
+ }
182
+ selectedTrackNum = E7BF25ECDBAAF938 + randomTrackSelectorOutput.trackIndex + 1;
183
+ }
184
+ let selectedTrackNumStr = '';
185
+ if (trackTotal >= 100) {
186
+ selectedTrackNumStr = selectedTrackNum.toString().padStart(3, '0');
187
+ } else if (trackTotal < 100) {
188
+ selectedTrackNumStr = selectedTrackNum.toString().padStart(2, '0');
189
+ }
190
+ let filename = encodeURIComponent(db.list[randomTrackSelectorOutput.albumIndex].discs[randomTrackSelectorOutput.discIndex].tracks[randomTrackSelectorOutput.trackIndex].trackName['en-US'].replace(/'/g, '_'));
191
+ let buildedURL = `${BASE_SETTINGS.audioRootURL}/${db.list[randomTrackSelectorOutput.albumIndex].rootPath}/${formatPath}/${selectedTrackNumStr}_${filename}.${formatExt}`;
192
+ return buildedURL;
193
+ }
194
+ function playAudio() {
195
+ document.getElementById('h1string1').removeEventListener('click', playAudio);
196
+ if (typeof audioPlayer !== 'undefined') {
197
+ audioPlayer.unload();
198
+ };
199
+ fetch(`${BASE_SETTINGS.audioRootURL}/db.json`)
200
+ .then(response => response.json())
201
+ .then(data => {
202
+ console.log('Database loaded successfully');
203
+ const FILE_DATABASE = data;
204
+ let deviceType = detectMobileDevice();
205
+ let randomTrackSelectorOutput = randomTrackSelector(FILE_DATABASE);
206
+ var audioPlayer = new Howl ({
207
+ src: [playAudioURLBuilder(FILE_DATABASE, randomTrackSelectorOutput)],
208
+ html5: true
209
+ });
210
+ window.audioPlayer = audioPlayer;
211
+ document.getElementById('h1string1').textContent = BASE_SETTINGS.playStartButtonText_loading;
212
+ document.getElementById('trackInfo_trackName').textContent = BASE_SETTINGS.trackInfoLabel_loading;
213
+ document.getElementById('trackInfo_albumName').textContent = BASE_SETTINGS.trackInfoLabel_loading;
214
+ document.getElementById('trackInfo_artistName').textContent = BASE_SETTINGS.trackInfoLabel_loading;
215
+ document.getElementById('trackInfo_copyright').textContent = BASE_SETTINGS.trackInfoLabel_loading;
216
+ audioPlayer.on('loaderror', function(){
217
+ console.error('Audio "loaderror" has occured. Retrying ...');
218
+ playAudio();
219
+ });
220
+ audioPlayer.on('playerror', function(){
221
+ console.error('Audio "playerror" has occured. Retrying ...');
222
+ playAudio();
223
+ });
224
+ audioPlayer.on('load', function(){
225
+ audioPlayer.play();
226
+ document.getElementById('h1string1').addEventListener('click', playAudio);
227
+ document.getElementById('h1string1').textContent = BASE_SETTINGS.playStartButtonText_playing;
228
+ console.log(`Now playing "${FILE_DATABASE.list[randomTrackSelectorOutput.albumIndex].discs[randomTrackSelectorOutput.discIndex].tracks[randomTrackSelectorOutput.trackIndex].trackName['en-US']}"`);
229
+ console.log(`URL: ${audioPlayer._src}`);
230
+ document.getElementById('trackInfo_trackName').textContent = FILE_DATABASE.list[randomTrackSelectorOutput.albumIndex].discs[randomTrackSelectorOutput.discIndex].tracks[randomTrackSelectorOutput.trackIndex].trackName['en-US'];
231
+ document.getElementById('trackInfo_albumName').textContent = FILE_DATABASE.list[randomTrackSelectorOutput.albumIndex].albumTitle;
232
+ document.getElementById('trackInfo_artistName').textContent = FILE_DATABASE.list[randomTrackSelectorOutput.albumIndex].albumArtist;
233
+ document.getElementById('trackInfo_copyright').textContent = FILE_DATABASE.list[randomTrackSelectorOutput.albumIndex].copyright;
234
+ document.getElementById('cover_bg').src = FILE_DATABASE.list[randomTrackSelectorOutput.albumIndex].coverExtLink;
235
+ if (document.getElementById('trackInfo_trackName').style.display == 'none' && document.getElementById('trackInfo_albumName').style.display == 'none' && document.getElementById('trackInfo_artistName').style.display == 'none' && document.getElementById('trackInfo_copyright').style.display == 'none' && document.getElementById('cover_bg').style.display == 'none') {
236
+ document.getElementById('trackInfo_trackName').style.display = 'block';
237
+ document.getElementById('trackInfo_albumName').style.display = 'block';
238
+ document.getElementById('trackInfo_artistName').style.display = 'block';
239
+ document.getElementById('trackInfo_copyright').style.display = 'block';
240
+ document.getElementById('cover_bg').style.display = 'block';
241
+ }
242
+ audioPlayer.on('end', playAudio);
243
+ });
244
+ })
245
+ .catch(error => {
246
+ console.error(error);
247
+ alert('Failed to load database file');
248
+ });
249
+ }
250
+ document.addEventListener('DOMContentLoaded', function() {
251
+ display_deobfuscate();
252
+ let deviceType = detectMobileDevice();
253
+ if (deviceType == 'pc') {
254
+ document.getElementById('h1string1').textContent = BASE_SETTINGS.playStartButtonText_init_pc;
255
+ } else if (deviceType == 'mobile') {
256
+ document.getElementById('h1string1').textContent = BASE_SETTINGS.playStartButtonText_init_mobile;
257
+ };
258
+ var audioPlayer = new Howl ({
259
+ src: ['https://archive.org/download/audio-silent-wavs-one-second-half-second-quarter-second/silent_quarter-second.mp3']
260
+ });
261
+ window.audioPlayer = audioPlayer;
262
+ });
263
+ window.onload = function () {
264
+ document.getElementById('h1string1').addEventListener('click', playAudio);
265
+ }
266
+ </script>
267
+ </body>
268
+ </html>
umm_audiosync_test.html ADDED
@@ -0,0 +1,279 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html>
2
+ <head>
3
+ <meta charset="utf-8" />
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.00" />
5
+ <meta name="robots" content="noindex,nofollow,noarchive" />
6
+ <script
7
+ src="https://code.jquery.com/jquery-3.6.1.min.js"
8
+ integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ="
9
+ crossorigin="anonymous"
10
+ ></script>
11
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/howler/2.2.3/howler.min.js"></script>
12
+ <link
13
+ rel="stylesheet"
14
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,[email protected],100..700,0..1,-50..200"
15
+ />
16
+ <link
17
+ href="https://cdn.jsdelivr.net/gh/daydreamer-json/SomeFontRepo@main/somefontrepo.css"
18
+ rel="stylesheet"
19
+ type="text/css"
20
+ media="all"
21
+ />
22
+ <style>
23
+ html,
24
+ body {
25
+ color: #fff;
26
+ background: #000;
27
+ margin: 0;
28
+ line-height: 1;
29
+ width: 100vw;
30
+ height: 100vh;
31
+ font-family: "A-OTF UD Shin Go Pro", system-ui;
32
+ }
33
+ textarea,
34
+ button {
35
+ color: #fff;
36
+ background: #000;
37
+ width: 100vw;
38
+ font-family: system-ui;
39
+ resize: none;
40
+ }
41
+ .inputbox {
42
+ color: #fff;
43
+ background: #000;
44
+ width: 20vw;
45
+ font-family: system-ui;
46
+ }
47
+ </style>
48
+ <script>
49
+ function logger(text) {
50
+ document.getElementById("textbox").value += "\r\n" + text; // 新しい行に文字列を追加する
51
+ }
52
+ // 以下のスクリプトはBing(ChatGPT)が生成したものに追記したものです。
53
+ // プロンプト:
54
+ // ある曲のカラオケバージョンの音源と、3人分のボーカルの音源があります。つまり、4つの音声ファイルがあります。これらのファイルを完全に同期して同時再生するコードを、Howler.jsを使用した上でHTMLとJavaScriptで書いてください。
55
+
56
+ var howls = [];
57
+ // 同期再生用の関数を定義
58
+ function playSync() {
59
+ stopAll();
60
+ var liveID = document.getElementById("liveIDBox").value;
61
+ var charaID = [
62
+ document.getElementById("charaIDBox1").value,
63
+ document.getElementById("charaIDBox2").value,
64
+ document.getElementById("charaIDBox3").value,
65
+ ];
66
+ var okeVol = document.getElementById("okeVolBox").value;
67
+ var charaVol1 = document.getElementById("charaVolBox1").value;
68
+ var charaVol2 = document.getElementById("charaVolBox2").value;
69
+ var charaPan = document.getElementById("charaPanBox").value;
70
+ // 音声ファイルのパスを配列に格納
71
+ var audioFiles = [
72
+ `https://cdn.jsdelivr.net/gh/daydreamer-json/umm_assets@main/sound/l/${liveID}/snd_bgm_live_${liveID}_oke_02/snd_bgm_live_${liveID}_oke_02_1.m4a`,
73
+ `https://cdn.jsdelivr.net/gh/daydreamer-json/umm_assets@main/sound/l/${liveID}/snd_bgm_live_${liveID}_chara_${charaID[0]}_01/snd_bgm_live_${liveID}_chara_${charaID[0]}_01_1.m4a`,
74
+ `https://cdn.jsdelivr.net/gh/daydreamer-json/umm_assets@main/sound/l/${liveID}/snd_bgm_live_${liveID}_chara_${charaID[1]}_01/snd_bgm_live_${liveID}_chara_${charaID[1]}_01_1.m4a`,
75
+ `https://cdn.jsdelivr.net/gh/daydreamer-json/umm_assets@main/sound/l/${liveID}/snd_bgm_live_${liveID}_chara_${charaID[2]}_01/snd_bgm_live_${liveID}_chara_${charaID[2]}_01_1.m4a`,
76
+ ];
77
+ logger("playSync関数が呼び出されました");
78
+ logger(`liveIDは${liveID}です`);
79
+ // logger(`liveIDのtext_dataは${master_db_text_data_search(16, liveID).text}です`);
80
+ for (let i = 0; i < charaID.length; i++) {
81
+ logger(`charaIDは${charaID[i]}です: id=${i + 1}`);
82
+ }
83
+ document.getElementById("urllistbox").value = "";
84
+ for (let i = 0; i < audioFiles.length; i++) {
85
+ remote_file_head_test(audioFiles[i], i);
86
+ }
87
+ // 配列の要素数だけ繰り返す
88
+ for (let i = 0; i < audioFiles.length; i++) {
89
+ // Howlオブジェクトを作成して配列に追加
90
+ howls[i] = new Howl({
91
+ src: audioFiles[i], // 音声ファイルのパス
92
+ preload: true, // 読み込み完了まで待つかどうか
93
+ autoplay: false, // 自動再生するかどうか
94
+ loop: true, // ループ再生するかどうか
95
+ });
96
+ logger(`Howlオブジェクトを作成しました: id=${i}`);
97
+ }
98
+ // 全ての音声ファイルが読み込まれたら実行する関数を設定
99
+ var loadedCount = 0; // 読み込まれた音声ファイルの数
100
+ var onLoad = function () {
101
+ loadedCount++; // 読み込まれた数を増やす
102
+ logger(`音声ファイルがプリロードされました: id=${loadedCount - 1}`);
103
+ document.getElementById("urllistbox").value +=
104
+ audioFiles[loadedCount - 1].match(/([^\/?#]+)(?=[^\/]*$)/)[0] +
105
+ "\r\n";
106
+ if (loadedCount == audioFiles.length) {
107
+ // 全て読み込まれたら
108
+ howls[0].volume(okeVol);
109
+ logger(
110
+ `Howlオブジェクトのvolumeを変更しました: id=0, value=${okeVol}`
111
+ );
112
+ for (let j = 2; j <= 3; j++) {
113
+ howls[j].volume(charaVol2); // ボーカルの音源3つ(インデックス1から3)の音量を設定(追加したコード)
114
+ logger(
115
+ `Howlオブジェクトのvolumeを変更しました: id=${j}, value=${charaVol2}`
116
+ );
117
+ }
118
+ howls[1].volume(charaVol1);
119
+ logger(
120
+ `Howlオブジェクトのvolumeを変更しました: id=1, value=${charaVol1}`
121
+ );
122
+ howls[2].stereo(0 - charaPan); // 特定のボーカルだけ左チャンネルに寄せる(追加したコード)
123
+ logger(
124
+ `Howlオブジェクトのstereoを変更しました: id=2, value=${
125
+ 0 - charaPan
126
+ }`
127
+ );
128
+ howls[3].stereo(charaPan); // 特定のボーカルだけ右チャンネルに寄せる(追加したコード)
129
+ logger(
130
+ `Howlオブジェクトのstereoを変更しました: id=3, value=${charaPan}`
131
+ );
132
+ for (let j = 0; j < howls.length; j++) {
133
+ // 配列の要素数だけ繰り返す
134
+ howls[j].play(); // 再生する(Howlオブジェクトは自動的に同期される)
135
+ logger(`Howlオブジェクトを再生しました: id=${j}`);
136
+ }
137
+ }
138
+ };
139
+ for (let k = 0; k < howls.length; k++) {
140
+ // 配列の要素数だけ繰り返す
141
+ howls[k].once("load", onLoad); // 読み込み完了時にonLoad関数を実行するように設定
142
+ }
143
+ }
144
+ // 再生停止用の関数を定義(追加したコード)
145
+ function stopAll() {
146
+ for (var n = 0; n < howls.length; n++) {
147
+ // 配列の要素数だけ繰り返す
148
+ howls[n].stop(); // 停止する
149
+ howls[n].unload();
150
+ }
151
+ document.getElementById("textbox").value =
152
+ "Logger出力はここに表示されます";
153
+ logger(`stopAll関数が呼び出されました`);
154
+ }
155
+ function master_db_text_data_search(categoryNumber, idNumber) {
156
+ fetch(
157
+ "https://cdn.jsdelivr.net/gh/daydreamer-json/umm_master_db@main/json/text_data.json"
158
+ )
159
+ .then((response) => response.json())
160
+ .then((data) => {
161
+ var master_db_text_data = data;
162
+ logger(`マスターデータベースを読み込みました`);
163
+ let categoryResult = master_db_text_data.filter(function (obj) {
164
+ return obj.category === categoryNumber;
165
+ });
166
+ let integratedResult = categoryResult.filter(function (obj) {
167
+ return obj.id === idNumber;
168
+ });
169
+ return integratedResult[0];
170
+ })
171
+ .catch((error) => {
172
+ console.error(error);
173
+ return null;
174
+ });
175
+ }
176
+ function remote_file_head_test(url, id) {
177
+ fetch(url, { method: "HEAD" })
178
+ .then((response) => {
179
+ logger(
180
+ `リモートファイルへHEADしました: id=${id}, status=${response.status}`
181
+ );
182
+ })
183
+ .catch((error) => {
184
+ console.error(error);
185
+ });
186
+ }
187
+ </script>
188
+ </head>
189
+ <body>
190
+ <button onclick="playSync()" style="font-size: 24px">同期再生</button>
191
+ <button onclick="stopAll()" style="display: none">停止</button>
192
+ <br />
193
+ <input
194
+ class="inputbox"
195
+ id="liveIDBox"
196
+ type="number"
197
+ inputmode="numeric"
198
+ required
199
+ min="1001"
200
+ max="9999"
201
+ value="1036"
202
+ />
203
+ <input
204
+ class="inputbox"
205
+ id="charaIDBox1"
206
+ type="number"
207
+ inputmode="numeric"
208
+ required
209
+ min="1001"
210
+ max="9999"
211
+ value="1001"
212
+ />
213
+ <input
214
+ class="inputbox"
215
+ id="charaIDBox2"
216
+ type="number"
217
+ inputmode="numeric"
218
+ required
219
+ min="1001"
220
+ max="9999"
221
+ value="1002"
222
+ />
223
+ <input
224
+ class="inputbox"
225
+ id="charaIDBox3"
226
+ type="number"
227
+ inputmode="numeric"
228
+ required
229
+ min="1001"
230
+ max="9999"
231
+ value="1003"
232
+ />
233
+ <br />
234
+ <input
235
+ class="inputbox"
236
+ id="okeVolBox"
237
+ type="number"
238
+ inputmode="decimal"
239
+ required
240
+ min="0"
241
+ max="1"
242
+ value="1"
243
+ />
244
+ <input
245
+ class="inputbox"
246
+ id="charaVolBox1"
247
+ type="number"
248
+ inputmode="decimal"
249
+ required
250
+ min="0"
251
+ max="1"
252
+ value="0.8"
253
+ />
254
+ <input
255
+ class="inputbox"
256
+ id="charaVolBox2"
257
+ type="number"
258
+ inputmode="decimal"
259
+ required
260
+ min="0"
261
+ max="1"
262
+ value="0.6"
263
+ />
264
+ <input
265
+ class="inputbox"
266
+ id="charaPanBox"
267
+ type="number"
268
+ inputmode="decimal"
269
+ required
270
+ min="0"
271
+ max="1"
272
+ value="0.35"
273
+ />
274
+ <br />
275
+ <textarea id="textbox" style="height: 400px" readonly>Logger出力はここに表示されます</textarea>
276
+ <br />
277
+ <textarea id="urllistbox" style="height: 8em" readonly></textarea>
278
+ </body>
279
+ </html>