一串等距声音,还没有告诉我们应该怎样分组。想象连续脚步:你可以数「一 二、一 二」,也可以数「一 二 三、一 二 三」。间隔不变,组织方式已经不同。
节拍组织把拍子按周期分成组,常包含强弱位置的关系。 这课练两件事:跟住稳定脉冲,再找哪一拍像每组的开始。建议留十分钟,音量保持舒适。
播放前先预测
下面两版都有十二个声音,一版每两音加重一次,另一版每三音加重一次。哪版组首更多?哪版先结束?
每个声音都打一拍,不要只跟响的声音。然后把分组数出来。切换版本时,尽量保持每次打拍的间隔不变。
正在呈现知识画面
同一脉冲,两种分组十二次起音始终相隔 0.6 秒。重音每两次或三次出现;起音位置和音色不变。
{"id":"music-meter-groups","title":"同一脉冲,两种分组","summary":"十二次起音始终相隔 0.6 秒。重音每两次或三次出现;起音位置和音色不变。","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\":\"pulse\",\"blind\":false,\"variants\":[{\"score\":{\"bpm\":100,\"beats\":12,\"events\":[{\"midi\":79,\"hz\":783.990872,\"beat\":0,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":1,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":2,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":3,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":4,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":5,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":6,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":7,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":8,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":9,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":10,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":11,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"}]},\"notation\":\"100 BPM\",\"groups\":[\"1 2\",\"1 2\",\"1 2\",\"1 2\",\"1 2\",\"1 2\"]},{\"score\":{\"bpm\":100,\"beats\":12,\"events\":[{\"midi\":79,\"hz\":783.990872,\"beat\":0,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":1,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":2,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":3,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":4,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":5,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":6,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":7,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":8,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":9,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":10,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":11,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"}]},\"notation\":\"100 BPM\",\"groups\":[\"1 2 3\",\"1 2 3\",\"1 2 3\",\"1 2 3\"]}]};\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":"四组,每组三拍;脉冲速度完全相同。","heading":"同一脉冲,两种分组","idle":"选择版本后播放。修改会停止播放,每段播完自动停止。","intro":"每个声音都打一下拍,再朝重音数:一 二,或一 二 三。","key":"高柱标记预设强重音,下方分组表示计数方式;柱高不是主观响度测量。","option0":"每 2 拍一组","option1":"每 3 拍一组","play":"播放此版","playing":"正在播放,可随时停止。","seconds":"秒","starting":"正在准备声音…","stop":"停止","volume":"音量"}}
两版都在 7.2 秒后结束,脉冲均为 100 BPM,即每 0.6 秒一次。两拍分组有六个组首,三拍分组有四个。改变分组,并不需要加速。
柱高表示预设音符增益,用来标记重音,不是主观响度的测量。下方数字分组提供不播放也能跟踪的方式。
重音可以来自音量、时长、音区、奏法或和声变化。第一模型只改增益,方便单独比较。真实演奏不必把每小节第一拍都重重敲出来;节拍建立后,实际重音甚至可以与它形成冲突。
细分、拍、小节不是同一层级
| 层级 | 跟随什么 | 一个简单三拍小节中的例子 |
| 细分 | 拍内更小的等分 | 一 and 二 and 三 and |
| 拍 | 选来计数的规律脉冲 | 一、二、三 |
| 小节 | 周期重复的一组拍 | 从一个「一」到下一个「一」 |
拍号是组织这些时值的记谱方式。3/4 的上方数字表示每小节三个四分音符拍,下方数字说明四分音符单位。四分音符是时值单位,不等于固定秒数;实际多长还取决于速度。
但不能把「分子等于实际感受的拍数」机械套到所有拍号。6/8 通常按复拍子理解:六个八分音符组成两个较大拍,每拍是附点四分音符,每拍三等分。3/4 则通常每拍二等分。节拍与拍号
六个小格,不等于同一种节拍
第一版数「一 and 二 and 三 and」,第二版数「一 la li 二 la li」。这些音节只是计数辅助。留意一小节内,较大拍是三个还是两个。
正在呈现知识画面
六个细分:2+2+2 还是 3+3?每格 0.3 秒;在 0、2、4 格加重表现 3/4 的三拍,在 0、3 格加重表现 6/8 的两拍。两小节均长 3.6 秒。
{"id":"music-meter-six","title":"六个细分:2+2+2 还是 3+3?","summary":"每格 0.3 秒;在 0、2、4 格加重表现 3/4 的三拍,在 0、3 格加重表现 6/8 的两拍。两小节均长 3.6 秒。","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\":\"pulse\",\"blind\":false,\"variants\":[{\"score\":{\"bpm\":100,\"beats\":6.0,\"events\":[{\"midi\":79,\"hz\":783.990872,\"beat\":0.0,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":0.5,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":1.0,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":1.5,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":2.0,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":2.5,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":3.0,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":3.5,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":4.0,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":4.5,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":5.0,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":5.5,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"}]},\"notation\":\"♩ = 100\",\"groups\":[\"1 &\",\"2 &\",\"3 &\",\"1 &\",\"2 &\",\"3 &\"]},{\"score\":{\"bpm\":100,\"beats\":6.0,\"events\":[{\"midi\":79,\"hz\":783.990872,\"beat\":0.0,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":0.5,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":1.0,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":1.5,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":2.0,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":2.5,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":3.0,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":3.5,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":4.0,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":4.5,\"duration\":0.09,\"gain\":1,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":5.0,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"},{\"midi\":79,\"hz\":783.990872,\"beat\":5.5,\"duration\":0.09,\"gain\":0.32,\"wave\":\"sine\",\"layer\":\"pulse\"}]},\"notation\":\"♩. ≈ 66.7\",\"groups\":[\"1 la li\",\"2 la li\",\"1 la li\",\"2 la li\"]}]};\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":"每小节三个四分音符拍,每拍分两个八分音符。四分音符 = 100 BPM。","fact1":"每小节两个附点四分音符拍,每拍分三个八分音符。附点四分音符 ≈ 66.7 BPM。","heading":"六个细分:2+2+2 还是 3+3?","idle":"选择版本后播放。修改会停止播放,每段播完自动停止。","intro":"听较大的拍子。两段都把同样的六格重复两遍。","key":"高柱标记预设强重音,下方分组表示计数方式;柱高不是主观响度测量。","option0":"3/4 · 2+2+2","option1":"6/8 · 3+3","play":"播放此版","playing":"正在播放,可随时停止。","seconds":"秒","starting":"正在准备声音…","stop":"停止","volume":"音量"}}
两版固定的是八分音符细分:每格 0.3 秒。因此 3/4 的四分音符拍为 100 BPM,6/8 的附点四分音符拍约为 66.7 BPM;小节都长 1.8 秒。小步一样快,大拍单位不同。
所以单写 BPM 数值可能误导,还要说明数的是哪种音符。若改成四分音符与附点四分音符都为 100 BPM,3/4 的三拍小节长 1.8 秒,6/8 的两拍小节长 1.2 秒。那就不是本实验固定细分速度的比较了。
在新格子上检查分组
想象十二个等距八分音符,在第 1、4、7、10 个位置加重,每六个音为一小节。每小节是 2+2+2,还是 3+3?两小节一共有几个较大拍?
查看答案,以及计数的陷阱
重音每三个细分开始一次,因此每小节是 3+3,两个较大拍,两小节共四拍。可把「一 la li 二 la li」数两遍。
发声事件仍有十二个。若把十二个都叫「拍」,就换了计数层级,遮蔽了这道题要区分的关系。可能混淆时,务必指出所数的单位。
只凭一个重音型,就能判断一首歌的拍号吗?
不能可靠判断。乐句可能强调意外的细分、省略明显的强拍,或暂时形成交错节奏。慢速 6/8 也可能让人逐个数六个八分音符。要多听几小节,并比较旋律、低音与和声变化。本课明确指定分组,是为了先把概念分清。
听熟悉歌曲时,先找舒适的脉冲,再判断较长周期在哪里重新开始。连续尝试数二、三或四,检查哪个能对齐重复的音乐事件。若有多种合理听法,就记录各自依据。目标是解释听到的组织,而不是凭几秒钟猜印在谱上的拍号。