2026, 새로운 도약을 시작합니다.

음악에 맞게 가사의 색상변경

2106540763_1737737151.8317.png

음악을 재생할 때 음악에 맞추어서 노래가사의 색상이 변경되도록 만들어보았습니다.

json으로 가사의 시작점과 끝점을 만들어야 한다는 점이 번거롭기는 합니다.

감사합니다.

 [code]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Lyrics Player</title>
    <style>
        /* 기본 스타일 */
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 20px;
            background-color: #f0f0f0;
            text-align: center;
        }

        audio {
            width: 100%;
            max-width: 600px;
            margin-top: 20px;
            outline: none;
        }

        #lyricsContainer {
            margin-top: 20px;
            padding: 10px;
            background-color: white;
            border-radius: 10px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
            max-width: 800px;
            margin-left: auto;
            margin-right: auto;
        }

        .lyrics {
            font-size: 1.5rem; /* 기본 폰트 크기 */
            margin: 10px 0;
            color: #333;
            transition: all 0.3s ease-in-out;
        }

        .active {
            color: red;
            font-size: 2rem;
            font-weight: bold;
        }

        /* 반응형 디자인 */
        @media (max-width: 768px) {
            .lyrics {
                font-size: 1.2rem;
            }

            .active {
                font-size: 1.8rem;
            }

            body {
                padding: 10px;
            }
        }

        @media (max-width: 480px) {
            .lyrics {
                font-size: 1rem;
            }

            .active {
                font-size: 1.5rem;
            }

            audio {
                width: 100%;
            }

            #lyricsContainer {
                padding: 5px;
            }
        }
    </style>
</head>
<body>
    <audio id="audio" controls>
        <source src="sample.mp3" type="audio/mpeg">
        Your browser does not support the audio element.
    </audio>
    <div id="lyricsContainer"></div>

    <script>
        document.addEventListener("DOMContentLoaded", () => {
            const audio = document.getElementById("audio");
            const lyricsContainer = document.getElementById("lyricsContainer");

            // JSON 데이터를 직접 포함
            const lyrics = [
                { "line": "바람도 차가운날 저녁에", "startTime": 1.342, "endTime": 6.255 },
                { "line": "그이와 단둘이서 만났네", "startTime": 6.436, "endTime": 10.289 },
                { "line": "정답던 이시간이 지나면", "startTime": 10.861, "endTime": 15.227 },
                { "line": "나 혼자 떠나 가야해", "startTime": 15.884, "endTime": 20.271 },
                { "line": "거리엔 가로등불 하나 둘", "startTime": 21.136, "endTime": 24.819 },
                { "line": "어둠은 불빛속에 내리고", "startTime": 25.649, "endTime": 29.686 },
                { "line": "정답던 이 시간이 지나면", "startTime": 30.69, "endTime": 34.431 },
                { "line": "나 혼자 떠나 가야해", "startTime": 35.587, "endTime": 38.462 },
                { "line": "그대여 그대여 울지말아요", "startTime": 39.894, "endTime": 43.781 },
                { "line": "사랑은 사랑은 슬픈거래요", "startTime": 44.512, "endTime": 48.481 },
                { "line": "그대여 그대여 나를 보세요 그리고 웃어요", "startTime": 48.99, "endTime": 58.278 }
            ];

            // 가사를 화면에 표시
            lyrics.forEach(line => {
                const div = document.createElement("div");
                div.className = "lyrics";
                div.textContent = line.line;
                div.dataset.startTime = line.startTime;
                div.dataset.endTime = line.endTime;
                lyricsContainer.appendChild(div);
            });

            // 재생 시간에 맞춰 가사 색상 변경
            audio.addEventListener("timeupdate", () => {
                const currentTime = audio.currentTime;

                document.querySelectorAll(".lyrics").forEach(div => {
                    const startTime = parseFloat(div.dataset.startTime);
                    const endTime = parseFloat(div.dataset.endTime);

                    if (currentTime >= startTime && currentTime < endTime) {
                        div.classList.add("active");
                    } else {
                        div.classList.remove("active");
                    }
                });
            });
        });
    </script>
