友人が、録音とは違う高さから聞き慣れた歌を歌い始めます。それでも曲はすぐに分かるでしょう。何が同じままなのでしょうか。
旋律には、一つ一つの音高だけでなく、音同士の関係があります。 この回では、フレーズ全体を動かすことと、一音だけを書き換えることを比べます。耳だけで音名を当てる必要はありません。音、図、文字を一緒に使って確かめましょう。
繰り返し聴く時間を含めて、約十分が目安です。第 1 回で分けた「いつ鳴るか」と「どの高さか」を思い出してください。今回はタイミングを固定します。
上下の形を聴いてから、間隔を確かめる
「原形」の次に「全音 +5」を再生します。無理のない高さなら口ずさみ、あるいは手で音の上下をなぞってみましょう。同じ考えを高い音域へ移したように聞こえますか。次に「一音だけ +1」と原形を比べ、最も高い音の付近に注目します。
図を準備しています
旋律全体を高くするいずれも 100 BPM、等間隔の八音です。二つ目は全音を五半音上げ、三つ目は四番目の音だけを一半音上げます。
{"id":"music-pitch-shift","title":"旋律全体を高くする","summary":"いずれも 100 BPM、等間隔の八音です。二つ目は全音を五半音上げ、三つ目は四番目の音だけを一半音上げます。","height":760,"html":"<h2 data-i18n=\"heading\"></h2><p class=\"mf-intro\" data-i18n=\"intro\"></p>\n<div id=\"variants\" class=\"mf-options\" role=\"group\" data-i18n-label=\"choose\"></div>\n<p id=\"facts\" class=\"mf-facts\" aria-live=\"polite\"></p>\n<svg id=\"plot\" class=\"mf-plot\" viewBox=\"0 0 540 200\" aria-hidden=\"true\"></svg>\n<div class=\"mf-axis\"><span data-i18n=\"axis\"></span><span id=\"duration\"></span></div>\n<div id=\"groups\" class=\"mf-groups\"></div><p id=\"notation\" class=\"mf-notation\"></p><p class=\"mf-key\" data-i18n=\"key\"></p>\n<div id=\"envelope-panel\" hidden><svg id=\"envelope-plot\" class=\"mf-plot\" viewBox=\"0 0 540 120\" aria-hidden=\"true\"></svg><p class=\"mf-key\" data-i18n=\"envelope\"></p></div>\n<div class=\"mf-actions\"><button id=\"play\" data-i18n=\"play\"></button><button id=\"stop\" data-i18n=\"stop\" disabled></button></div>\n<div class=\"mf-progress\" aria-hidden=\"true\"><span id=\"progress\"></span></div><p id=\"status\" class=\"mf-status\" role=\"status\" data-i18n=\"idle\"></p>\n<div class=\"mf-volume\"><label for=\"volume\" data-i18n=\"volume\"></label><input id=\"volume\" type=\"range\" min=\"0\" max=\"100\" value=\"65\"></div>\n","css":"body{padding:24px}h2{font-size:22px;line-height:1.4}.mf-intro{color:var(--muted);margin:10px 0 18px;line-height:1.7}.mf-options{display:flex;gap:8px;flex-wrap:wrap}.mf-options button{flex:1 1 125px;min-height:46px;font-size:16px;white-space:normal;line-height:1.45;text-align:left;padding:10px 12px}.mf-options button[aria-pressed=true]{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}.mf-facts{margin:16px 0;padding:14px;border-left:3px solid var(--accent);background:var(--surface);font-size:16px;line-height:1.75;min-height:4em}.mf-plot{width:100%;height:auto;display:block;margin:12px 0 0;background:var(--surface);border:1px solid var(--rule);border-radius:8px}.mf-axis{display:flex;justify-content:space-between;font-size:13px;color:var(--muted);gap:16px;margin:6px 0}.mf-notation{font-size:15px;line-height:1.8;overflow-wrap:anywhere;margin:10px 0;color:var(--ink)}.mf-groups{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0}.mf-groups span{padding:6px 10px;border:1px solid var(--rule);border-radius:5px;font-size:15px;white-space:pre}.mf-actions{display:flex;gap:8px;margin:18px 0 12px}.mf-actions button{min-height:46px;font-size:16px;flex:1}.mf-progress{height:3px;background:var(--rule);overflow:hidden}.mf-progress span{display:block;height:100%;background:var(--accent);width:0}.mf-status{font-size:14px;line-height:1.7;margin:10px 0;min-height:3.4em;color:var(--muted)}.mf-volume{display:flex;gap:12px;align-items:center;margin-top:12px;border-top:1px solid var(--rule);padding-top:12px;font-size:14px}.mf-volume input{min-width:60px;max-width:180px}.mf-volume label{white-space:nowrap}.mf-key{color:var(--muted);font-size:14px;line-height:1.6;margin:12px 0}@media(max-width:420px){body{padding:20px 14px}h2{font-size:20px}.mf-options button{flex-basis:105px}.mf-facts{padding:12px}}\n\n.mf-groups span.is-current{border-color:var(--accent);background:var(--accent-soft);box-shadow:inset 0 -2px 0 var(--accent)}\n\n[hidden]{display:none!important}\n#blind-answers{flex-wrap:wrap}#blind-answers button{flex:1 1 100px;white-space:normal;line-height:1.5;min-width:0;padding:10px}\n","js":"const MODEL = {\"mode\":\"notes\",\"min\":60,\"max\":74,\"blind\":false,\"variants\":[{\"score\":{\"bpm\":100,\"beats\":8,\"events\":[{\"midi\":60,\"hz\":261.625565,\"beat\":0,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":62,\"hz\":293.664768,\"beat\":1,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":64,\"hz\":329.627557,\"beat\":2,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":67,\"hz\":391.995436,\"beat\":3,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":64,\"hz\":329.627557,\"beat\":4,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":62,\"hz\":293.664768,\"beat\":5,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":60,\"hz\":261.625565,\"beat\":6,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":60,\"hz\":261.625565,\"beat\":7,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"}]},\"notation\":\"C4 · D4 · E4 · G4 · E4 · D4 · C4 · C4\",\"groups\":[]},{\"score\":{\"bpm\":100,\"beats\":8,\"events\":[{\"midi\":65,\"hz\":349.228231,\"beat\":0,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":67,\"hz\":391.995436,\"beat\":1,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":69,\"hz\":440.0,\"beat\":2,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":72,\"hz\":523.251131,\"beat\":3,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":69,\"hz\":440.0,\"beat\":4,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":67,\"hz\":391.995436,\"beat\":5,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":65,\"hz\":349.228231,\"beat\":6,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":65,\"hz\":349.228231,\"beat\":7,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"}]},\"notation\":\"F4 · G4 · A4 · C5 · A4 · G4 · F4 · F4\",\"groups\":[]},{\"score\":{\"bpm\":100,\"beats\":8,\"events\":[{\"midi\":60,\"hz\":261.625565,\"beat\":0,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":62,\"hz\":293.664768,\"beat\":1,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":64,\"hz\":329.627557,\"beat\":2,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":68,\"hz\":415.304698,\"beat\":3,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":64,\"hz\":329.627557,\"beat\":4,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":62,\"hz\":293.664768,\"beat\":5,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":60,\"hz\":261.625565,\"beat\":6,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":60,\"hz\":261.625565,\"beat\":7,\"duration\":0.48,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"}]},\"notation\":\"C4 · D4 · E4 · G♯4 · E4 · D4 · C4 · C4\",\"groups\":[]}]};\nconst $ = s => document.querySelector(s);\nconst variants = MODEL.variants;\nlet selected = 0;\nlet quizRevealed = !MODEL.blind;\nfunction visibility(){for(const q of ['#facts','#plot','.mf-axis','#groups','#notation','.mf-key'])$(q).toggleAttribute('hidden',!quizRevealed);document.body.dataset.quizRevealed=String(quizRevealed);}\nconst svgNS = 'http://www.w3.org/2000/svg';\nfunction node(tag, attrs = {}) { const el = document.createElementNS(svgNS, tag); for (const [k,v] of Object.entries(attrs)) el.setAttribute(k,v); return el; }\nfunction draw() {\n const v = variants[selected], plot = $('#plot'); plot.replaceChildren();\n $('#facts').textContent = viz.t('fact'+selected);\n $('#duration').textContent = viz.t('clip') + ' ' + (v.score.beats * 60 / v.score.bpm).toFixed(1) + ' ' + viz.t('seconds');\n $('#notation').textContent = v.notation;\n if (MODEL.mode === 'partials') {\n const e=v.score.events[0], p=e.partials;\n $('#envelope-panel').hidden=false;\n const envelope=$('#envelope-plot');envelope.replaceChildren();\n const attack=Math.min(e.attack,e.duration/2),points=[[12,108],[12+516*attack/e.duration,12]];\n for(let i=1;i<=60;i++){const t=attack+(e.duration-attack)*i/60,amplitude=Math.pow(.0001/(.05*e.gain),(t-attack)/(e.duration-attack));points.push([12+516*t/e.duration,108-amplitude*96]);}\n points.push([528,108]);envelope.append(node('polyline',{points:points.map(p=>p.join(',')).join(' '),fill:'none',stroke:'var(--accent)','stroke-width':3}));\n for(let i=0;i<4;i++) {\n plot.append(node('rect',{x:40+i*125,y:160-(p[i]||0)*125,width:58,height:(p[i]||0)*125,fill:'var(--accent)'}));\n const t=node('text',{x:69+i*125,y:185,'text-anchor':'middle',fill:'var(--ink)','font-size':18}); t.textContent=(i+1)+'×';plot.append(t);\n }\n } else {\n const events=v.score.events, min=MODEL.min??Math.min(...events.map(e=>e.midi)), max=MODEL.max??Math.max(...events.map(e=>e.midi));\n for(let i=0;i<=v.score.beats;i++) plot.append(node('line',{x1:12+i/v.score.beats*516,x2:12+i/v.score.beats*516,y1:16,y2:170,stroke:'var(--rule)'}));\n for(const e of events){\n const x=12+e.beat/v.score.beats*516;\n if(MODEL.mode==='pulse') plot.append(node('rect',{x,y:166-e.gain*140,width:Math.max(4,516/v.score.beats*.38),height:e.gain*140,rx:3,fill:'var(--accent)'}));\n else { const y=160-(e.midi-min)/Math.max(1,max-min)*130; plot.append(node('rect',{x,y:y-4,width:Math.max(4,Math.min(528-x,e.duration*v.score.bpm/60/v.score.beats*516)),height:8,rx:3,fill:e.layer==='bass'?'var(--ink)':'var(--accent)',opacity:e.layer==='chord'?'.45':'1'})); }\n }\n }\n if(MODEL.mode!=='partials') plot.append(node('line',{id:'cursor',x1:12,x2:12,y1:10,y2:177,stroke:'var(--ink)','stroke-width':2,visibility:'hidden'}));\n const groups=$('#groups'); groups.replaceChildren();\n for (const label of v.groups || []) {const chip=document.createElement('span');chip.textContent=label;groups.append(chip);}\n if(MODEL.blind)visibility();\n [...$('#variants').children].forEach((b,i)=>b.setAttribute('aria-pressed',String(i===selected)));\n}\nconst player=viz.audio({onState(state){document.body.dataset.audioState=state;$('#play').disabled=state!=='idle';$('#stop').disabled=state==='idle';$('#status').textContent=viz.t(state==='idle'?'idle':state==='starting'?'starting':'playing');},onTick(beat){const fraction=beat<0?0:Math.min(1,beat/variants[selected].score.beats);$('#progress').style.width=(fraction*100)+'%';const cursor=$('#cursor');if(cursor){cursor.setAttribute('x1',12+fraction*516);cursor.setAttribute('x2',12+fraction*516);cursor.setAttribute('visibility',beat<0?'hidden':'visible');}const chips=[...$('#groups').children];chips.forEach((el,i)=>el.classList.toggle('is-current',beat>=0&&i===Math.min(chips.length-1,Math.floor(fraction*chips.length))));},onError(){$('#status').textContent=viz.t('error');}});\nvariants.forEach((v,i)=>{const b=document.createElement('button');b.type='button';b.dataset.variant=i;b.textContent=viz.t('option'+i);b.onclick=()=>{player.stop();selected=i;draw();};$('#variants').append(b);});\n$('#play').onclick=()=>player.play(variants[selected].score);\n$('#stop').onclick=()=>player.stop();\n$('#volume').oninput=e=>player.setVolume(Number(e.target.value)/100);\ndocument.body.dataset.audioState='idle';draw();\n\nif(MODEL.blind){\n const panel=document.createElement('div');panel.className='mf-actions';panel.id='blind-answers';\n const result=document.createElement('p');result.className='mf-facts';result.id='blind-feedback';result.setAttribute('role','status');result.textContent=viz.t('before');\n for(const [key,correct]of [['choose_p',true],['choose_q',false],['reveal',null]]){const b=document.createElement('button');b.type='button';b.textContent=viz.t(key);b.dataset.blindAnswer=key;b.onclick=()=>{player.stop();quizRevealed=true;visibility();result.textContent=(correct===null?'':viz.t(correct?'correct':'wrong')+' ')+viz.t('comparison_correct');};panel.append(b);}\n $('#variants').after(panel,result);\n}\n","audio":true,"strings":{"axis":"時間 →・上ほど高い音","choose":"版を選ぶ","clip":"全長:","envelope":"時間に対する振幅 →(1.4 秒)。ピークまで上がり、その後減衰します。立ち上がりに使う時間を比べましょう。","error":"音声を開始できませんでした。再試行するか、図と文章で確認してください。","fact0":"C4 D4 E4 G4 E4 D4 C4 C4。上がって戻る動きを聴きます。","fact1":"F4 G4 A4 C5 A4 G4 F4 F4。音程と発音のタイミングはすべて同じです。","fact2":"G4 だけを G♯4 に変更。大まかな上下の形は同じでも、前後の二つの音程が変わります。","heading":"旋律全体を高くする","idle":"版を選んで再生します。変更すると停止し、各クリップは最後で自動停止します。","intro":"原形、全体の移調、一音だけの変更を比べましょう。同じ速さで拍を刻んでください。","key":"左から右へ読みます。棒は発音の開始と設定した長さ、上下の重なりは同時発音です。音名と説明でも確認できます。","option0":"原形","option1":"全音 +5","option2":"一音だけ +1","play":"この版を再生","playing":"再生中。いつでも停止できます。","seconds":"秒","starting":"音声を準備中…","stop":"停止","volume":"音量"}}
図は左から右へ時間が進み、上ほど高い音を表します。三つの版で縦軸の範囲は同じです。横棒の幅は設定された発音時間で、音量ではありません。図を使いにくい場合は、下の音名でも確認できます。
原形の出だし C–D–E は、二半音上がり、さらに二半音上がります。全体を上げた版の F–G–A も同じ間隔です。全音が五半音ずつ高くなる、この操作を移調といいます。開始音は変わっても、音程関係とリズムが保たれます。
一音だけを変える版では、G が G♯ になります。E から G は三半音ですが、E から G♯ は四半音。そこから E へ戻る幅も変わります。大まかにはどちらも上がって下がる形です。つまり、旋律の輪郭は、正確な音程の並びより粗い情報なのです。
音高を説明するための小さな語彙
| 用語 | この実験での意味 | 例 |
| 音高 | 聞こえる音の高低 | C5 は C4 より高い |
| 半音 | 黒鍵も含め、ピアノの隣り合う鍵の間隔 | E から F、C から C♯ |
| 音程 | 二つの音高の隔たり | C から E は四半音 |
| オクターブ | ここでは十二半音の幅 | C4 から C5 |
| 移調 | すべての音を同じ音程だけ動かすこと | 全音を五半音上げる |
本シリーズでは音名を A から G の文字で表します。文字は繰り返し現れ、♯ は半音上げ、♭ は半音下げる記号です。数字はオクターブを区別し、ここでは C4 を中央のドとします。E–F と B–C は、もともと半音で隣り合っています。間に黒鍵があると考えて数えないでください。半音と全音
実験の調律は十二平均律です。一オクターブを十二の等しい半音段階に分け、一オクターブ上がると周波数は二倍になります。練習に計算は不要です。他の調律や音楽文化では音高の組織が異なることもあります。ここでは、西洋の調性音楽を聴くための実用的な語彙から始めます。
初めての旋律に応用する
再生前に予想しましょう。正確な移調では何を保つ必要がありますか。最初と最後が合っていれば十分でしょうか。上がるか下がるかの方向だけではどうでしょう。
基準と P、基準と Q をそれぞれ比べます。まず答えを選び、表示された図で音名と間隔を確かめます。目的は関係を確かめることで、瞬時に当てることではありません。
図を準備しています
新しい旋律:移調したのはどちら?基準・P・Q を比較し、移調を選んでから図と解説を表示します。
{"id":"music-pitch-check","title":"新しい旋律:移調したのはどちら?","summary":"基準・P・Q を比較し、移調を選んでから図と解説を表示します。","height":760,"html":"<h2 data-i18n=\"heading\"></h2><p class=\"mf-intro\" data-i18n=\"intro\"></p>\n<div id=\"variants\" class=\"mf-options\" role=\"group\" data-i18n-label=\"choose\"></div>\n<p id=\"facts\" class=\"mf-facts\" aria-live=\"polite\"></p>\n<svg id=\"plot\" class=\"mf-plot\" viewBox=\"0 0 540 200\" aria-hidden=\"true\"></svg>\n<div class=\"mf-axis\"><span data-i18n=\"axis\"></span><span id=\"duration\"></span></div>\n<div id=\"groups\" class=\"mf-groups\"></div><p id=\"notation\" class=\"mf-notation\"></p><p class=\"mf-key\" data-i18n=\"key\"></p>\n<div id=\"envelope-panel\" hidden><svg id=\"envelope-plot\" class=\"mf-plot\" viewBox=\"0 0 540 120\" aria-hidden=\"true\"></svg><p class=\"mf-key\" data-i18n=\"envelope\"></p></div>\n<div class=\"mf-actions\"><button id=\"play\" data-i18n=\"play\"></button><button id=\"stop\" data-i18n=\"stop\" disabled></button></div>\n<div class=\"mf-progress\" aria-hidden=\"true\"><span id=\"progress\"></span></div><p id=\"status\" class=\"mf-status\" role=\"status\" data-i18n=\"idle\"></p>\n<div class=\"mf-volume\"><label for=\"volume\" data-i18n=\"volume\"></label><input id=\"volume\" type=\"range\" min=\"0\" max=\"100\" value=\"65\"></div>\n","css":"body{padding:24px}h2{font-size:22px;line-height:1.4}.mf-intro{color:var(--muted);margin:10px 0 18px;line-height:1.7}.mf-options{display:flex;gap:8px;flex-wrap:wrap}.mf-options button{flex:1 1 125px;min-height:46px;font-size:16px;white-space:normal;line-height:1.45;text-align:left;padding:10px 12px}.mf-options button[aria-pressed=true]{background:var(--accent-soft);border-color:var(--accent);color:var(--accent)}.mf-facts{margin:16px 0;padding:14px;border-left:3px solid var(--accent);background:var(--surface);font-size:16px;line-height:1.75;min-height:4em}.mf-plot{width:100%;height:auto;display:block;margin:12px 0 0;background:var(--surface);border:1px solid var(--rule);border-radius:8px}.mf-axis{display:flex;justify-content:space-between;font-size:13px;color:var(--muted);gap:16px;margin:6px 0}.mf-notation{font-size:15px;line-height:1.8;overflow-wrap:anywhere;margin:10px 0;color:var(--ink)}.mf-groups{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0}.mf-groups span{padding:6px 10px;border:1px solid var(--rule);border-radius:5px;font-size:15px;white-space:pre}.mf-actions{display:flex;gap:8px;margin:18px 0 12px}.mf-actions button{min-height:46px;font-size:16px;flex:1}.mf-progress{height:3px;background:var(--rule);overflow:hidden}.mf-progress span{display:block;height:100%;background:var(--accent);width:0}.mf-status{font-size:14px;line-height:1.7;margin:10px 0;min-height:3.4em;color:var(--muted)}.mf-volume{display:flex;gap:12px;align-items:center;margin-top:12px;border-top:1px solid var(--rule);padding-top:12px;font-size:14px}.mf-volume input{min-width:60px;max-width:180px}.mf-volume label{white-space:nowrap}.mf-key{color:var(--muted);font-size:14px;line-height:1.6;margin:12px 0}@media(max-width:420px){body{padding:20px 14px}h2{font-size:20px}.mf-options button{flex-basis:105px}.mf-facts{padding:12px}}\n\n.mf-groups span.is-current{border-color:var(--accent);background:var(--accent-soft);box-shadow:inset 0 -2px 0 var(--accent)}\n\n[hidden]{display:none!important}\n#blind-answers{flex-wrap:wrap}#blind-answers button{flex:1 1 100px;white-space:normal;line-height:1.5;min-width:0;padding:10px}\n","js":"const MODEL = {\"mode\":\"notes\",\"min\":65,\"max\":74,\"blind\":true,\"variants\":[{\"score\":{\"bpm\":90,\"beats\":4,\"events\":[{\"midi\":65,\"hz\":349.228231,\"beat\":0,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":69,\"hz\":440.0,\"beat\":1,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":67,\"hz\":391.995436,\"beat\":2,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":72,\"hz\":523.251131,\"beat\":3,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"}]},\"notation\":\"F4 · A4 · G4 · C5\",\"groups\":[]},{\"score\":{\"bpm\":90,\"beats\":4,\"events\":[{\"midi\":67,\"hz\":391.995436,\"beat\":0,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":71,\"hz\":493.883301,\"beat\":1,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":69,\"hz\":440.0,\"beat\":2,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":74,\"hz\":587.329536,\"beat\":3,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"}]},\"notation\":\"G4 · B4 · A4 · D5\",\"groups\":[]},{\"score\":{\"bpm\":90,\"beats\":4,\"events\":[{\"midi\":67,\"hz\":391.995436,\"beat\":0,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":70,\"hz\":466.163762,\"beat\":1,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":69,\"hz\":440.0,\"beat\":2,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":74,\"hz\":587.329536,\"beat\":3,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"}]},\"notation\":\"G4 · B♭4 · A4 · D5\",\"groups\":[]}]};\nconst $ = s => document.querySelector(s);\nconst variants = MODEL.variants;\nlet selected = 0;\nlet quizRevealed = !MODEL.blind;\nfunction visibility(){for(const q of ['#facts','#plot','.mf-axis','#groups','#notation','.mf-key'])$(q).toggleAttribute('hidden',!quizRevealed);document.body.dataset.quizRevealed=String(quizRevealed);}\nconst svgNS = 'http://www.w3.org/2000/svg';\nfunction node(tag, attrs = {}) { const el = document.createElementNS(svgNS, tag); for (const [k,v] of Object.entries(attrs)) el.setAttribute(k,v); return el; }\nfunction draw() {\n const v = variants[selected], plot = $('#plot'); plot.replaceChildren();\n $('#facts').textContent = viz.t('fact'+selected);\n $('#duration').textContent = viz.t('clip') + ' ' + (v.score.beats * 60 / v.score.bpm).toFixed(1) + ' ' + viz.t('seconds');\n $('#notation').textContent = v.notation;\n if (MODEL.mode === 'partials') {\n const e=v.score.events[0], p=e.partials;\n $('#envelope-panel').hidden=false;\n const envelope=$('#envelope-plot');envelope.replaceChildren();\n const attack=Math.min(e.attack,e.duration/2),points=[[12,108],[12+516*attack/e.duration,12]];\n for(let i=1;i<=60;i++){const t=attack+(e.duration-attack)*i/60,amplitude=Math.pow(.0001/(.05*e.gain),(t-attack)/(e.duration-attack));points.push([12+516*t/e.duration,108-amplitude*96]);}\n points.push([528,108]);envelope.append(node('polyline',{points:points.map(p=>p.join(',')).join(' '),fill:'none',stroke:'var(--accent)','stroke-width':3}));\n for(let i=0;i<4;i++) {\n plot.append(node('rect',{x:40+i*125,y:160-(p[i]||0)*125,width:58,height:(p[i]||0)*125,fill:'var(--accent)'}));\n const t=node('text',{x:69+i*125,y:185,'text-anchor':'middle',fill:'var(--ink)','font-size':18}); t.textContent=(i+1)+'×';plot.append(t);\n }\n } else {\n const events=v.score.events, min=MODEL.min??Math.min(...events.map(e=>e.midi)), max=MODEL.max??Math.max(...events.map(e=>e.midi));\n for(let i=0;i<=v.score.beats;i++) plot.append(node('line',{x1:12+i/v.score.beats*516,x2:12+i/v.score.beats*516,y1:16,y2:170,stroke:'var(--rule)'}));\n for(const e of events){\n const x=12+e.beat/v.score.beats*516;\n if(MODEL.mode==='pulse') plot.append(node('rect',{x,y:166-e.gain*140,width:Math.max(4,516/v.score.beats*.38),height:e.gain*140,rx:3,fill:'var(--accent)'}));\n else { const y=160-(e.midi-min)/Math.max(1,max-min)*130; plot.append(node('rect',{x,y:y-4,width:Math.max(4,Math.min(528-x,e.duration*v.score.bpm/60/v.score.beats*516)),height:8,rx:3,fill:e.layer==='bass'?'var(--ink)':'var(--accent)',opacity:e.layer==='chord'?'.45':'1'})); }\n }\n }\n if(MODEL.mode!=='partials') plot.append(node('line',{id:'cursor',x1:12,x2:12,y1:10,y2:177,stroke:'var(--ink)','stroke-width':2,visibility:'hidden'}));\n const groups=$('#groups'); groups.replaceChildren();\n for (const label of v.groups || []) {const chip=document.createElement('span');chip.textContent=label;groups.append(chip);}\n if(MODEL.blind)visibility();\n [...$('#variants').children].forEach((b,i)=>b.setAttribute('aria-pressed',String(i===selected)));\n}\nconst player=viz.audio({onState(state){document.body.dataset.audioState=state;$('#play').disabled=state!=='idle';$('#stop').disabled=state==='idle';$('#status').textContent=viz.t(state==='idle'?'idle':state==='starting'?'starting':'playing');},onTick(beat){const fraction=beat<0?0:Math.min(1,beat/variants[selected].score.beats);$('#progress').style.width=(fraction*100)+'%';const cursor=$('#cursor');if(cursor){cursor.setAttribute('x1',12+fraction*516);cursor.setAttribute('x2',12+fraction*516);cursor.setAttribute('visibility',beat<0?'hidden':'visible');}const chips=[...$('#groups').children];chips.forEach((el,i)=>el.classList.toggle('is-current',beat>=0&&i===Math.min(chips.length-1,Math.floor(fraction*chips.length))));},onError(){$('#status').textContent=viz.t('error');}});\nvariants.forEach((v,i)=>{const b=document.createElement('button');b.type='button';b.dataset.variant=i;b.textContent=viz.t('option'+i);b.onclick=()=>{player.stop();selected=i;draw();};$('#variants').append(b);});\n$('#play').onclick=()=>player.play(variants[selected].score);\n$('#stop').onclick=()=>player.stop();\n$('#volume').oninput=e=>player.setVolume(Number(e.target.value)/100);\ndocument.body.dataset.audioState='idle';draw();\n\nif(MODEL.blind){\n const panel=document.createElement('div');panel.className='mf-actions';panel.id='blind-answers';\n const result=document.createElement('p');result.className='mf-facts';result.id='blind-feedback';result.setAttribute('role','status');result.textContent=viz.t('before');\n for(const [key,correct]of [['choose_p',true],['choose_q',false],['reveal',null]]){const b=document.createElement('button');b.type='button';b.textContent=viz.t(key);b.dataset.blindAnswer=key;b.onclick=()=>{player.stop();quizRevealed=true;visibility();result.textContent=(correct===null?'':viz.t(correct?'correct':'wrong')+' ')+viz.t('comparison_correct');};panel.append(b);}\n $('#variants').after(panel,result);\n}\n","audio":true,"strings":{"axis":"時間 →・上ほど高い音","before":"答えを選び、解説で確かめましょう。","choose":"版を選ぶ","choose_p":"移調は P","choose_q":"移調は Q","clip":"全長:","compare_title":"答えを選んでから図を見る","comparison_correct":"P は全音程を保ち、Q は内部の一音を変えています。表示された間隔を確かめましょう。","correct":"正解です。","envelope":"時間に対する振幅 →(1.4 秒)。ピークまで上がり、その後減衰します。立ち上がりに使う時間を比べましょう。","error":"音声を開始できませんでした。再試行するか、図と文章で確認してください。","fact0":"音程は +4、−2、+5 半音です。","fact1":"G4 B4 A4 D5。すべて同じ幅だけ移動しています。","fact2":"G4 B♭4 A4 D5。二番目だけ移動幅が小さくなっています。","heading":"新しい旋律:移調したのはどちら?","idle":"版を選んで再生します。変更すると停止し、各クリップは最後で自動停止します。","intro":"基準、P、Q を聴いてから、実験の下にある解説を読みましょう。","key":"左から右へ読みます。棒は発音の開始と設定した長さ、上下の重なりは同時発音です。音名と説明でも確認できます。","option0":"基準","option1":"P","option2":"Q","play":"この版を再生","playing":"再生中。いつでも停止できます。","reveal":"解説を見る","seconds":"秒","starting":"音声を準備中…","stop":"停止","volume":"音量","wrong":"まだ違います。選んだ答えと解説を比べましょう。"}}
答えと音程の計算を見る
正確な移調は P です。 基準 F–A–G–C の動きは +4、−2、+5 半音。P の G–B–A–D も同じで、各音が対応する基準音より二半音高くなっています。
Q の G–B♭–A–D は +3、−1、+5 半音です。上下の方向も、P と共通する最初と最後の音も保たれていますが、内側の間隔は違います。両端だけでは変更を見落とすわけです。
音を出せない場合は、基準を 65、69、67、72、P を 67、71、69、74 と書き、対応する数を引いてください。四つとも +2 になります。この数字は数えやすくする道具で、暗記する新しい記譜法ではありません。
曲が分かることと、効果が同じことは別
移調しても音楽の印象は変わらない?
変わることがあります。高い版は目立ったり、明るく感じられたり、歌いにくくなったりします。楽器は音域によって音色が変わり、歌い手にも音域の限界があります。合成音色を固定した本実験でも、音域が変われば聞こえ方は変わります。保つのは音程構造であり、表現効果のすべてではありません。
曲の認識にはリズム、反復、歌詞、記憶も働きます。一音を変えても曲が分かることはあるため、「知っている曲だ」と感じるだけでは、全音程が同じかどうかは証明できません。
好きな旋律の出だしを、無理のない二つの高さから歌ってみましょう。どの跳躍を保ち、どこを声に合わせて狭めたかを観察します。「全体を動かした」「この音程を変えた」と具体的に説明してみてください。
次回は五線譜を使い、こうした音高関係を書いて読む方法を学びます。