Skip to content

Commit 7c609ad

Browse files
committed
動的サイトにする際に備えて、パッケージを追加。そして、イコライザーのプリセット機能を実装。
1 parent ba4535b commit 7c609ad

File tree

6 files changed

+444
-15
lines changed

6 files changed

+444
-15
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"remark-gfm": "^4.0.1",
3636
"remark-parse": "^11.0.0",
3737
"remark-rehype": "^11.1.2",
38+
"serve": "^14.2.4",
3839
"shiki": "^3.4.2",
3940
"unified": "^11.0.5",
4041
"yarn": "^1.22.22"

src/app/music/[music_id]/components/player.tsx

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,39 @@ interface PlayerProps {
1818
musicList: Music[];
1919
}
2020

21+
// イコライザのプリセットを定義
22+
const equalizerPresets: { [key: string]: number[] } = {
23+
Flat: [0, 0, 0, 0, 0],
24+
Rock: [4, 2, 0, 2, 4],
25+
Pop: [2, 4, 2, -2, -4],
26+
BassBoost: [6, 4, 0, -2, -4],
27+
TrebleBoost: [-4, -2, 0, 4, 6],
28+
Jazz: [2, 0, 4, 2, 0],
29+
Classical: [0, 2, 4, 0, -2],
30+
Acoustic: [0, 4, 2, -2, -4],
31+
Dance: [4, 2, 0, 4, 6],
32+
HipHop: [2, 4, 0, -2, 0],
33+
RnB: [0, 2, 4, 2, 0],
34+
Country: [0, 0, 2, 4, 2],
35+
Blues: [0, 2, 4, 0, -2],
36+
Reggae: [2, 0, -2, 4, 6],
37+
Electronic: [4, 2, 0, -2, 0],
38+
Indie: [0, 4, 2, -2, -4],
39+
Metal: [6, 4, 0, -2, -4],
40+
Custom: [0, 0, 0, 0, 0], // Custom preset for manual adjustments
41+
};
42+
2143
export function Player({ music, musicList }: PlayerProps) {
2244
const t = useTranslations("pages.music.player");
2345
const [playState, setPlayState] = useState<"stop" | "play">("stop");
2446
const [duration, setDuration] = useState(0);
2547
const [timePosition, setTimePosition] = useState(0);
2648
const [playbackRate, setPlaybackRate] = useState(1);
27-
const [source, setSource] = useState<MediaElementAudioSourceNode | null>(
28-
null
29-
);
49+
const [source, setSource] = useState<MediaElementAudioSourceNode | null>(null);
3050
const [analyserNode, setAnalyserNode] = useState<AnalyserNode | null>(null);
3151
const [isCircular, setIsCircular] = useState(false);
32-
const [eqGains, setEqGains] = useState<number[]>([0, 0, 0, 0, 0]);
52+
const [eqGains, setEqGains] = useState<number[]>(equalizerPresets.Flat); // 初期値はFlat
53+
const [selectedPreset, setSelectedPreset] = useState<string>("Flat");
3354

3455
const audioRef = useRef<HTMLAudioElement>(null);
3556
const audioCtxRef = useRef<AudioContext | null>(null);
@@ -125,6 +146,7 @@ export function Player({ music, musicList }: PlayerProps) {
125146
filter.disconnect();
126147
});
127148
};
149+
//lint-disable-next-line
128150
}, []);
129151

