aiPptTypography.mjs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { editorialFixture } from './aiPptEditorial.mjs'
  2. // 教学版式样例,不作为特定版本教材内容或模型实测结果。
  3. // 实物照片来自 Yamaha 官方产品页,不能替代具体曲目的谱例或指法示范。
  4. export const pianicaImageSource = 'https://usa.yamaha.com/products/musical_instruments/winds/pianica/p-32d/index.html'
  5. export function typographyFixture(image = 'https://usa.yamaha.com/files/p-32d_o_0001_f_735x735_4954d94cc3b6f1e8c6ca1863add42358.jpg') {
  6. const outline = editorialFixture()
  7. const make = (title, content, composition = 'concept_grid', type = 'knowledge') => ({
  8. type, title, studentContent: content, imageKeywords: [], requiredVisual: false,
  9. visualPlan: { composition, visualMode: 'text_only', imagePurpose: 'none', imageNecessity: 'none', textPresentation: 'plain' },
  10. speakerNotes: '结合教师现场示范进行练习,按学生实际表现反馈。'
  11. })
  12. outline.pages.splice(4, 0,
  13. make('把一句旋律吹连贯', { headline: '每次练习,留意一个细节', points: [
  14. '气息:让声音平稳延续,听清长音的结束。',
  15. '换气:在约定的位置停顿,下一句及时进入。',
  16. '表现:比较自己的两次演奏,说出声音的变化。'
  17. ] }),
  18. make('同伴互评的三个角度', { comparisonGroups: [
  19. { label: '连贯', points: ['长音保持到位了吗?', '乐句衔接自然吗?'] },
  20. { label: '稳定', points: ['速度保持一致了吗?', '声音是否平稳?'] },
  21. { label: '表达', points: ['能听出强弱变化吗?', '变化是否符合乐句?'] }
  22. ] }, 'comparison', 'practice_check'))
  23. outline.pages.splice(2, 0, {
  24. ...make('观察键盘,找到黑键组', { headline: '看图,再在自己的口风琴上找一找', points: [
  25. '黑键组:找出相邻的两个黑键和三个黑键。', '实物核对:指一指键盘和吹嘴,和同伴核对。'
  26. ] }, 'image_left', 'instrument_observation'),
  27. requiredVisual: true,
  28. image: { url: image, keyword: '口风琴实物', provider: 'Yamaha 官方产品页', width: 735, height: 735, reviewStatus: 'verified' },
  29. visualPlan: { composition: 'image_left', visualMode: 'reference_image', imageNecessity: 'essential', imagePurpose: 'observation', imageReason: '学生需对照真实键盘找出两黑键与三黑键组,文字不能替代观察对象。', imageFit: 'contain', textPresentation: 'cards', visualShare: .55 },
  30. speakerNotes: `先让学生指认照片中的黑键组,再迁移到手中的实物;本图只支持部件和键盘观察,不用于验证吹奏姿势或某曲指法。图片来源:${pianicaImageSource}`
  31. })
  32. outline.pages.splice(4, 0, {
  33. ...make('先分句,再连接', { comparisonGroups: [
  34. { label: '分句练习', points: ['按示范的速度吹一个乐句。', '把长音保持到约定的位置。'] },
  35. { label: '连接乐句', points: ['把相邻的两个乐句连起来。', '换气后及时进入下一句。'] }
  36. ], points: ['练习顺序:先完成一个乐句,再尝试连接两个乐句。'] }, 'comparison', 'performance_activity'),
  37. diagram: { kind: 'sequence', caption: '练习的先后关系', basis: '本课分句练习安排', items: [{ label: '分句练习' }, { label: '连接乐句' }] },
  38. visualPlan: { composition: 'comparison', visualMode: 'native_diagram', imageNecessity: 'none', imagePurpose: 'none', imageReason: '色块与顺序箭头已表达练习关系,无需外部图片。', textPresentation: 'plain' }
  39. })
  40. const actions = [
  41. ['准备口风琴和本课已选定的短旋律,口头说明今天练习连贯吹奏。', '准备好乐器,听清本课任务。', '能够说出今天练习连贯和换气。'],
  42. ['读学习任务,请学生选出自己最想改进的一项。', '说出自己要重点练习的一项。', '能把学习任务和一次具体练习联系起来。'],
  43. ['先展示实物照片,再让学生在自己的口风琴上指认;型号差异以实际乐器为准。', '找到两个黑键和三个黑键的相邻组,和同伴核对。', '能在照片和实物上分别指出一组两黑键与一组三黑键。'],
  44. ['用同一旋律和速度示范两遍:第一遍在乐句中途停顿,第二遍在乐句结束处换气。不要提前揭示结论。', '比较两次示范,说出一处听到的差别。', '能指出哪一遍的乐句衔接更自然,并说出停顿位置的依据。'],
  45. ['示范一个乐句的结束,再示范两个乐句连接;约定换气位置后让学生尝试。', '先吹一个乐句,再连接两个乐句。', '长音保持到位,换气后能及时进入。'],
  46. ['按本页四个步骤组织练习,每次只纠正一个问题;使用课前选定且学生已学过的短旋律。', '依次完成聆听、分句、连接和同伴反馈。', '两次练习之间有一处明确改善,同伴能指出具体位置。'],
  47. ['分别示范声音不稳定、换气过迟与平稳连接,让学生每次只关注一个细节。', '选一个细节,比较并改进自己的吹奏。', '能说出关注的细节,并在第二次尝试中作出调整。'],
  48. ['两人交换演奏与观察角色,从三个角度中选一项反馈,避免只说“很好”。', '给同伴一条有具体乐句依据的反馈。', '反馈包含具体位置、听到的现象和一个改进建议。'],
  49. ['同一短旋律示范两遍:一次在乐句中途换气,一次在乐句结束处换气。允许学生说明不同听感。', '判断哪一次换气更自然,并说出听到的依据。', '能把判断与乐句停顿位置联系起来。'],
  50. ['请学生说出一处进步和一个下次目标,围绕同一个乐句再练一次。', '回顾进步,选择一个问题再练习。', '能说明进步的具体表现,并给出可执行的练习目标。']
  51. ]
  52. outline.pages.forEach((page, i) => {
  53. const [teacherInstruction, studentTask, successCriteria] = actions[i]
  54. page.teachingPurpose = i === 0 ? '明确学习任务' : `通过“${page.title}”改进口风琴观察、聆听或实践表现。`
  55. page.learningEvidence = successCriteria
  56. page.classroomAction = { teacherInstruction, studentTask, successCriteria }
  57. page.durationMinutes = [1, 2, 3, 4, 3, 8, 5, 5, 3, 2][i]
  58. page.speakerNotes = `${teacherInstruction}\n判断标准:${successCriteria}\n${page.speakerNotes}`
  59. page.visualPlan.imageReason ||= '文字、教学色块或教师现场示范能够完成本页任务,无需外部图片。'
  60. })
  61. // 开放判断题的答案只供教师参考,不出现在学生画面。
  62. const question = outline.pages.find(page => page.title === '听完再判断')
  63. question.interaction = { type: 'question', question: question.studentContent.headline, answer: '在乐句结束处换气通常更自然。', explanation: '依据示范中停顿的位置及下一句的进入是否及时作出判断。' }
  64. outline.pages.find(page => page.title === '同伴互评的三个角度').type = 'peer_review'
  65. outline.pages.find(page => page.title === '哪一次演奏更连贯?').studentContent.comparisonGroups[1].points = ['长音的结尾是否完整?', '乐句衔接有什么变化?']
  66. outline.pages.forEach((page, i) => { page.pageNo = i + 1 })
  67. return outline
  68. }