歌手重复一句,伴奏却变了。曲调依然熟悉,某个音现在似乎更安定或更突出,而歌手可能一个音都没改。
旋律音的角色,要相对于同时响起的和声来理解。 这里固定旋律、改变背景,再检查一个短暂连接两和弦音的音。建议留十至十二分钟,逐对重听。
跟同一个音走过三种背景
先听「仅旋律」,记住开头的 E。接着比较 C 大三与 A 小三背景,先跟这个 E,再评价整句,最后试 F 大三。
正在呈现知识画面
同一旋律,三种背景E4 G4 A4 G4 E4 D4 C4 C4 可独奏,或配反复的 C 大、A 小、F 大三和弦。只改变伴奏。
{"id":"music-harmony-backdrop","title":"同一旋律,三种背景","summary":"E4 G4 A4 G4 E4 D4 C4 C4 可独奏,或配反复的 C 大、A 小、F 大三和弦。只改变伴奏。","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\":41,\"max\":69,\"blind\":false,\"variants\":[{\"score\":{\"bpm\":90,\"beats\":8,\"events\":[{\"midi\":64,\"hz\":329.627557,\"beat\":0,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":67,\"hz\":391.995436,\"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\":67,\"hz\":391.995436,\"beat\":3,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":64,\"hz\":329.627557,\"beat\":4,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":62,\"hz\":293.664768,\"beat\":5,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":60,\"hz\":261.625565,\"beat\":6,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":60,\"hz\":261.625565,\"beat\":7,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"}]},\"notation\":\"E4 G4 A4 G4 E4 D4 C4 C4\",\"groups\":[]},{\"score\":{\"bpm\":90,\"beats\":8,\"events\":[{\"midi\":64,\"hz\":329.627557,\"beat\":0,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":67,\"hz\":391.995436,\"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\":67,\"hz\":391.995436,\"beat\":3,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":64,\"hz\":329.627557,\"beat\":4,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":62,\"hz\":293.664768,\"beat\":5,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":60,\"hz\":261.625565,\"beat\":6,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":60,\"hz\":261.625565,\"beat\":7,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":48,\"hz\":130.812783,\"beat\":0,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":52,\"hz\":164.813778,\"beat\":0,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":55,\"hz\":195.997718,\"beat\":0,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":48,\"hz\":130.812783,\"beat\":2,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":52,\"hz\":164.813778,\"beat\":2,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":55,\"hz\":195.997718,\"beat\":2,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":48,\"hz\":130.812783,\"beat\":4,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":52,\"hz\":164.813778,\"beat\":4,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":55,\"hz\":195.997718,\"beat\":4,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":48,\"hz\":130.812783,\"beat\":6,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":52,\"hz\":164.813778,\"beat\":6,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":55,\"hz\":195.997718,\"beat\":6,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"}]},\"notation\":\"C3 E3 G3 + E4 G4 A4 G4 E4 D4 C4 C4\",\"groups\":[]},{\"score\":{\"bpm\":90,\"beats\":8,\"events\":[{\"midi\":64,\"hz\":329.627557,\"beat\":0,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":67,\"hz\":391.995436,\"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\":67,\"hz\":391.995436,\"beat\":3,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":64,\"hz\":329.627557,\"beat\":4,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":62,\"hz\":293.664768,\"beat\":5,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":60,\"hz\":261.625565,\"beat\":6,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":60,\"hz\":261.625565,\"beat\":7,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":45,\"hz\":110.0,\"beat\":0,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":48,\"hz\":130.812783,\"beat\":0,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":52,\"hz\":164.813778,\"beat\":0,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":45,\"hz\":110.0,\"beat\":2,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":48,\"hz\":130.812783,\"beat\":2,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":52,\"hz\":164.813778,\"beat\":2,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":45,\"hz\":110.0,\"beat\":4,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":48,\"hz\":130.812783,\"beat\":4,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":52,\"hz\":164.813778,\"beat\":4,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":45,\"hz\":110.0,\"beat\":6,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":48,\"hz\":130.812783,\"beat\":6,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":52,\"hz\":164.813778,\"beat\":6,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"}]},\"notation\":\"A2 C3 E3 + E4 G4 A4 G4 E4 D4 C4 C4\",\"groups\":[]},{\"score\":{\"bpm\":90,\"beats\":8,\"events\":[{\"midi\":64,\"hz\":329.627557,\"beat\":0,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":67,\"hz\":391.995436,\"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\":67,\"hz\":391.995436,\"beat\":3,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":64,\"hz\":329.627557,\"beat\":4,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":62,\"hz\":293.664768,\"beat\":5,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":60,\"hz\":261.625565,\"beat\":6,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":60,\"hz\":261.625565,\"beat\":7,\"duration\":0.5,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":41,\"hz\":87.307058,\"beat\":0,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":45,\"hz\":110.0,\"beat\":0,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":48,\"hz\":130.812783,\"beat\":0,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":41,\"hz\":87.307058,\"beat\":2,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":45,\"hz\":110.0,\"beat\":2,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":48,\"hz\":130.812783,\"beat\":2,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":41,\"hz\":87.307058,\"beat\":4,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":45,\"hz\":110.0,\"beat\":4,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":48,\"hz\":130.812783,\"beat\":4,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":41,\"hz\":87.307058,\"beat\":6,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":45,\"hz\":110.0,\"beat\":6,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":48,\"hz\":130.812783,\"beat\":6,\"duration\":1.15,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"}]},\"notation\":\"F2 A2 C3 + E4 G4 A4 G4 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":"用这版记住旋律。其他版本的旋律音和时间与它完全一致。","fact1":"开头 E 是 C–E–G 的三音。","fact2":"同一个开头 E 现在是 A–C–E 的五音。","fact3":"E 不在底层 F–A–C 三和弦中;叠起来也可以听成 F 大七和弦的音响。","heading":"同一旋律,三种背景","idle":"选择版本后播放。修改会停止播放,每段播完自动停止。","intro":"先跟住第一个 E,再比较整句。每版旋律完全相同。","key":"从左向右读。横条表示起音与预设时长,上下叠放表示同时发声。也可直接读音名与说明。","option0":"仅旋律","option1":"配 C 大三","option2":"配 A 小三","option3":"配 F 大三","play":"播放此版","playing":"正在播放,可随时停止。","seconds":"秒","starting":"正在准备声音…","stop":"停止","volume":"音量"}}
在 C–E–G 上,E 是三音;在 A–C–E 上,E 是五音。它的频率没变,与其他音的关系变了。这里伴奏比旋律低,所以相同音级可以处于不同八度。
在 F–A–C 上,E 不属于底层三和弦,但不因此成为错误。F–A–C–E 叠起来也可构成 F 大七和弦音响。把 E 描述为三和弦上的旋律音,还是较大和弦的一部分,取决于语境与正在分析的问题。
| 背景三和弦 | 开头 E 的角色 | 保持不变的内容 |
| C–E–G | 三音 | 旋律音高、起音与音色 |
| A–C–E | 五音 | 旋律音高、起音与音色 |
| F–A–C | 三和弦外的音;扩展和弦中可作七音 | 旋律音高、起音与音色 |
整句还有其他关系,例如 A 不属于 C–E–G,却属于 A–C–E 与 F–A–C。只分析开头 E 不能解释每个时刻。下一遍换跟另一个音,观察它的角色。
图中较淡的下方横条是反复和弦,上方较实的横条是旋律;横向对齐表示声音同时发生。图太密时,读音名序列并返回旋律独奏版即可。
「外面的音」可以连接「里面的音」
和弦音属于当前作为参照的和弦;和弦外音不属于它。标签描述某一时刻的关系,不是永久的好音、坏音等级。
C 大三背景上的 C–D–E 中,C、E 是和弦音,D 位于两者之间,以同方向级进连接。这里短暂的 D 是一个简单的经过音例子:经过音以同方向级进连接和弦音。和弦外音
先听短 D,再听长 D,留意中间音在 E 到达前暴露了多久。
正在呈现知识画面
和弦外的音:经过还是停留?C 大三上走 C–D–E:D 在第一拍后半拍起音。经过版长 0.28 秒,停留版长 0.9 秒;E 在第二拍或第三拍到来。另用 G–A–B 迁移练习。
{"id":"music-harmony-passing","title":"和弦外的音:经过还是停留?","summary":"C 大三上走 C–D–E:D 在第一拍后半拍起音。经过版长 0.28 秒,停留版长 0.9 秒;E 在第二拍或第三拍到来。另用 G–A–B 迁移练习。","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\":48,\"max\":71,\"blind\":false,\"variants\":[{\"score\":{\"bpm\":90,\"beats\":4,\"events\":[{\"midi\":48,\"hz\":130.812783,\"beat\":0,\"duration\":2,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":52,\"hz\":164.813778,\"beat\":0,\"duration\":2,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":55,\"hz\":195.997718,\"beat\":0,\"duration\":2,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":60,\"hz\":261.625565,\"beat\":0,\"duration\":0.28,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":62,\"hz\":293.664768,\"beat\":0.5,\"duration\":0.28,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":64,\"hz\":329.627557,\"beat\":1,\"duration\":1.3,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"}]},\"notation\":\"C4 → D4 → E4\",\"groups\":[]},{\"score\":{\"bpm\":90,\"beats\":4,\"events\":[{\"midi\":48,\"hz\":130.812783,\"beat\":0,\"duration\":2,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":52,\"hz\":164.813778,\"beat\":0,\"duration\":2,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":55,\"hz\":195.997718,\"beat\":0,\"duration\":2,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":60,\"hz\":261.625565,\"beat\":0,\"duration\":0.28,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":62,\"hz\":293.664768,\"beat\":0.5,\"duration\":0.9,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":64,\"hz\":329.627557,\"beat\":2,\"duration\":0.7,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"}]},\"notation\":\"C4 → D4 —— → E4\",\"groups\":[]},{\"score\":{\"bpm\":90,\"beats\":4,\"events\":[{\"midi\":55,\"hz\":195.997718,\"beat\":0,\"duration\":2,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":59,\"hz\":246.941651,\"beat\":0,\"duration\":2,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":62,\"hz\":293.664768,\"beat\":0,\"duration\":2,\"gain\":0.45,\"wave\":\"triangle\",\"layer\":\"chord\"},{\"midi\":67,\"hz\":391.995436,\"beat\":0,\"duration\":0.28,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":69,\"hz\":440.0,\"beat\":0.5,\"duration\":0.28,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"},{\"midi\":71,\"hz\":493.883301,\"beat\":1,\"duration\":1.3,\"gain\":0.8,\"wave\":\"triangle\",\"layer\":\"melody\"}]},\"notation\":\"G4 → A4 → B4\",\"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":"D 以级进连接 C 与 E,短暂经过两个和弦音之间。","fact1":"D 更突出,E 晚一拍到。音高顺序和伴奏固定。","fact2":"在 G–B–D 上,短 A 起对应的经过作用。","heading":"和弦外的音:经过还是停留?","idle":"选择版本后播放。修改会停止播放,每段播完自动停止。","intro":"同一三音旋律配同一和弦。第二版中间音更长,后一个音更晚到。","key":"从左向右读。横条表示起音与预设时长,上下叠放表示同时发声。也可直接读音名与说明。","option0":"C–D–E · 短 D","option1":"C–D–E · 长 D","option2":"新例 · G–A–B","play":"播放此版","playing":"正在播放,可随时停止。","seconds":"秒","starting":"正在准备声音…","stop":"停止","volume":"音量"}}
两个 C–D–E 版本中,D 都在第一拍后半拍开始。短版让 E 在第二拍到达;停留版延长 D,把 E 推迟到第三拍。音高顺序与底层和弦固定,时长与到达时刻一起改变。
较长 D 可能更引人注意,也可能更让人期待后续,但仍以级进连接相同两音。变长不自动等于错音,单靠时长也不能决定所有分析标签。
在新例子中判断角色
模型第三版在 G–B–D 上弹 G–A–B。哪个旋律音不在底层三和弦里?它怎样连接前后两音?再想象旋律不变,伴奏改成 A–C–E:A 还是和弦外音吗?
查看答案与参照和弦的变化
在 G–B–D 上,A 是和弦外音,通过上行级进短暂连接 G 与 B,作用对应 C 大三例子里的 D。
在 A–C–E 上,A 是根音,属于和弦音。参照和声改变,标签随之改变。因此,必须先说明或推断和弦,才能判断旋律音是否属于它。
旋律是否只由和弦音与经过音组成?
不是。辅助音、延留音、先现音、扩展音及其他关系都需要更多语境。有的音乐也并不围绕常规三和弦进行组织。本课两种标签只是比较起点,不是要求旋律只能在和弦音之间移动、偶尔短暂例外。
同一个音还可能因分析的和声尺度不同而有不同解释:它不在三和弦里,却在七和弦里。先说明假设的背景,再讨论标签。
在熟悉歌曲中找重复旋律但低音或伴奏不同的片段,跟住一个延长音。先描述「音没变,背景变了」,再补上能听出或核对的关系。下一课把音高关系固定,转而改变音色与声音层次。