</body>
</html>

[/code]

json

[code][
  {
    "line": "바람도 차가운날 저녁에",
    "startTime": 1.342,
    "endTime": 6.255 
  },
  {
    "line": "그이와 단둘이서 만났네",
    "startTime": 6.436,
    "endTime": 10.289
  },
  {
    "line": "정답던 이시간이 지나면",
    "startTime": 10.861,
    "endTime": 15.227
  },
  {
    "line": "나 혼자 떠나 가야해",
    "startTime": 15.884,
    "endTime": 20.271
  },
  {
    "line": "거리엔 가로등불 하나 둘",
    "startTime": 21.136,
    "endTime": 24.819
  },
  {
    "line": "어둠은 불빛속에 내리고",
    "startTime": 25.649,
    "endTime": 29.686
  },
  {
    "line": "정답던 이 시간이 지나면",
    "startTime": 30.690,
    "endTime": 34.431
  },
  {
    "line": "나 혼자 떠나 가야해",
    "startTime": 35.587,
    "endTime": 38.462
  },
  {
    "line": "그대여 그대여 울지말아요",
    "startTime": 39.894,
    "endTime": 43.781 
  },
  {
    "line": "사랑은 사랑은 슬픈거래요",
    "startTime": 44.51 2,
    "endTime": 48.481
  },
  {
    "line": "그대여 그대여 나를 보세요 그리고 웃어요",
    "startTime": 48.990,
    "endTime": 58.278
  }  
]
[/code]

첨부파일

music.zip (1.8 MB) 12회 2025-01-25 01:50
|

댓글 5개

수고하셨습니다.

@glitter0gim

관심을 가져주셔서 감사드립니다^^

좋습니다. 감사합니다. !!

@teemall

격려의 댓글을 남겨주셔서 감사드립니다.^^

가사 추출 프로그램은

https://blog.naver.com/silhwan5125/100112135812

가 최고입니다.

단지 추출된 문자열을 json 형식으로 모든 가사를 "한번에" 바꾸려면 정규표현식으로 파싱질을 해야 하지만 개별로 바꾸려면 나름대로 괜찮을 거에요.

추천 

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

개발자팁

개발과 관련된 유용한 정보를 공유하세요.
질문은 QA에서 해주시기 바랍니다.
번호 분류 제목 글쓴이 날짜 조회
5402 MySQL 6일 전 조회 21
5401 JavaScript 3주 전 조회 117
5400 MySQL 1개월 전 조회 223
5399 PHP 2개월 전 조회 470
5398 PHP 2개월 전 조회 353
5397 PHP 2개월 전 조회 286
5396 기타 5개월 전 조회 559
5395 PHP 6개월 전 조회 1,196
5394 MySQL 7개월 전 조회 793
5393 웹서버 9개월 전 조회 985
5392 1년 전 조회 1,310
5391 11개월 전 조회 1,320
5390 11개월 전 조회 1,114
5389 10개월 전 조회 1,030
5388 10개월 전 조회 1,170
5387 9개월 전 조회 963
5386 JavaScript 9개월 전 조회 1,148
5385 웹서버 9개월 전 조회 1,169
5384 JavaScript 10개월 전 조회 991
5383 기타 11개월 전 조회 1,417
5382 기타 11개월 전 조회 661
5381 JavaScript 11개월 전 조회 1,075
5380 기타 11개월 전 조회 834
5379 JavaScript 11개월 전 조회 831
5378 1년 전 조회 1,397
5377 기타 1년 전 조회 941
5376 jQuery 1년 전 조회 639
5375 jQuery 1년 전 조회 871
5374 기타 1년 전 조회 949
5373 MySQL 1년 전 조회 980
🐛 버그신고