2024/12/18 piano
You are currently viewing a revision titled "2024/12/18 piano", saved on 2024年12月19日 12:48 AM by ゆな | |
---|---|
タイトル | 2024/12/18 piano |
コンテンツ | <!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>簡易ピアノ</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
margin: 20px;
}
.key {
display: inline-block;
width: 50px;
height: 150px;
margin: 5px;
background-color: white;
border: 1px solid black;
text-align: center;
line-height: 150px;
cursor: pointer;
user-select: none;
}
.key:active {
background-color: lightgray;
}
.black {
background-color: black;
color: white;
height: 100px;
margin-left: -25px;
margin-right: -25px;
z-index: 1;
position: relative;
line-height: 100px;
}
.black:active {
background-color: gray;
}
</style>
</head>
<body>
<h1>簡易ピアノ</h1>
<div id="piano">
<div class="key" data-note="261.63">C</div>
<div class="key black" data-note="277.18">C#</div>
<div class="key" data-note="293.66">D</div>
<div class="key black" data-note="311.13">D#</div>
<div class="key" data-note="329.63">E</div>
<div class="key" data-note="349.23">F</div>
<div class="key black" data-note="369.99">F#</div>
<div class="key" data-note="392.00">G</div>
<div class="key black" data-note="415.30">G#</div>
<div class="key" data-note="440.00">A</div>
<div class="key black" data-note="466.16">A#</div>
<div class="key" data-note="493.88">B</div>
</div>
<script>
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
function playSound(frequency) {
const oscillator = audioContext.createOscillator();
const gainNode = audioContext.createGain();
oscillator.type = 'sine'; // 波形の種類 (sine, square, sawtooth, triangle)
oscillator.frequency.setValueAtTime(frequency, audioContext.currentTime);
oscillator.connect(gainNode);
gainNode.connect(audioContext.destination);
oscillator.start();
gainNode.gain.exponentialRampToValueAtTime(0.001, audioContext.currentTime + 0.5);
oscillator.stop(audioContext.currentTime + 0.5);
}
document.getElementById('piano').addEventListener('click', (e) => {
if (e.target.classList.contains('key')) {
const frequency = parseFloat(e.target.dataset.note);
if (!isNaN(frequency)) {
playSound(frequency);
}
}
});
</script>
</body>
</html> |
抜粋 | |
脚注 |