130152
useEffect(() => {
@@ -214,7 +236,7 @@ export function Player({ music, musicList }: PlayerProps) {
214236
0,
215237
0
216238
);
217-
gradient.addColorStop(0, `hsla(${hue}, 100%, 50%, 0.8)`);
239+
gradient.addColorStop(0, `hsla(${hue}, 100%, 50%, 0.4)`);
218240
gradient.addColorStop(1, `hsla(${hue}, 100%, 50%, 0.2)`);
219241

220242
canvasCtx.fillStyle = gradient;
@@ -231,7 +253,6 @@ export function Player({ music, musicList }: PlayerProps) {
231253
animationFrameRef.current = requestAnimationFrame(renderFrame);
232254
};
233255

234-
// 初回描画を即座に開始
235256
renderFrame();
236257

237258
return () => {
@@ -353,6 +374,13 @@ export function Player({ music, musicList }: PlayerProps) {
353374
const newGains = [...eqGains];
354375
newGains[index] = parseFloat(e.target.value);
355376
setEqGains(newGains);
377+
setSelectedPreset("Custom"); // 手動で変更したらプリセットをCustomに
378+
};
379+
380+
const handlePresetChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
381+
const presetName = e.target.value;
382+
setSelectedPreset(presetName);
383+
setEqGains(equalizerPresets[presetName]);
356384
};
357385

358386
return (
@@ -474,7 +502,24 @@ export function Player({ music, musicList }: PlayerProps) {
474502
<details>
475503
<summary>{t("equalizer")}</summary>
476504
<div className={styles["eq-controls"]}>
505+
<div className={styles["eq-preset"]}>
506+
<label htmlFor="eqPreset">{t("preset")}</label>
507+
<select
508+
id="eqPreset"
509+
value={selectedPreset}
510+
onChange={handlePresetChange}
511+
className={styles["eq-preset-select"]}
512+
>
513+
{Object.keys(equalizerPresets).map((preset) => (
514+
<option key={preset} value={preset}>
515+
{preset}
516+
</option>
517+
))}
518+
<option value="Custom">Custom</option>
519+
</select>
520+
</div>
477521
<div className={styles["eq-slider"]}>
522+
<label>60 Hz</label>
478523
<input
479524
type="range"
480525
min="-12"
@@ -485,6 +530,7 @@ export function Player({ music, musicList }: PlayerProps) {
485530
/>
486531
</div>
487532
<div className={styles["eq-slider"]}>
533+
<label>250 Hz</label>
488534
<input
489535
type="range"
490536
min="-12"
@@ -495,6 +541,7 @@ export function Player({ music, musicList }: PlayerProps) {
495541
/>
496542
</div>
497543
<div className={styles["eq-slider"]}>
544+
<label>1 kHz</label>
498545
<input
499546
type="range"
500547
min="-12"
@@ -505,6 +552,7 @@ export function Player({ music, musicList }: PlayerProps) {
505552
/>
506553
</div>
507554
<div className={styles["eq-slider"]}>
555+
<label>4 kHz</label>
508556
<input
509557
type="range"
510558
min="-12"
@@ -515,6 +563,7 @@ export function Player({ music, musicList }: PlayerProps) {
515563
/>
516564
</div>
517565
<div className={styles["eq-slider"]}>
566+
<label>16 kHz</label>
518567
<input
519568
type="range"
520569
min="-12"
@@ -567,4 +616,4 @@ export function Player({ music, musicList }: PlayerProps) {
567616
</section>
568617
</div>
569618
);
570-
}
619+
}

src/app/music/[music_id]/page.module.css

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@
146146
left: 50%;
147147
z-index: 0;
148148
border: none;
149-
opacity: 0.25;
149+
opacity: 0.75;
150150
mix-blend-mode: screen;
151151
}
152152

@@ -290,7 +290,7 @@
290290
display: flex;
291291
flex-direction: column;
292292
align-items: center;
293-
width: 80px;
293+
width: 240px;
294294
}
295295

296296
/* 周波数値のスタイル */

src/i18n/en/common.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"artist": "Artist",
4949
"duration": "Duration",
5050
"equalizer": "Equalizer",
51+
"preset": "Preset",
5152
"browserNotSupported": "Your browser does not support audio playback."
5253
}
5354
}

src/i18n/ja/common.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"artist": "アーティスト",
4949
"duration": "時間",
5050
"equalizer": "イコライザ",
51+
"preset": "プリセット",
5152
"browserNotSupported": "お使いのブラウザは音声再生に対応していません。"
5253
}
5354
}

0 commit comments

Comments
 (0)