forked from Simnation/Main
402 lines
18 KiB
HTML
402 lines
18 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>DJ System - Professional Interface</title>
|
|
<link rel="stylesheet" href="style.css">
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
|
|
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700;900&family=Rajdhani:wght@300;400;600;700&display=swap" rel="stylesheet">
|
|
</head>
|
|
<body>
|
|
<!-- DJ Interface Container -->
|
|
<div id="dj-interface" class="hidden">
|
|
<!-- Header -->
|
|
<div class="dj-header">
|
|
<div class="logo">
|
|
<i class="fas fa-music"></i>
|
|
<span>DJ SYSTEM</span>
|
|
</div>
|
|
<div class="status-bar">
|
|
<div class="status-item">
|
|
<i class="fas fa-signal"></i>
|
|
<span id="connection-status">CONNECTED</span>
|
|
</div>
|
|
<div class="status-item">
|
|
<i class="fas fa-clock"></i>
|
|
<span id="current-time">00:00</span>
|
|
</div>
|
|
</div>
|
|
<div class="close-btn" onclick="closeDJInterface()">
|
|
<i class="fas fa-times"></i>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Main DJ Console -->
|
|
<div class="dj-console">
|
|
<!-- Left Deck -->
|
|
<div class="deck deck-left">
|
|
<div class="deck-header">
|
|
<h3>DECK A</h3>
|
|
<div class="deck-controls">
|
|
<button class="btn-deck" onclick="loadTrackToDeck('A')">
|
|
<i class="fas fa-folder-open"></i>
|
|
</button>
|
|
<button class="btn-deck" onclick="ejectDeck('A')">
|
|
<i class="fas fa-eject"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Vinyl Plattenspieler -->
|
|
<div class="turntable">
|
|
<div class="vinyl-container">
|
|
<div class="vinyl" id="vinyl-a">
|
|
<div class="vinyl-center">
|
|
<div class="vinyl-hole"></div>
|
|
<div class="vinyl-label">
|
|
<span id="track-name-a">NO TRACK</span>
|
|
</div>
|
|
</div>
|
|
<div class="vinyl-grooves">
|
|
<div class="groove"></div>
|
|
<div class="groove"></div>
|
|
<div class="groove"></div>
|
|
<div class="groove"></div>
|
|
<div class="groove"></div>
|
|
</div>
|
|
</div>
|
|
<div class="tonearm">
|
|
<div class="tonearm-base"></div>
|
|
<div class="tonearm-arm"></div>
|
|
<div class="tonearm-needle"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Plattenspieler Controls -->
|
|
<div class="turntable-controls">
|
|
<button class="play-btn" id="play-a" onclick="togglePlay('A')">
|
|
<i class="fas fa-play"></i>
|
|
</button>
|
|
<button class="cue-btn" onclick="cue('A')">CUE</button>
|
|
<div class="pitch-slider">
|
|
<label>PITCH</label>
|
|
<input type="range" id="pitch-a" min="-20" max="20" value="0" oninput="adjustPitch('A', this.value)">
|
|
<span id="pitch-value-a">0%</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Waveform Display -->
|
|
<div class="waveform-container">
|
|
<canvas id="waveform-a" width="300" height="80"></canvas>
|
|
<div class="playhead" id="playhead-a"></div>
|
|
</div>
|
|
|
|
<!-- Track Info -->
|
|
<div class="track-info">
|
|
<div class="track-title" id="title-a">No Track Loaded</div>
|
|
<div class="track-artist" id="artist-a">-</div>
|
|
<div class="track-time">
|
|
<span id="time-elapsed-a">00:00</span> /
|
|
<span id="time-total-a">00:00</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Center Mixer -->
|
|
<div class="mixer">
|
|
<div class="mixer-header">
|
|
<h3>MIXER</h3>
|
|
</div>
|
|
|
|
<!-- Crossfader Section -->
|
|
<div class="crossfader-section">
|
|
<div class="crossfader-container">
|
|
<label>A</label>
|
|
<input type="range" id="crossfader" min="0" max="100" value="50" oninput="adjustCrossfader(this.value)">
|
|
<label>B</label>
|
|
</div>
|
|
<div class="crossfader-curve">
|
|
<button class="curve-btn active" onclick="setCrossfaderCurve('smooth')">~</button>
|
|
<button class="curve-btn" onclick="setCrossfaderCurve('cut')">|</button>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="playlist-browser">
|
|
<div class="browser-header">
|
|
<h4>PLAYLISTS</h4>
|
|
<button id="create-playlist-btn" class="create-playlist-btn">
|
|
<i class="fas fa-plus"></i> Neue Playlist
|
|
</button>
|
|
</div>
|
|
<div id="playlist-container" class="playlist-container">
|
|
<!-- Playlists werden hier dynamisch eingefügt -->
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<!-- Channel Controls -->
|
|
<div class="channel-controls">
|
|
<!-- Channel A -->
|
|
<div class="channel channel-a">
|
|
<div class="channel-header">CH A</div>
|
|
|
|
<!-- EQ -->
|
|
<div class="eq-section">
|
|
<div class="eq-knob">
|
|
<label>HIGH</label>
|
|
<div class="knob" data-channel="A" data-eq="high">
|
|
<div class="knob-indicator"></div>
|
|
</div>
|
|
<span class="eq-value">0</span>
|
|
</div>
|
|
<div class="eq-knob">
|
|
<label>MID</label>
|
|
<div class="knob" data-channel="A" data-eq="mid">
|
|
<div class="knob-indicator"></div>
|
|
</div>
|
|
<span class="eq-value">0</span>
|
|
</div>
|
|
<div class="eq-knob">
|
|
<label>LOW</label>
|
|
<div class="knob" data-channel="A" data-eq="low">
|
|
<div class="knob-indicator"></div>
|
|
</div>
|
|
<span class="eq-value">0</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Volume Fader -->
|
|
<div class="volume-fader">
|
|
<input type="range" id="volume-a" min="0" max="100" value="75" orient="vertical" oninput="adjustVolume('A', this.value)">
|
|
<label>VOLUME</label>
|
|
</div>
|
|
|
|
<!-- VU Meter -->
|
|
<div class="vu-meter">
|
|
<div class="vu-bar" id="vu-a"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Master Section -->
|
|
<div class="master-section">
|
|
<div class="master-header">MASTER</div>
|
|
|
|
<!-- Master Volume -->
|
|
<div class="master-volume">
|
|
<input type="range" id="master-volume" min="0" max="100" value="80" orient="vertical" oninput="adjustMasterVolume(this.value)">
|
|
<label>MASTER</label>
|
|
</div>
|
|
|
|
<!-- Master VU -->
|
|
<div class="master-vu">
|
|
<div class="vu-bar" id="master-vu"></div>
|
|
</div>
|
|
|
|
<!-- BPM Display -->
|
|
<div class="bpm-display">
|
|
<div class="bpm-value" id="bpm-display">120</div>
|
|
<label>BPM</label>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Channel B -->
|
|
<div class="channel channel-b">
|
|
<div class="channel-header">CH B</div>
|
|
|
|
<!-- EQ -->
|
|
<div class="eq-section">
|
|
<div class="eq-knob">
|
|
<label>HIGH</label>
|
|
<div class="knob" data-channel="B" data-eq="high">
|
|
<div class="knob-indicator"></div>
|
|
</div>
|
|
<span class="eq-value">0</span>
|
|
</div>
|
|
<div class="eq-knob">
|
|
<label>MID</label>
|
|
<div class="knob" data-channel="B" data-eq="mid">
|
|
<div class="knob-indicator"></div>
|
|
</div>
|
|
<span class="eq-value">0</span>
|
|
</div>
|
|
<div class="eq-knob">
|
|
<label>LOW</label>
|
|
<div class="knob" data-channel="B" data-eq="low">
|
|
<div class="knob-indicator"></div>
|
|
</div>
|
|
<span class="eq-value">0</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Volume Fader -->
|
|
<div class="volume-fader">
|
|
<input type="range" id="volume-b" min="0" max="100" value="75" orient="vertical" oninput="adjustVolume('B', this.value)">
|
|
<label>VOLUME</label>
|
|
</div>
|
|
|
|
<!-- VU Meter -->
|
|
<div class="vu-meter">
|
|
<div class="vu-bar" id="vu-b"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Effects Section -->
|
|
<div class="effects-section">
|
|
<div class="effect-unit">
|
|
<h4>EFFECTS</h4>
|
|
<div class="effect-buttons">
|
|
<button class="effect-btn" onclick="toggleEffect('reverb')">REVERB</button>
|
|
<button class="effect-btn" onclick="toggleEffect('delay')">DELAY</button>
|
|
<button class="effect-btn" onclick="toggleEffect('filter')">FILTER</button>
|
|
<button class="effect-btn" onclick="toggleEffect('flanger')">FLANGER</button>
|
|
</div>
|
|
<div class="effect-knob">
|
|
<label>WET/DRY</label>
|
|
<div class="knob" data-effect="wetdry">
|
|
<div class="knob-indicator"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Right Deck -->
|
|
<div class="deck deck-right">
|
|
<div class="deck-header">
|
|
<h3>DECK B</h3>
|
|
<div class="deck-controls">
|
|
<button class="btn-deck" onclick="loadTrackToDeck('B')">
|
|
<i class="fas fa-folder-open"></i>
|
|
</button>
|
|
<button class="btn-deck" onclick="ejectDeck('B')">
|
|
<i class="fas fa-eject"></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Vinyl Plattenspieler -->
|
|
<div class="turntable">
|
|
<div class="vinyl-container">
|
|
<div class="vinyl" id="vinyl-b">
|
|
<div class="vinyl-center">
|
|
<div class="vinyl-hole"></div>
|
|
<div class="vinyl-label">
|
|
<span id="track-name-b">NO TRACK</span>
|
|
</div>
|
|
</div>
|
|
<div class="vinyl-grooves">
|
|
<div class="groove"></div>
|
|
<div class="groove"></div>
|
|
<div class="groove"></div>
|
|
<div class="groove"></div>
|
|
<div class="groove"></div>
|
|
</div>
|
|
</div>
|
|
<div class="tonearm">
|
|
<div class="tonearm-base"></div>
|
|
<div class="tonearm-arm"></div>
|
|
<div class="tonearm-needle"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Plattenspieler Controls -->
|
|
<div class="turntable-controls">
|
|
<button class="play-btn" id="play-b" onclick="togglePlay('B')">
|
|
<i class="fas fa-play"></i>
|
|
</button>
|
|
<button class="cue-btn" onclick="cue('B')">CUE</button>
|
|
<div class="pitch-slider">
|
|
<label>PITCH</label>
|
|
<input type="range" id="pitch-b" min="-20" max="20" value="0" oninput="adjustPitch('B', this.value)">
|
|
<span id="pitch-value-b">0%</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Waveform Display -->
|
|
<div class="waveform-container">
|
|
<canvas id="waveform-b" width="300" height="80"></canvas>
|
|
<div class="playhead" id="playhead-b"></div>
|
|
</div>
|
|
|
|
<!-- Track Info -->
|
|
<div class="track-info">
|
|
<div class="track-title" id="title-b">No Track Loaded</div>
|
|
<div class="track-artist" id="artist-b">-</div>
|
|
<div class="track-time">
|
|
<span id="time-elapsed-b">00:00</span> /
|
|
<span id="time-total-b">00:00</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Bottom Panel -->
|
|
<div class="bottom-panel">
|
|
<!-- Playlist Browser -->
|
|
<div class="playlist-browser">
|
|
<div class="browser-header">
|
|
<h4>MUSIC LIBRARY</h4>
|
|
<div class="search-box">
|
|
<i class="fas fa-search"></i>
|
|
<input type="text" id="search-input" placeholder="Search tracks..." oninput="searchTracks(this.value)">
|
|
</div>
|
|
</div>
|
|
<div class="track-list" id="track-list">
|
|
<!-- Tracks werden hier dynamisch geladen -->
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Recording Section -->
|
|
<div class="recording-section">
|
|
<h4>RECORDING</h4>
|
|
<button class="record-btn" onclick="toggleRecording()">
|
|
<i class="fas fa-circle"></i>
|
|
<span>REC</span>
|
|
</button>
|
|
<div class="recording-time">00:00</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Track Loader Modal -->
|
|
<div id="track-loader" class="modal hidden">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h3>Load Track</h3>
|
|
<button class="close-modal" onclick="closeTrackLoader()">
|
|
<i class="fas fa-times"></i>
|
|
</button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="input-group">
|
|
<label>Track Title</label>
|
|
<input type="text" id="track-title" placeholder="Enter track title">
|
|
</div>
|
|
<div class="input-group">
|
|
<label>Artist</label>
|
|
<input type="text" id="track-artist" placeholder="Enter artist name">
|
|
</div>
|
|
<div class="input-group">
|
|
<label>URL (YouTube or Direct)</label>
|
|
<input type="text" id="track-url" placeholder="https://www.youtube.com/watch?v=...">
|
|
</div>
|
|
<div class="modal-actions">
|
|
<button class="btn-cancel" onclick="closeTrackLoader()">Cancel</button>
|
|
<button class="btn-load" onclick="confirmLoadTrack()">Load Track</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Audio Players (versteckt) -->
|
|
<audio id="audio-player-a" style="display: none;"></audio>
|
|
<audio id="audio-player-b" style="display: none;"></audio>
|
|
|
|
<script src="script.js"></script>
|
|
</body>
|
|
</html>
|