Как сделать общую функцию для переключение музыки и блоков

Здраствуйте, хочу сделать общую функцию, которая будет включать треки по нажатию на плей, после того как был произведен клик по кнопки play, то сразу же появляется кнопка pause на которую можно нажать и песня остановиться, также появляется вновь кнопка play и можно продолжить песню где была нажата пауза. На скрине я показал, как работают кнопки переключение, при нажатие на кнопку right блок приобретает display:none и на место это картинки становится следующая песня*(выделил синим цветом), после появление следующего блока нажимаем на right и снова блок пропадает и становится на его место(красным цветом)* следующий и.т.д. Желтым цветом выделил если нажимаете на кнопку left (предыдущий трек), то она возвращает предыдущий блок с песней. Наверно это все по функционалу, мне удалось воплотить кнопку плей, стоп, даже переключатели, но для этого приходиться прописывать много функций, можете подсказать, как добиться подобного функционала одной, двумя, тремя функциями. Также я не знаю как вставить полностью код, чтобы все мои картинки были на месте, т.к у картинок нет url адреса при добавление кода непонятно что получается. Я исправил HTML и JS, пока ожидал ответа и пытался все таки сделать через миллион функций на каждую фотку, нашел более премиальный способ

const tracks = [
    {
        track: 'Групи',
        artist: 'Платина & OG Buda',
        duration: '3:00',
        image: 'img/track_list/gruppy.jpg',
    },
    {
        track:'Как в первый раз',
        artist: 'Платина',
        duration: '3:04',
        image: 'img/track_list/kak_v_perviy_raz.jpg',
    },
    {
        track:'Ламбо',
        artist: 'Платина & FEDUK',
        duration: '3:28',
        image: 'img/track_list/lambo.jpg',
    },
    {
        track:'Валентина',
        artist: 'Платина',
        duration: '2:32',
        image: 'img/track_list/valentina.jpg',
    },
    {
        track:'Навсегда (feat. White Punk)',
        artist: 'Платина',
        duration: '2:13',
        image: 'img/track_list/navsegda.jpg',
    },
    {
        track:'На грязном (Диана)',
        artist: 'Платина',
        duration: '2:06',
        image: 'img/track_list/diana.jpg',
    },
    {
        track:'Salam',
        artist: 'Платина',
        duration: '2:41',
        image: 'img/track_list/salam_jpg.jpg',

    },
    {
        track:'Abu Dhabi Ba6y',
        artist: 'Платина & OG Buda & MAYOT',
        duration: '3:00',
        image: 'img/track_list/dhabi.jpg',
    },
]


const container = document.querySelector('.cards');  //возвращает первый элемент (Element) документа, который соответствует указанному селектору или группе селекторов. Если совпадений не найдено, возвращает значение null.
const song = document.getElementById('song-template'); //возвращает ссылку на элемент по его идентификатору (ID); идентификатор является строкой, которая может быть использована для идентификации элемента; она может быть определена при помощи атрибута id в HTML или из скрипта.

const getTemplate = () => {
    const song = document.getElementById('song-template')
        .content.cloneNode(true);  //возвращает дубликат узла, из которого этот метод был вызван
        return song
}

const generateSong = ({data, element}) => {
    element.querySelector('.track').textContent = data.track;  //возвращает первый элемент, являющийся потомком элемента, на который применено правило указанной группы селекторов.
    element.querySelector('.artist').textContent = data.artist;
    element.querySelector('.end_track').textContent = data.duration;
    element.querySelector('.track_image').src = data.image;


    return element;
}

tracks.forEach((track) => {
    const template = getTemplate();
    const song = generateSong({data: track, element: template});
    container.appendChild(song);  //добавляет узел в конец списка дочерних элементов указанного родительского узла. Если данный дочерний элемент является ссылкой на существующий узел в документе, то функция appendChild() перемещает его из текущей позиции в новую позицию (нет необходимости удалять узел из родительского узла перед добавлением его к какому-либо другому узлу).
})
/* стили гугл */
@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400&family=Staatliches&display=swap');

@import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@600;700&display=swap');

@import url('https://fonts.googleapis.com/css2?family=Indie+Flower&display=swap');


* {
    padding: 0;
    margin: 0;

}

/* начало - менюшки */
/* header img{
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    padding: 0px;
    

    position: absolute;
    width: 50px;
    height: 50px;
    left: 20px;
    top: 40px;
} */
/* конец - менюшки */


/* начало левый бар с ссылками */

/* начало кнопки - музыка */

.music_platina {
    position: absolute;
    top: -80px;

}

.music_platina a {
    font-family: 'Montserrat', sans-serif;
    font-size: 20px;
    text-decoration: none;
    color: black;
    text-transform: uppercase;
    line-height: 1.2;
}


/* конец кнопки - музыка */

.left_bar_social {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    padding: 0px;

    position: absolute;
    left: 40px;
    top: 120px;
}

.left_bar_social img {
    width: 30px;
    height: 30px;
    padding-bottom: 70px;
}

/* начало концерты */

