-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcompress.js
More file actions
81 lines (73 loc) · 2.96 KB
/
compress.js
File metadata and controls
81 lines (73 loc) · 2.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// 音声圧縮処理を行うためのWorker
importScripts("signal.js");
importScripts("codec.js");
self.addEventListener("message", (message) => {
// パラメータ取得
let sampleRate = message.data["sampleRate"];
let channelSize = message.data["numChannels"];
let frequencyRange = message.data["frequencyRange"];
let frequencyUpperLimit = message.data["frequencyUpperLimit"];
let frequencyTableSize = message.data["frequencyTableSize"];
let originalSampleRate = message.data["originalSampleRate"];
let originalChannelSize = message.data["originalChannelSize"];
let originalSampleData = message.data["originalSampleData"];
let originalSampleCount = originalSampleData[0].length;
let sampleCount = originalSampleCount;
// サンプリングレートが元データと異なる場合
if (sampleRate < originalSampleRate) {
// 減らす場合
let times = originalSampleRate / sampleRate;
sampleCount = Math.floor(sampleCount / times);
for (let i = 0; i < originalChannelSize; ++i) {
let samples = originalSampleData[i];
for (let j = 0; j < originalSampleCount; ++j) {
samples[j] = samples[Math.floor(j * times)];
}
}
} else if (sampleRate > originalSampleRate) {
// 増やす場合、増やさない
sampleRate = originalSampleRate;
}
// チャネル数が元データと異なる場合
if (channelSize == 1 && originalChannelSize == 2) {
// 減らす場合
let left = originalSampleData[0];
let right = originalSampleData[1];
for (let i = 0; i < sampleCount; ++i) {
left[i] += right[i];
}
} else if (channelSize > sampleCount) {
// 増やす場合、増やさない
channelSize = originalChannelSize;
}
console.log(`encoding`);
console.log(`sample rate ${sampleRate}`);
console.log(`channel size ${channelSize}`);
console.log(`frequency range ${frequencyRange}`);
console.log(`frequency upper limit ${frequencyUpperLimit}`);
console.log(`frequency table size ${frequencyTableSize}`);
console.log(`sample count ${sampleCount}`);
// エンコード
let encoder = new wamCodec.WamEncoder(
sampleRate, channelSize,
frequencyRange, frequencyUpperLimit, frequencyTableSize,
sampleCount);
for (let k = 0; k < (sampleCount / frequencyRange) - 1; ++k) {
encoder.write(originalSampleData, frequencyRange * k, Math.min(frequencyRange, sampleCount - frequencyRange * (k + 1)));
self.postMessage({
"kind": "update",
"progress": (k * frequencyRange) / sampleCount
});
}
encoder.flush();
self.postMessage({
"kind": "update",
"progress": 1.0
});
// 結果を返す
let encodedBuffer = encoder.getDataBuffer();
self.postMessage({
"kind": "completed",
"encodedBuffer": encodedBuffer,
}, [encodedBuffer]);
});