.concert_artist a {
    font-family: 'Montserrat', sans-serif;
    font-size: 20px;
    text-decoration: none;
    text-transform: uppercase;
    line-height: 1.2;
    color: black;

    padding-top: 0px;
}

/* конец концерты  */

/* конец - левый бар с ссылками */



.wrapper {
    width: 100%;
    aspect-ratio: 3 / 2;
    position: relative;
    overflow: hidden;
    background: linear-gradient(90deg, #9e9e9e 0%, #ffffff 30%, #6a6a6a 100%);
}

/* надпись - имя, дата */
.info_artist {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    padding: 0px;

    -webkit-text-fill-color: transparent;
    background: -webkit-linear-gradient(transparent, transparent), url(https://thumbs.gfycat.com/ReadyFarawayLeopard-size_restricted.gif) repeat;
    background: -o-linear-gradient(transparent, transparent);
    -webkit-background-clip: text;

    position: absolute;
    width: 812px;
    height: 258px;
    left: 160px;
    top: 100px;
}

.name_artist {
    width: 394px;
    height: 95px;


    font-family: 'Indie Flower', cursive;
    font-weight: 600;
    font-style: normal;
    font-size: 60px;
    text-transform: uppercase;
}

/* .date_concert_artist {
    width: 334px;
    height: 91px;

    font-family: 'Circular Std';
    font-style: normal;
    font-weight: 400;
    font-size: 35px;
    line-height: 40px;
} */

/* конец - надпись имя, дата */


/* начало - скрины треков */
.cards {
    display: flex;
    flex-wrap: wrap;
    width: 1915px;
    text-align: center;
    transform: translateX(29%) translateY(-25%) rotateX(50deg) rotateZ(330deg) skewX(19deg) skewY(350deg);
}

.cards .tracks_list>img {
    display: inline-block;
    width: 350px;
    border-radius: 30px;
    margin-top: 40px;
    margin-bottom: 20px;

}

.cards>* {
    display: inline-block;
    width: 400px;
    aspect-ratio: 1 / 2;
    margin-right: 10px;
    border-radius: 30px;
    margin-bottom: 20px;
}


.cards>*:nth-child(1) {
    background: linear-gradient(0deg, #000000 0%, #000000 0%, #42353c 40%);
}

.cards>*:nth-child(2) {
    background: linear-gradient(0deg, #000000 0%, #000000 0%, #382239 40%);
}

.cards>*:nth-child(3) {
    background: linear-gradient(0deg, #000000 0%, #000000 0%, #312829 40%);
}

.cards>*:nth-child(4) {
    background: linear-gradient(0deg, #000000 0%, #000000 0%, #382239 40%);
}

.cards>*:nth-child(5) {
    background: linear-gradient(0deg, #000000 0%, #000000 0%, #2b1c2f 70%);
}

.cards>*:nth-child(6) {
    background: linear-gradient(0deg, #000000 0%, #000000 0%, #311e20 70%);
}

.cards>*:nth-child(7) {
    background: linear-gradient(0deg, #000000 0%, #000000 0%, #272c54 70%);
}

.cards>*:nth-child(8) {
    background: linear-gradient(0deg, #000000 0%, #000000 0%, #6a6a6c 70%);
}


/* .cards img>*:nth-child(7) {
    background: linear-gradient(0deg, #000000 0%, #000000 40%, #3f2722 100%);
 }

 .cards img>*:nth-child(8) {
    background: linear-gradient(0deg, #000000 0%, #000000 40%, #3f2722 100%);
 }  */

/* конец - скрины треков


@import url('https://fonts.googleapis.com/css2?family=Meera+Inimai&display=swap');
/*шрифт для название песни */

/* начало - верстка самого плеера */

.name_container {
    display: inline-block;
    margin-bottom: 30px;
    /* margin-right: 140px; */
}

.track {
    font-family: 'Meera Inimai', sans-serif;
    font-size: 19px;
    color: #f6eef3;
}

.artist {
    font-family: 'Meera Inimai', sans-serif;
    font-size: 19px;
    color: #a99ba6;
}

/* начало - прогресс бар */

.progress_bar{
    width: 300px;
    margin-left: 30px;
}



/* .progress_bar {
    display: flex;
    margin-left: 30px;

    width: 340px;
    height: 5px;
    border-radius: 5px;
    background-color: #fff;
    margin-bottom: 10px;
}

.progress_bar::after {
    display: flex;
    justify-content: start;
    content: '';
    transform: translateY(-50%);
    width: 20px;
    height: 20px;
    background: rgba(255, 255, 255, 1);
    filter: drop-shadow(0px 0px 4px rgba(46, 45, 45, 1));
    border-radius: 50%;
    box-sizing: border-box;
}

.progress_bar::before {
    display: flex;
    justify-content: start;
    content: '';
    transform: translateY(-50%);
    height: 5px;
    background: rgba(255, 255, 255, .3);
    border-radius: 5px;
    z-index: -1;
} */


/* конец - прогресс бар */

/* начало - тайминги */
.time_bar {
    display: flex;
    justify-content: space-between;

    margin-top: 15px;
    margin-bottom: 30px;
    margin-left: 30px;
    margin-right: 30px;
    color: #a99ba6;
}

.start_track {
    font-family: 'Meera Inimai', sans-serif;
    font-size: 17px;
}

.end_track {
    font-family: 'Meera Inimai', sans-serif;
    font-size: 17px
}

/* конец - тайминги */

/* начало панели переключение */

.panel_players {
    display: flex;
    justify-content: space-around;
    flex-flow: row nowrap;
    margin-left: 10px;
    margin-bottom: 50px;
}

/* .panel_players img {
    -webkit-filter: blur(3px);
    filter: blur(3px);
    -webkit-transition: .3s ease-in-out;
    transition: .3s ease-in-out;
} */

/* .panel_players:hover img {
    -webkit-filter: blur(0);
    filter: blur(0);
} */

.pause_active {
    display: none;
    /* max-width: 50px;
    padding: 40px */
}

.left_button img {
    max-width: 50px;
    padding: 40px;

    -webkit-transform: scale(1);
    transform: scale(1);
    -webkit-transition: .3s ease-in-out;
    transition: .3s ease-in-out;
}

.left_button:hover img{
    -webkit-transform: scale(1.3);
    transform: scale(1.3);
}


.play_button img {
    max-width: 50px;
    padding: 30px;

    -webkit-transform: scale(1);
    transform: scale(1);
    -webkit-transition: .3s ease-in-out;
    transition: .3s ease-in-out;
}

.play_button:hover img {
    -webkit-transform: scale(1.3);
    transform: scale(1.3);
}


.right_button img {
    max-width: 50px;
    padding: 35px;

    -webkit-transform: scale(1);
    transform: scale(1);
    -webkit-transition: .3s ease-in-out;
    transition: .3s ease-in-out;
}

.right_button:hover img {
    -webkit-transform: scale(1.3);
    transform: scale(1.3);
}



/* конец панели переключение */

/*  старт - громкость */

.panel_volume{
    padding-top: 8px;
}

.panel_volume input[type="range"] {
    display: block;
    -webkit-appearance: none;
    background-color: #bdc3c7;
    width: 250px;
    height: 5px;
    border-radius: 5px;
    margin: 0 auto;
    outline: 0;
}

.panel_volume input[type="range"]::-webkit-slider-thumb {
    -webkit-appearance: none;
    background-color: #303331;
    width: 15px;
    height: 15px;
    border-radius: 50%;
    border: 2px solid white;
    cursor: pointer;
    transition: .4s ease-in-out;

}

.panel_volume input[type="range"]::-webkit-slider-thumb:hover {
    background-color: #000000;
}

.panel_volume input[type="range"]::-webkit-slider-thumb:active {
    transform: scale(1.6);
}

/* конец - громкость */

.volume_regulator {
    position: relative;
    display: flex;
    justify-content: space-around;
    bottom: 15px;
}

.right_volume img {
    max-width: 20px;
    position: relative;
    right: 15px;
}

.left_volume img {
    max-width: 20px;
    position: relative;
    left: 15px;
}


.progress_bar input[type="range"] {
    display: block;
    -webkit-appearance: none;
    background-color: #bdc3c7;
    width: 350px;
    height: 5px;
    border-radius: 5px;
    margin: 0 auto;
    outline: 0;
}

.progress_bar input[type="range"]::-webkit-slider-thumb {
    -webkit-appearance: none;
    background-color: white;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    border: 2px solid white;
    cursor: pointer;
    transition: .4s ease-in-out;

}

​.progress_bar input [type="range"]::-webkit-slider-thumb:hover {
    background-color: #000000;
}

.progress_bar input[type="range"]::-webkit-slider-thumb:active {
    transform: scale(1.6);
}


/* группи */
.some_play_gruppy{
    display: block;
}

.some_pause_gruppy{
    display: none;
}
/* группи */

.Dnone{
    display: none;
}
.Dblock{
    display: block;
}


/* как в первый раз */

/* как в первый раз */

/* конец - верстка самого плеера */
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/style.css">
    <title>Платина</title>
</head>
<body>
    <div class="wrapper">
        <!-- <header>
            <img src="img/b/b_bedolaga.png" alt="">
        </header> -->


        <div class="left_bar_social">
            <div class="music_platina">
                <a href="#">МУЗЫКА</a>
            </div>

            <a href="https://vk.com/platinarnbklub" target="_blank"><img src="img/social/vk.png" alt="vk"></a>
            <a href="https://www.instagram.com/platina300/?hl=ru" target="_blank"><img src="img/social/insta.png" alt="insta"></a>
            <a href="https://www.youtube.com/c/%D0%9F%D0%BB%D0%B0%D1%82%D0%B8%D0%BD%D0%B0300" target="_blank"><img src="img/social/youtube.png" alt="youtube"></a>
            <a href="https://t.me/sosamuzik300" target="_blank"><img src="img/social/telegram.png" alt="telegram"></a>
            <a href="https://music.apple.com/ru/artist/%D0%BF%D0%BB%D0%B0%D1%82%D0%B8%D0%BD%D0%B0/1309211809" target="_blank"><img src="img/social/apple_music.png" alt="apple music"></a>

            <div class="concert_artist">
                <a target="_blank" href="concert_platina/concert_platina.html">КОНЦЕРТЫ</a>
            </div>
        </div>

        <div class="info_artist">
                <div class="name_artist">
                    <p>ПЛАТИНА</p>
                </div>

                <!-- <div class="date_concert_artist">
                    <p>16.10.2022 MOSCOW</p>
                </div> -->
        </div>
        <!-- скрины треков -->
        <div class="cards">

            </div>
        </div>
    
            
        



        <template id="song-template">
            <div class="tracks_list" id="track-play-gruppy">
                <img class="track_image" src="img/track_list/gruppy.jpg" alt="">
                <div class="name_container">
                    <div class="track">Групи</div>
                    <div class="artist">Платина & OG Buda</div>
                </div>
                <div class="progress_bar">
                        <input class="song" type="range" min='0 'max="100" >
                </div>
                <div class="time_bar">
                    <div class="music-progress__time-item music-current-time start_track">0:00</div>
                    <div class="music-progress__time-item music-duration-time end_track">3:11</div>
                </div>
                <div class="panel_players">
                    <div class="left_button">
                        <img src="img/button/left.png" alt="left">
                    </div>
                    <div class="play_button">
                        <img class='pause_active' id="some_pause_gruppy" src="img/button/pause.png"  alt="" >
                        <img class='play_active' id="some_play_gruppy"  src="img/button/play.png" alt="">
                    </div>
                    <div class="right_button">
                        <img  id="right-next-track" src="img/button/right.png" alt="">
                    </div>
                </div>

                <div class="volume_regulator">
                    <div class="left_volume">
                    <img src="img/button/volume-mute.png" alt="">
                    </div>
                    <div class="panel_volume">
                        <input type="range" min='0 'max="100" >
                    </div>
                        <div class="right_volume">
                    <img src="img/button/volume-up.png" alt="">
                    </div>
                </div>
            
            </div>
        </template>






    
            
            <audio id= "Grupy" src="mp3/grupy.mp3" controls ></audio>
            <audio id= "KakPerviyRaz" src="mp3/platina_kak_v_perviy_raz.mp3" controls></audio>
            <audio id= "Lambo" src="mp3/lambo.mp3"></audio>





    
<script src="js/app.js"></script>
</body>
</html>

Заранее спасибо огромное.
функционал


Ответы (3 шт):

Автор решения: Опан

У Вас не только одинаковые функции с разными именами для каждого блока, но даже в каждом блоке отдельный плеер. (правда, в коде этих плееров нет, но на них ссылаются) Можно сделать так, чтобы плеер был только один, и блок тоже один и всегда видимый, а во время переключения треков будет соответственно меняться src плеера. Функций достаточно две - одна переключает треки, вторая нажимает и отжимает кнопку play/pause:

<style>button{width: 70px; cursor: pointer;}</style>
<audio id=audio controls onended='rightButton.click()'></audio><br /><br />
<button id=playPauseButton>play</button>
<button id=leftButton> << </button>
<button id=rightButton> >> </button>
<pre id=title>track1.mp3</pre>
<script>
let array = ['track1.mp3', 'track2.mp3', 'track3.mp3', 'track4.mp3', 'track5.mp3', 'track6.mp3', 'track7.mp3'];
let url = 'https://mysynthesizer.github.io/index.hetemeel/';
audio.src = url + 'track1.mp3';
let index = 0;
rightButton.onclick = function(){selecting_track(1)};
leftButton.onclick = function(){selecting_track(-1)};
function selecting_track(direction){
    index += direction;
    if(index >= array.length) index = 0;
    if(index < 0) index = array.length - 1;
    audio.src = url + array[index];
    audio.play();
    playPauseButton.innerText = 'pause';
    title.innerText = array[index];
     // ... тут меняем надписи на элементах ...
}
playPauseButton.onclick = function(){
    if(audio.paused){
        audio.play();
        this.innerText = 'pause';
    }else{
        audio.pause();
        this.innerText = 'play';
    }
}
</script>

Это упрощённая рабочая схема, как не делать много одинаковых блоков и функций. Ориентируйтесь по ней.

→ Ссылка
Автор решения: De.Minov

Как вариант.

Нет времени описывать механику, если потребуется дополню ответ

console.clear();

const audio = {
    playlist: {},
    played: null,
    dir: 'https://mysynthesizer.github.io/index.hetemeel/',
    format: '.mp3',
}

const parent = document.querySelector('.player-grid');

// INIT
[...parent.querySelectorAll('.player-card')].map(card => {
    const track = card.dataset.track;
    const time = card.querySelector('.player-card__control-time--full');
    const tmp = new Audio(audio.dir+track+audio.format);
    tmp.id = track
    tmp.load();
    audio.playlist[track] = tmp;
    
    tmp.addEventListener('loadeddata', () => {
        if(tmp.readyState >= 2) {
            time.textContent = FormatTime(tmp.duration);
            card.classList.remove('player-card--loaded');
        }
    });
})

// BTNS
parent.addEventListener('click', e => {
    const target = e.target.closest('.player-card__control-btn');
    if(target) {
        const card = target.closest('.player-card');
        const track = card.dataset.track;
        // PLAY
        if(target.classList.contains('player-card__control-btn--play')) {
            if(audio.played === null || audio.played.id !== track) {
                audio.played = audio.playlist[track];
                audio.played.currentTime = 0;
                audio.played.volume = .25
                audio.played.addEventListener('timeupdate', e => {
                    const cur = e.target.currentTime;
                    const full = e.target.duration;
                    card.querySelector('.player-card__control-duration').style.setProperty('--pos', (cur / full * 100));
                    card.querySelector('.player-card__control-time--cur').textContent = FormatTime(cur);
                })
            }
            audio.played.play();
            
            target.classList.remove('player-card__control-btn--play')
            target.classList.add('player-card__control-btn--pause')
            target.querySelector('.material-symbols-outlined').textContent = 'pause'
        } else 
        // PAUSE
        if(target.classList.contains('player-card__control-btn--pause')) {
            if(audio.played !== null) audio.played.pause();
            target.classList.remove('player-card__control-btn--pause')
            target.classList.add('player-card__control-btn--play')
            target.querySelector('.material-symbols-outlined').textContent = 'play_arrow'
        }
        if(target.classList.contains('player-card__control-btn--prev') || target.classList.contains('player-card__control-btn--next')) {
            if(card.querySelector('.player-card__control-btn--pause')) card.querySelector('.player-card__control-btn--pause').click();
            const cards = card.parentElement.children;
            const newCard = target.classList.contains('player-card__control-btn--prev') ? (
                card.previousElementSibling || cards[cards.length - 1]
            ) : (
                card.nextElementSibling || cards[0]
            );
            newCard.querySelector('.player-card__control-btn--play').click();
        }
    }
});

function FormatTime(_sec) {
    _sec = Math.floor(_sec)
    let min = Math.floor(_sec / 60),
            sec = _sec - min * 60;
    return `${min}:${(''+sec).padStart(2, '0')}`
}
.player {
  display: block;
  width: 100%;
  overflow: hidden;
}

.player-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 20px 10px;
  transform-origin: left bottom;
  transform: translateY(7.5%) perspective(900px) rotateX(15deg) rotateZ(-30deg) translateX(100%);
}

.player-card {
  display: block;
  width: 100%;
  border-radius: 15px;
  overflow: hidden;
  color: #fff;
  position: relative;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

.player-card--loaded {
  pointer-events: none;
}

.player-card--loaded::before {
  content: '';
  display: block;
  width: 50px;
  height: 50px;
  border-radius: 50%;
  border: 4px solid rgba(255, 255, 255, 0.5);
  border-top-color: #fff;
  position: absolute;
  margin: -25px;
  left: 50%;
  top: 50%;
  z-index: 10;
  -webkit-animation: loading 1s ease infinite;
  animation: loading 1s ease infinite;
}

.player-card__bg {
  display: block;
  width: 100%;
  height: 100%;
  background-color: #000;
  position: absolute;
  left: 0;
  top: 0;
  z-index: 1;
}

.player-card__bg::before {
  content: '';
  display: block;
  width: 100%;
  height: 100%;
  background: var(--image) no-repeat center center/cover;
  filter: blur(100px);
}

.player-card>*:not(.player-card__bg) {
  position: relative;
  z-index: 2;
}

.player-card__image {
  display: block;
  padding: 20px;
}

.player-card__image img {
  display: block;
  width: 100%;
  height: 100%;
  border-radius: 10px;
  -o-object-fit: cover;
  object-fit: cover;
}

.player-card__info {
  display: block;
  width: 100%;
  text-align: center;
  padding: 0 20px;
  margin-bottom: 10px;
  box-sizing: border-box;
}

.player-card__info-name {
  font-weight: bold;
  color: #fff;
  margin-bottom: 5px;
}

.player-card__info-artist {
  opacity: 0.65;
}

.player-card__control {
  display: block;
  width: 100%;
  padding: 0 20px 20px;
  box-sizing: border-box;
}

.player-card__control-duration {
  display: block;
  width: 100%;
  height: 3px;
  border-radius: 90px;
  background-color: #fff;
  margin: 15px 0;
  position: relative;
}

.player-card__control-duration::before {
  content: '';
  display: block;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background-color: #fff;
  position: absolute;
  left: calc(var(--pos, 0) * 1%);
  top: 50%;
  transform: translateY(-50%);
}

.player-card__control-time {
  display: flex;
  justify-content: space-between;
  align-items: center;
  width: 100%;
  font-size: 80%;
}

.player-card__control-btns {
  display: flex;
  justify-content: space-around;
  align-items: center;
  margin: 25px 0;
}

.player-card__control-btn {
  display: block;
  width: auto;
  cursor: pointer;
}

.player-card__control-btn--prev .material-symbols-outlined,
.player-card__control-btn--next .material-symbols-outlined {
  font-size: 50px;
}

.player-card__control-btn--play .material-symbols-outlined,
.player-card__control-btn--pause .material-symbols-outlined {
  font-size: 70px;
}

@-webkit-keyframes loading {
  to {
    transform: rotate(360deg);
  }
}

@keyframes loading {
  to {
    transform: rotate(360deg);
  }
}
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@48,100,1,0" />
<div class="player">
  <div class="player-grid">
    <div class="player-card player-card--loaded" data-track="track1">
      <div class="player-card__bg" style="--image: url(//i.imgur.com/k26l4bs.jpg)"></div>
      <div class="player-card__image"><img src="//i.imgur.com/k26l4bs.jpg" /></div>
      <div class="player-card__info">
        <div class="player-card__info-name">TRACK NAME</div>
        <div class="player-card__info-artist">ARTIST</div>
      </div>
      <div class="player-card__control">
        <div class="player-card__control-duration"></div>
        <div class="player-card__control-time">
          <div class="player-card__control-time--cur">0:00</div>
          <div class="player-card__control-time--full">0:00</div>
        </div>
        <div class="player-card__control-btns">
          <div class="player-card__control-btn player-card__control-btn--prev"><span class="material-symbols-outlined">skip_previous</span></div>
          <div class="player-card__control-btn player-card__control-btn--play"><span class="material-symbols-outlined">play_arrow</span></div>
          <div class="player-card__control-btn player-card__control-btn--next"><span class="material-symbols-outlined">skip_next</span></div>
        </div>
      </div>
    </div>
    <div class="player-card player-card--loaded" data-track="track2">
      <div class="player-card__bg" style="--image: url(//i.imgur.com/8dhmWEh.jpg)"></div>
      <div class="player-card__image"><img src="//i.imgur.com/8dhmWEh.jpg" /></div>
      <div class="player-card__info">
        <div class="player-card__info-name">TRACK NAME</div>
        <div class="player-card__info-artist">ARTIST</div>
      </div>
      <div class="player-card__control">
        <div class="player-card__control-duration"></div>
        <div class="player-card__control-time">
          <div class="player-card__control-time--cur">0:00</div>
          <div class="player-card__control-time--full">0:00</div>
        </div>
        <div class="player-card__control-btns">
          <div class="player-card__control-btn player-card__control-btn--prev"><span class="material-symbols-outlined">skip_previous</span></div>
          <div class="player-card__control-btn player-card__control-btn--play"><span class="material-symbols-outlined">play_arrow</span></div>
          <div class="player-card__control-btn player-card__control-btn--next"><span class="material-symbols-outlined">skip_next</span></div>
        </div>
      </div>
    </div>
    <div class="player-card player-card--loaded" data-track="track3">
      <div class="player-card__bg" style="--image: url(//i.imgur.com/LfTTC1i.jpg)"></div>
      <div class="player-card__image"><img src="//i.imgur.com/LfTTC1i.jpg" /></div>
      <div class="player-card__info">
        <div class="player-card__info-name">TRACK NAME</div>
        <div class="player-card__info-artist">ARTIST</div>
      </div>
      <div class="player-card__control">
        <div class="player-card__control-duration"></div>
        <div class="player-card__control-time">
          <div class="player-card__control-time--cur">0:00</div>
          <div class="player-card__control-time--full">0:00</div>
        </div>
        <div class="player-card__control-btns">
          <div class="player-card__control-btn player-card__control-btn--prev"><span class="material-symbols-outlined">skip_previous</span></div>
          <div class="player-card__control-btn player-card__control-btn--play"><span class="material-symbols-outlined">play_arrow</span></div>
          <div class="player-card__control-btn player-card__control-btn--next"><span class="material-symbols-outlined">skip_next</span></div>
        </div>
      </div>
    </div>
    <div class="player-card player-card--loaded" data-track="track4">
      <div class="player-card__bg" style="--image: url(//i.imgur.com/Rlzb2NN.jpg)"></div>
      <div class="player-card__image"><img src="//i.imgur.com/Rlzb2NN.jpg" /></div>
      <div class="player-card__info">
        <div class="player-card__info-name">TRACK NAME</div>
        <div class="player-card__info-artist">ARTIST</div>
      </div>
      <div class="player-card__control">
        <div class="player-card__control-duration"></div>
        <div class="player-card__control-time">
          <div class="player-card__control-time--cur">0:00</div>
          <div class="player-card__control-time--full">0:00</div>
        </div>
        <div class="player-card__control-btns">
          <div class="player-card__control-btn player-card__control-btn--prev"><span class="material-symbols-outlined">skip_previous</span></div>
          <div class="player-card__control-btn player-card__control-btn--play"><span class="material-symbols-outlined">play_arrow</span></div>
          <div class="player-card__control-btn player-card__control-btn--next"><span class="material-symbols-outlined">skip_next</span></div>
        </div>
      </div>
    </div>
    <div class="player-card player-card--loaded" data-track="track5">
      <div class="player-card__bg" style="--image: url(//i.imgur.com/yEPcNvy.jpg)"></div>
      <div class="player-card__image"><img src="//i.imgur.com/yEPcNvy.jpg" /></div>
      <div class="player-card__info">
        <div class="player-card__info-name">TRACK NAME</div>
        <div class="player-card__info-artist">ARTIST</div>
      </div>
      <div class="player-card__control">
        <div class="player-card__control-duration"></div>
        <div class="player-card__control-time">
          <div class="player-card__control-time--cur">0:00</div>
          <div class="player-card__control-time--full">0:00</div>
        </div>
        <div class="player-card__control-btns">
          <div class="player-card__control-btn player-card__control-btn--prev"><span class="material-symbols-outlined">skip_previous</span></div>
          <div class="player-card__control-btn player-card__control-btn--play"><span class="material-symbols-outlined">play_arrow</span></div>
          <div class="player-card__control-btn player-card__control-btn--next"><span class="material-symbols-outlined">skip_next</span></div>
        </div>
      </div>
    </div>
  </div>
</div>

→ Ссылка
Автор решения: Опан

Я бы сделал этот плеер так:

let array = [
    ['https://i.imgur.com/8dhmWEh.jpg', 'https://i.imgur.com/k26l4bs.jpg', 'https://i.imgur.com/LfTTC1i.jpg', 'https://i.imgur.com/Rlzb2NN.jpg', 'https://i.imgur.com/yEPcNvy.jpg'],
    ['трек-1', 'трек-2', 'трек-3', 'трек-4', 'трек-5'],
    ['исполнитель-1', 'исполнитель-2', 'исполнитель-3', 'исполнитель-4', 'исполнитель-5'],
    ['track1.mp3', 'track2.mp3', 'track3.mp3', 'track4.mp3', 'track5.mp3'],
    ["#0DC2FF", "#007DE8", "#0E5DFF", "#0C28EB", "#1600FF"]
]
let url = 'https://mysynthesizer.github.io/index.hetemeel/'
let audio = new Audio();
let song = document.querySelector('.song');
let index = 0; // трек по умотчанию
function selecting_track(direction){
    index += direction;
    if(index >= array[0].length) index = 0;
    if(index < 0) index = array[0].length - 1;
    play_track(index);
    playPause.src = 'https://cdn.icon-icons.com/icons2/1132/PNG/512/1486348534-music-pause-stop-control-play_80459.png';
    audio.play();
}
function play_track(ind){
    image.src = array[0][ind];
    document.querySelector('.track').innerText = array[1][ind];
    document.querySelector('.artist').innerText = array[2][ind];
    audio.src = url + array[3][ind];
    audio.onloadedmetadata = function(){duration.innerText = formatingTime(this.duration)};
    document.bgColor = array[4][ind];
}
function play_pause(e){
    if(audio.paused){
        audio.play();
        e.src = 'https://cdn.icon-icons.com/icons2/1132/PNG/512/1486348534-music-pause-stop-control-play_80459.png';
    }else{
        audio.pause();
        e.src = 'https://cdn.icon-icons.com/icons2/1132/PNG/512/1486348532-music-play-pause-control-go-arrow_80458.png';
    }
}
audio.ontimeupdate = function(){
song.value = audio.currentTime / audio.duration * 100;
currentTime.innerText = formatingTime(audio.currentTime);
}
function formatingTime(time){
let s = Math.floor(time % 60);
return Math.floor(time / 60) + ':' + (s < 10 ? '0' + s : s);
}
audio.onended = function(){selecting_track(1)};
song.oninput = function(){audio.currentTime = this.value / 100 * audio.duration};
song.value = 0;
volume.value = 80;
currentTime.innerText = formatingTime(audio.currentTime);
play_track(index);
.cards {
    display: flex;
    flex-wrap: wrap;
    width: 1915px;
    text-align: center;
    transform: translateX(29%) translateY(-25%) rotateX(50deg) rotateZ(330deg) skewX(19deg) skewY(350deg);
}
.tracks_list>img {
    display: inline-block;
    width: 350px;
    border-radius: 30px;
    margin-top: 40px;
    margin-bottom: 20px;

}
.cards>* {
    display: inline-block;
    width: 400px;
    aspect-ratio: 1 / 2;
    margin-right: 10px;
    border-radius: 30px;
    margin-bottom: 20px;
}
.cards>*:nth-child(1) {
    background: linear-gradient(0deg, #000000 0%, #000000 0%, #42353c 40%);
}
@import url('https://fonts.googleapis.com/css2?family=Meera+Inimai&display=swap');
.name_container {
    display: inline-block;
    margin-bottom: 30px;
}
.track {
    font-family: 'Meera Inimai', sans-serif;
    font-size: 19px;
    color: #f6eef3;
}
.artist {
    font-family: 'Meera Inimai', sans-serif;
    font-size: 19px;
    color: #a99ba6;
}

/* начало - прогресс бар */

.progress_bar{
    width: 300px;
    margin-left: 30px;
}
.time_bar {
    display: flex;
    justify-content: space-between;
   margin-top: 15px;
    margin-bottom: 30px;
    margin-left: 30px;
    margin-right: 30px;
    color: #a99ba6;
}
.start_track {
    font-family: 'Meera Inimai', sans-serif;
    font-size: 17px;
}
.end_track {
    font-family: 'Meera Inimai', sans-serif;
    font-size: 17px
}
.panel_players {
    display: flex;
    justify-content: space-around;
    flex-flow: row nowrap;
    margin-left: 10px;
    margin-bottom: 50px;
}
.left_button img {
    max-width: 50px;
    padding: 40px;

    -webkit-transform: scale(1);
    transform: scale(1);
    -webkit-transition: .3s ease-in-out;
    transition: .3s ease-in-out;
}
.left_button:hover img{
    -webkit-transform: scale(1.3);
    transform: scale(1.3);
}
.play_button img {
    max-width: 50px;
    padding: 30px;

    -webkit-transform: scale(1);
    transform: scale(1);
    -webkit-transition: .3s ease-in-out;
    transition: .3s ease-in-out;
}
.play_button:hover img {
    -webkit-transform: scale(1.3);
    transform: scale(1.3);
}
.right_button img {
    max-width: 50px;
    padding: 35px;

    -webkit-transform: scale(1);
    transform: scale(1);
    -webkit-transition: .3s ease-in-out;
    transition: .3s ease-in-out;
}
.right_button:hover img {
    -webkit-transform: scale(1.3);
    transform: scale(1.3);
}
.panel_volume{
    padding-top: 8px;
}
.panel_volume input[type="range"] {
    display: block;
    -webkit-appearance: none;
    background-color: #bdc3c7;
    width: 250px;
    height: 5px;
    border-radius: 5px;
    margin: 0 auto;
    outline: 0;
}
.panel_volume input[type="range"]::-webkit-slider-thumb {
    -webkit-appearance: none;
    background-color: #303331;
    width: 15px;
    height: 15px;
    border-radius: 50%;
    border: 2px solid white;
    cursor: pointer;
    transition: .4s ease-in-out;
}
.panel_volume input[type="range"]::-webkit-slider-thumb:hover {
    background-color: #000000;
}
.panel_volume input[type="range"]::-webkit-slider-thumb:active {
    transform: scale(1.6);
}
.volume_regulator {
    position: relative;
    display: flex;
    justify-content: space-around;
    bottom: 15px;
}
.right_volume img {
    max-width: 20px;
    position: relative;
    right: 15px;
}
.left_volume img {
    max-width: 20px;
    position: relative;
    left: 15px;
}
.progress_bar input[type="range"] {
    display: block;
    -webkit-appearance: none;
    background-color: #bdc3c7;
    width: 350px;
    height: 5px;
    border-radius: 5px;
    margin: 0 auto;
    outline: 0;
}
.progress_bar input[type="range"]::-webkit-slider-thumb {
    -webkit-appearance: none;
    background-color: white;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    border: 2px solid white;
    cursor: pointer;
    transition: .4s ease-in-out;
}
​.progress_bar input [type="range"]::-webkit-slider-thumb:hover {
    background-color: #000000;
}
.progress_bar input[type="range"]::-webkit-slider-thumb:active {
    transform: scale(1.6);
}
<div class="cards">
    <div class="tracks_list" id="track-play-gruppy">
        <img id=image src="https://i.imgur.com/8dhmWEh.jpg" alt="">
        <div class="name_container">
            <div class="track"></div>
                <div class="artist"></div>
        </div>
        <div class="progress_bar">
            <input class="song" type="range" min='0 'max="100" >
        </div>
        <div class="time_bar">
            <div id=currentTime class="music-progress__time-item music-current-time start_track"></div>
            <div id=duration class="music-progress__time-item music-duration-time end_track"></div>
        </div>
        <div class="panel_players">
            <div class="left_button" onclick='selecting_track(-1)'>
                <img src="https://cdn.icon-icons.com/icons2/7/PNG/128/leftarrow_1241.png" alt="">
            </div>
            <div class="play_button">
                <img id=playPause class='pause_active' src="https://cdn.icon-icons.com/icons2/1132/PNG/512/1486348532-music-play-pause-control-go-arrow_80458.png" alt="" onclick='play_pause(this)' />
            </div>
            <div class="right_button" onclick='selecting_track(1)'>
                <img  id="right-next-track-perviy-raz" src="https://cdn.icon-icons.com/icons2/7/PNG/128/arrowright_1240.png" alt="">
            </div>
        </div>
        <div class="volume_regulator">
            <div class="left_volume" onclick='audio.muted = true'>
                <img src="https://cdn.icon-icons.com/icons2/2248/PNG/512/volume_mute_icon_135038.png" alt="">
            </div>
            <div class="panel_volume">
                <input id=volume type="range" min='0 'max="100" onpointerdown='audio.volume = this.value / 100' onpointermove='audio.volume = this.value / 100'>
            </div>
            <div class="right_volume" onclick='audio.muted = false'>
                <img src="https://cdn.icon-icons.com/icons2/1369/PNG/512/-volume-mute_90639.png" alt="">
            </div>
        </div>
    </div>
</div>

Правда, в наклонном режиме возникает нестабильность выбора позиции ползунка range воспроизведения с помощью курсора. Всё остальное работает.

→ Ссылка