@onjmin/dtm 0.1.82 → 0.1.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -52,6 +52,7 @@ __export(index_exports, {
52
52
  applyHarmonicFilter: () => applyHarmonicFilter,
53
53
  applyMonophonic: () => applyMonophonic,
54
54
  buildChordPlacements: () => buildChordPlacements,
55
+ buildDrumPatternJson: () => buildDrumPatternJson,
55
56
  buildNameToKeyMapping: () => buildNameToKeyMapping,
56
57
  collectPitchTokens: () => collectPitchTokens,
57
58
  createAudioContext: () => createAudioContext,
@@ -74,12 +75,15 @@ __export(index_exports, {
74
75
  drawSelectionRect: () => drawSelectionRect,
75
76
  encodeMml: () => encodeMml,
76
77
  exportMIDI: () => exportMIDI,
78
+ extractDrumPatternFromNotes: () => extractDrumPatternFromNotes,
79
+ extractMidiDrumPattern: () => extractMidiDrumPattern,
77
80
  extractMidiPlacements: () => extractMidiPlacements,
78
81
  extractMidiPlacementsByTrack: () => extractMidiPlacementsByTrack,
79
82
  formatMmlMeta: () => formatMmlMeta,
80
83
  freqFromPitch: () => freqFromPitch,
81
84
  generateRandomPattern: () => generateRandomPattern,
82
85
  getDrawOffset: () => getDrawOffset,
86
+ getDrumPatternKeys: () => getDrumPatternKeys,
83
87
  getGridCanvas: () => getGridCanvas,
84
88
  getGridContext: () => getGridContext,
85
89
  getGridPosition: () => getGridPosition,
@@ -97,6 +101,7 @@ __export(index_exports, {
97
101
  mountChordPlayer: () => mountChordPlayer,
98
102
  mountDAW: () => mountDAW,
99
103
  mountMmlPlayer: () => mountMmlPlayer,
104
+ normalizeDrumPatterns: () => normalizeDrumPatterns,
100
105
  normalizeLyrics: () => normalizeLyrics,
101
106
  onClick: () => onClick,
102
107
  panToStereo: () => panToStereo,
@@ -109,6 +114,7 @@ __export(index_exports, {
109
114
  playNote: () => playNote,
110
115
  playPlacements: () => playPlacements,
111
116
  playSingingMML: () => playSingingMML,
117
+ resolveDrumPattern: () => resolveDrumPattern,
112
118
  resolveLoopPoint: () => resolveLoopPoint,
113
119
  setBackgroundActive: () => setBackgroundActive,
114
120
  setDrawOffset: () => setDrawOffset,
@@ -1261,128 +1267,201 @@ var CHORD_INFO_HTML = `
1261
1267
  // src/drum-config.ts
1262
1268
  var DRUM_FONT = "FluidR3_GM_sf2_file";
1263
1269
  var DRUM_KEYS = {
1264
- kick: 36,
1265
- snare: 38,
1266
- clap: 39,
1267
- rimshot: 37,
1268
- hihatClosed: 42,
1269
- hihatPedal: 44,
1270
- hihatOpen: 46,
1271
- tomLow: 45,
1272
- tomMid: 47,
1273
- tomHigh: 50,
1274
- crash: 49,
1275
- ride: 51,
1276
- splash: 55,
1270
+ bassDrum1: 36,
1271
+ acousticSnare: 38,
1272
+ handClap: 39,
1273
+ sideStick: 37,
1274
+ closedHihat: 42,
1275
+ pedalHihat: 44,
1276
+ openHihat: 46,
1277
+ lowTom: 45,
1278
+ lowMidTom: 47,
1279
+ highTom: 50,
1280
+ crashCymbal1: 49,
1281
+ rideCymbal1: 51,
1282
+ splashCymbal: 55,
1277
1283
  tambourine: 54
1278
1284
  };
1285
+ var normalizeDrumPatterns = (patterns) => {
1286
+ const normalized = {};
1287
+ for (const [k, v] of Object.entries(patterns)) {
1288
+ if (Array.isArray(v) || v && Array.isArray(v.pattern) === false && Array.isArray(v)) {
1289
+ normalized[k] = { label: k, pattern: v };
1290
+ } else {
1291
+ normalized[k] = v;
1292
+ }
1293
+ }
1294
+ return normalized;
1295
+ };
1296
+ var resolveDrumPattern = (name, dict, currentBar) => {
1297
+ const def = dict[name];
1298
+ if (!def) return null;
1299
+ const patternObj = def.pattern;
1300
+ if (Array.isArray(patternObj) && patternObj.length > 0 && "ranges" in patternObj[0]) {
1301
+ const songDef = patternObj;
1302
+ const instructions = songDef.filter(
1303
+ (i) => i.ranges.some(([s, e]) => currentBar >= s && currentBar <= e)
1304
+ );
1305
+ if (instructions.length > 0) {
1306
+ return instructions.flatMap((i) => {
1307
+ const maxStep = Math.max(...i.pattern.map((p) => p.step), 0);
1308
+ const loopLengthBars = i.patternBars ?? Math.max(1, Math.ceil((maxStep + 1) / 192));
1309
+ const range = i.ranges.find(
1310
+ ([s, e]) => currentBar >= s && currentBar <= e
1311
+ );
1312
+ const startBar = range ? range[0] : 1;
1313
+ const barInLoop = (currentBar - startBar) % loopLengthBars;
1314
+ const stepOffset = barInLoop * 192;
1315
+ return i.pattern.filter((p) => p.step >= stepOffset && p.step < stepOffset + 192).map((p) => ({ ...p, step: p.step - stepOffset }));
1316
+ });
1317
+ }
1318
+ }
1319
+ return patternObj ?? null;
1320
+ };
1279
1321
  var DRUM_PATTERNS = {
1280
1322
  // 4つ打ち:より重厚に。1拍目の頭にだけ軽くオープンハイハットを混ぜるのもアリ
1281
- "4beat": [
1282
- { step: 0, pitch: DRUM_KEYS.kick, velocity: 1 },
1283
- { step: 48, pitch: DRUM_KEYS.kick, velocity: 0.9 },
1284
- { step: 96, pitch: DRUM_KEYS.kick, velocity: 1 },
1285
- { step: 144, pitch: DRUM_KEYS.kick, velocity: 0.9 }
1286
- ],
1323
+ "4beat": {
1324
+ label: "4\u3064\u6253\u3061",
1325
+ pattern: [
1326
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 1 },
1327
+ { step: 48, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
1328
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 1 },
1329
+ { step: 144, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 }
1330
+ ]
1331
+ },
1287
1332
  // 8ビート:クローズドハイハットに強弱をつけ、スネアにクラップを薄く重ねる
1288
- "8beat": [
1289
- { step: 0, pitch: DRUM_KEYS.kick, velocity: 1 },
1290
- { step: 0, pitch: DRUM_KEYS.hihatClosed, velocity: 0.8 },
1291
- { step: 24, pitch: DRUM_KEYS.hihatClosed, velocity: 0.5 },
1292
- { step: 48, pitch: DRUM_KEYS.snare, velocity: 1 },
1293
- { step: 48, pitch: DRUM_KEYS.clap, velocity: 0.6 },
1294
- { step: 48, pitch: DRUM_KEYS.hihatClosed, velocity: 0.8 },
1295
- { step: 72, pitch: DRUM_KEYS.hihatClosed, velocity: 0.5 },
1296
- { step: 96, pitch: DRUM_KEYS.kick, velocity: 0.9 },
1297
- { step: 96, pitch: DRUM_KEYS.hihatClosed, velocity: 0.8 },
1298
- { step: 120, pitch: DRUM_KEYS.hihatClosed, velocity: 0.5 },
1299
- { step: 144, pitch: DRUM_KEYS.snare, velocity: 1 },
1300
- { step: 144, pitch: DRUM_KEYS.hihatClosed, velocity: 0.8 },
1301
- { step: 168, pitch: DRUM_KEYS.hihatClosed, velocity: 0.5 }
1302
- ],
1333
+ "8beat": {
1334
+ label: "8\u30D3\u30FC\u30C8",
1335
+ pattern: [
1336
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 1 },
1337
+ { step: 0, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
1338
+ { step: 24, pitch: DRUM_KEYS.closedHihat, velocity: 0.5 },
1339
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 1 },
1340
+ { step: 48, pitch: DRUM_KEYS.handClap, velocity: 0.6 },
1341
+ { step: 48, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
1342
+ { step: 72, pitch: DRUM_KEYS.closedHihat, velocity: 0.5 },
1343
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
1344
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
1345
+ { step: 120, pitch: DRUM_KEYS.closedHihat, velocity: 0.5 },
1346
+ { step: 144, pitch: DRUM_KEYS.acousticSnare, velocity: 1 },
1347
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
1348
+ { step: 168, pitch: DRUM_KEYS.closedHihat, velocity: 0.5 }
1349
+ ]
1350
+ },
1303
1351
  // 16ビート:キックのダブル(96, 108)を活かしつつ、ハイハットの強弱を細かく設定
1304
- "16beat": [
1305
- { step: 0, pitch: DRUM_KEYS.kick, velocity: 1 },
1306
- { step: 0, pitch: DRUM_KEYS.hihatClosed, velocity: 0.8 },
1307
- { step: 12, pitch: DRUM_KEYS.hihatClosed, velocity: 0.4 },
1308
- { step: 24, pitch: DRUM_KEYS.hihatClosed, velocity: 0.6 },
1309
- { step: 36, pitch: DRUM_KEYS.hihatClosed, velocity: 0.4 },
1310
- { step: 48, pitch: DRUM_KEYS.snare, velocity: 1 },
1311
- { step: 48, pitch: DRUM_KEYS.hihatClosed, velocity: 0.8 },
1312
- { step: 60, pitch: DRUM_KEYS.hihatClosed, velocity: 0.4 },
1313
- { step: 72, pitch: DRUM_KEYS.hihatClosed, velocity: 0.6 },
1314
- { step: 84, pitch: DRUM_KEYS.hihatClosed, velocity: 0.4 },
1315
- { step: 96, pitch: DRUM_KEYS.kick, velocity: 0.9 },
1316
- { step: 96, pitch: DRUM_KEYS.hihatClosed, velocity: 0.8 },
1317
- { step: 108, pitch: DRUM_KEYS.kick, velocity: 0.7 },
1318
- { step: 108, pitch: DRUM_KEYS.hihatClosed, velocity: 0.4 },
1319
- { step: 120, pitch: DRUM_KEYS.hihatClosed, velocity: 0.6 },
1320
- { step: 132, pitch: DRUM_KEYS.hihatClosed, velocity: 0.4 },
1321
- { step: 144, pitch: DRUM_KEYS.snare, velocity: 1 },
1322
- { step: 144, pitch: DRUM_KEYS.hihatClosed, velocity: 0.8 },
1323
- { step: 156, pitch: DRUM_KEYS.hihatClosed, velocity: 0.4 },
1324
- { step: 168, pitch: DRUM_KEYS.hihatClosed, velocity: 0.6 },
1325
- { step: 180, pitch: DRUM_KEYS.hihatClosed, velocity: 0.4 }
1326
- ],
1352
+ "16beat": {
1353
+ label: "16\u30D3\u30FC\u30C8",
1354
+ pattern: [
1355
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 1 },
1356
+ { step: 0, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
1357
+ { step: 12, pitch: DRUM_KEYS.closedHihat, velocity: 0.4 },
1358
+ { step: 24, pitch: DRUM_KEYS.closedHihat, velocity: 0.6 },
1359
+ { step: 36, pitch: DRUM_KEYS.closedHihat, velocity: 0.4 },
1360
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 1 },
1361
+ { step: 48, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
1362
+ { step: 60, pitch: DRUM_KEYS.closedHihat, velocity: 0.4 },
1363
+ { step: 72, pitch: DRUM_KEYS.closedHihat, velocity: 0.6 },
1364
+ { step: 84, pitch: DRUM_KEYS.closedHihat, velocity: 0.4 },
1365
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
1366
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
1367
+ { step: 108, pitch: DRUM_KEYS.bassDrum1, velocity: 0.7 },
1368
+ { step: 108, pitch: DRUM_KEYS.closedHihat, velocity: 0.4 },
1369
+ { step: 120, pitch: DRUM_KEYS.closedHihat, velocity: 0.6 },
1370
+ { step: 132, pitch: DRUM_KEYS.closedHihat, velocity: 0.4 },
1371
+ { step: 144, pitch: DRUM_KEYS.acousticSnare, velocity: 1 },
1372
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
1373
+ { step: 156, pitch: DRUM_KEYS.closedHihat, velocity: 0.4 },
1374
+ { step: 168, pitch: DRUM_KEYS.closedHihat, velocity: 0.6 },
1375
+ { step: 180, pitch: DRUM_KEYS.closedHihat, velocity: 0.4 }
1376
+ ]
1377
+ },
1327
1378
  // シャッフル:跳ねるタイミングのベロシティを落として、グルーヴ感を強調
1328
- shuffle: [
1329
- { step: 0, pitch: DRUM_KEYS.kick, velocity: 1 },
1330
- { step: 0, pitch: DRUM_KEYS.hihatClosed, velocity: 0.8 },
1331
- { step: 32, pitch: DRUM_KEYS.hihatClosed, velocity: 0.5 },
1332
- { step: 48, pitch: DRUM_KEYS.snare, velocity: 1 },
1333
- { step: 48, pitch: DRUM_KEYS.hihatClosed, velocity: 0.8 },
1334
- { step: 80, pitch: DRUM_KEYS.hihatClosed, velocity: 0.5 },
1335
- { step: 96, pitch: DRUM_KEYS.kick, velocity: 0.9 },
1336
- { step: 96, pitch: DRUM_KEYS.hihatClosed, velocity: 0.8 },
1337
- { step: 128, pitch: DRUM_KEYS.hihatClosed, velocity: 0.5 },
1338
- { step: 144, pitch: DRUM_KEYS.snare, velocity: 1 },
1339
- { step: 144, pitch: DRUM_KEYS.hihatClosed, velocity: 0.8 },
1340
- { step: 176, pitch: DRUM_KEYS.hihatClosed, velocity: 0.5 }
1341
- ],
1379
+ shuffle: {
1380
+ label: "\u30B7\u30E3\u30C3\u30D5\u30EB",
1381
+ pattern: [
1382
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 1 },
1383
+ { step: 0, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
1384
+ { step: 32, pitch: DRUM_KEYS.closedHihat, velocity: 0.5 },
1385
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 1 },
1386
+ { step: 48, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
1387
+ { step: 80, pitch: DRUM_KEYS.closedHihat, velocity: 0.5 },
1388
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
1389
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
1390
+ { step: 128, pitch: DRUM_KEYS.closedHihat, velocity: 0.5 },
1391
+ { step: 144, pitch: DRUM_KEYS.acousticSnare, velocity: 1 },
1392
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
1393
+ { step: 176, pitch: DRUM_KEYS.closedHihat, velocity: 0.5 }
1394
+ ]
1395
+ },
1342
1396
  // ダンス/EDM:スネアをClapに変更。キックとハイハットの対比を最大化
1343
- dance: [
1344
- { step: 0, pitch: DRUM_KEYS.kick, velocity: 1 },
1345
- { step: 24, pitch: DRUM_KEYS.hihatOpen, velocity: 0.7 },
1346
- { step: 48, pitch: DRUM_KEYS.kick, velocity: 1 },
1347
- { step: 48, pitch: DRUM_KEYS.clap, velocity: 1 },
1348
- { step: 72, pitch: DRUM_KEYS.hihatOpen, velocity: 0.7 },
1349
- { step: 96, pitch: DRUM_KEYS.kick, velocity: 1 },
1350
- { step: 120, pitch: DRUM_KEYS.hihatOpen, velocity: 0.7 },
1351
- { step: 144, pitch: DRUM_KEYS.kick, velocity: 1 },
1352
- { step: 144, pitch: DRUM_KEYS.clap, velocity: 1 },
1353
- { step: 168, pitch: DRUM_KEYS.hihatOpen, velocity: 0.7 }
1354
- ],
1397
+ dance: {
1398
+ label: "\u30C0\u30F3\u30B9/EDM",
1399
+ pattern: [
1400
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 1 },
1401
+ { step: 24, pitch: DRUM_KEYS.openHihat, velocity: 0.7 },
1402
+ { step: 48, pitch: DRUM_KEYS.bassDrum1, velocity: 1 },
1403
+ { step: 48, pitch: DRUM_KEYS.handClap, velocity: 1 },
1404
+ { step: 72, pitch: DRUM_KEYS.openHihat, velocity: 0.7 },
1405
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 1 },
1406
+ { step: 120, pitch: DRUM_KEYS.openHihat, velocity: 0.7 },
1407
+ { step: 144, pitch: DRUM_KEYS.bassDrum1, velocity: 1 },
1408
+ { step: 144, pitch: DRUM_KEYS.handClap, velocity: 1 },
1409
+ { step: 168, pitch: DRUM_KEYS.openHihat, velocity: 0.7 }
1410
+ ]
1411
+ },
1355
1412
  // ボサノバ/チル系:リムショット(37)とハイハットの組み合わせ
1356
- bossa: [
1357
- { step: 0, pitch: DRUM_KEYS.kick, velocity: 0.9 },
1358
- { step: 0, pitch: DRUM_KEYS.hihatClosed, velocity: 0.6 },
1359
- { step: 24, pitch: DRUM_KEYS.hihatClosed, velocity: 0.4 },
1360
- { step: 48, pitch: DRUM_KEYS.rimshot, velocity: 0.8 },
1361
- { step: 48, pitch: DRUM_KEYS.hihatClosed, velocity: 0.6 },
1362
- { step: 72, pitch: DRUM_KEYS.kick, velocity: 0.7 },
1363
- { step: 72, pitch: DRUM_KEYS.hihatClosed, velocity: 0.4 },
1364
- { step: 96, pitch: DRUM_KEYS.kick, velocity: 0.9 },
1365
- { step: 96, pitch: DRUM_KEYS.hihatClosed, velocity: 0.6 },
1366
- { step: 120, pitch: DRUM_KEYS.hihatClosed, velocity: 0.4 },
1367
- { step: 144, pitch: DRUM_KEYS.rimshot, velocity: 0.8 },
1368
- { step: 144, pitch: DRUM_KEYS.hihatClosed, velocity: 0.6 },
1369
- { step: 168, pitch: DRUM_KEYS.hihatClosed, velocity: 0.4 }
1370
- ],
1413
+ bossa: {
1414
+ label: "\u30DC\u30B5\u30CE\u30D0/\u30C1\u30EB",
1415
+ pattern: [
1416
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
1417
+ { step: 0, pitch: DRUM_KEYS.closedHihat, velocity: 0.6 },
1418
+ { step: 24, pitch: DRUM_KEYS.closedHihat, velocity: 0.4 },
1419
+ { step: 48, pitch: DRUM_KEYS.sideStick, velocity: 0.8 },
1420
+ { step: 48, pitch: DRUM_KEYS.closedHihat, velocity: 0.6 },
1421
+ { step: 72, pitch: DRUM_KEYS.bassDrum1, velocity: 0.7 },
1422
+ { step: 72, pitch: DRUM_KEYS.closedHihat, velocity: 0.4 },
1423
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
1424
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.6 },
1425
+ { step: 120, pitch: DRUM_KEYS.closedHihat, velocity: 0.4 },
1426
+ { step: 144, pitch: DRUM_KEYS.sideStick, velocity: 0.8 },
1427
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.6 },
1428
+ { step: 168, pitch: DRUM_KEYS.closedHihat, velocity: 0.4 }
1429
+ ]
1430
+ },
1371
1431
  // ファンク/ディスコ:タンバリン(54)でスピード感を出す
1372
- disco: [
1373
- { step: 0, pitch: DRUM_KEYS.kick, velocity: 1 },
1374
- { step: 0, pitch: DRUM_KEYS.hihatClosed, velocity: 0.7 },
1375
- { step: 24, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
1376
- { step: 48, pitch: DRUM_KEYS.snare, velocity: 1 },
1377
- { step: 48, pitch: DRUM_KEYS.hihatClosed, velocity: 0.7 },
1378
- { step: 72, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
1379
- { step: 96, pitch: DRUM_KEYS.kick, velocity: 1 },
1380
- { step: 96, pitch: DRUM_KEYS.hihatClosed, velocity: 0.7 },
1381
- { step: 120, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
1382
- { step: 144, pitch: DRUM_KEYS.snare, velocity: 1 },
1383
- { step: 144, pitch: DRUM_KEYS.hihatClosed, velocity: 0.7 },
1384
- { step: 168, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }
1385
- ]
1432
+ disco: {
1433
+ label: "\u30D5\u30A1\u30F3\u30AF/\u30C7\u30A3\u30B9\u30B3",
1434
+ pattern: [
1435
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 1 },
1436
+ { step: 0, pitch: DRUM_KEYS.closedHihat, velocity: 0.7 },
1437
+ { step: 24, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
1438
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 1 },
1439
+ { step: 48, pitch: DRUM_KEYS.closedHihat, velocity: 0.7 },
1440
+ { step: 72, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
1441
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 1 },
1442
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.7 },
1443
+ { step: 120, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
1444
+ { step: 144, pitch: DRUM_KEYS.acousticSnare, velocity: 1 },
1445
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.7 },
1446
+ { step: 168, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }
1447
+ ]
1448
+ }
1449
+ };
1450
+ var getDrumPatternKeys = (name, dict) => {
1451
+ const normalizedDict = normalizeDrumPatterns(dict);
1452
+ const def = normalizedDict[name];
1453
+ if (!def) return [];
1454
+ const patternObj = def.pattern;
1455
+ const keys = /* @__PURE__ */ new Set();
1456
+ if (Array.isArray(patternObj) && patternObj.length > 0 && "ranges" in patternObj[0]) {
1457
+ const songDef = patternObj;
1458
+ for (const i of songDef) {
1459
+ for (const p of i.pattern) keys.add(p.pitch);
1460
+ }
1461
+ } else if (Array.isArray(patternObj)) {
1462
+ for (const p of patternObj) keys.add(p.pitch);
1463
+ }
1464
+ return Array.from(keys);
1386
1465
  };
1387
1466
 
1388
1467
  // src/chords.ts
@@ -2892,7 +2971,7 @@ var PITCH_MAP = {
2892
2971
  b: 11
2893
2972
  };
2894
2973
  var clamp2 = (value, lo, hi) => Math.min(hi, Math.max(lo, value));
2895
- var META_DIRECTIVE = /#(inst|drum|volume|drumvolume|mode)=([\w-]+)/gi;
2974
+ var META_DIRECTIVE = /#(inst|drum|drumfont|volume|drumvolume|mode)=([\w-]+)/gi;
2896
2975
  var TRACK_INST_DIRECTIVE = /#t(\d+)inst=([^#;\r\n]+)/gi;
2897
2976
  var parseMmlMeta = (mml) => {
2898
2977
  const meta = {};
@@ -2900,6 +2979,7 @@ var parseMmlMeta = (mml) => {
2900
2979
  const key = m[1].toLowerCase();
2901
2980
  if (key === "inst") meta.instrument = m[2];
2902
2981
  else if (key === "drum") meta.drum = m[2];
2982
+ else if (key === "drumfont") meta.drumFont = m[2];
2903
2983
  else if (key === "volume") {
2904
2984
  const v = Number.parseInt(m[2], 10);
2905
2985
  if (!Number.isNaN(v)) meta.volume = v;
@@ -2927,6 +3007,7 @@ var formatMmlMeta = (meta, space = "") => {
2927
3007
  const parts = [];
2928
3008
  if (meta.instrument) parts.push(`#inst=${meta.instrument}`);
2929
3009
  if (meta.drum) parts.push(`#drum=${meta.drum}`);
3010
+ if (meta.drumFont) parts.push(`#drumfont=${meta.drumFont}`);
2930
3011
  if (meta.volume !== void 0) parts.push(`#volume=${meta.volume}`);
2931
3012
  if (meta.drumVolume !== void 0)
2932
3013
  parts.push(`#drumvolume=${meta.drumVolume}`);
@@ -3311,10 +3392,11 @@ var createSequencer = (options) => {
3311
3392
  duration: ev.duration
3312
3393
  });
3313
3394
  }
3314
- const pattern = options.getDrumPattern();
3395
+ const { stepsPerBar } = options;
3396
+ const currentStep = getWrappedPlayStep(time, sps);
3397
+ const currentBar = Math.floor(currentStep / stepsPerBar) + 1;
3398
+ const pattern = options.getDrumPattern(currentBar);
3315
3399
  if (pattern && pattern.length > 0) {
3316
- const { stepsPerBar } = options;
3317
- const currentStep = getWrappedPlayStep(time, sps);
3318
3400
  const currentStepInBar = currentStep % stepsPerBar;
3319
3401
  const nextStep = currentStepInBar + 4;
3320
3402
  const crossedBar = currentStepInBar < 4;
@@ -3332,10 +3414,10 @@ var createSequencer = (options) => {
3332
3414
  }
3333
3415
  }
3334
3416
  if (time >= 0) {
3335
- const currentStep = getWrappedPlayStep(time, sps);
3417
+ const currentStep2 = getWrappedPlayStep(time, sps);
3336
3418
  if (options.cues && options.cues.length > 0 && options.onCue) {
3337
3419
  const bpm = options.getBpm();
3338
- const stepsPerBar = options.stepsPerBar;
3420
+ const stepsPerBar2 = options.stepsPerBar;
3339
3421
  const isCueCrossed = (cueStep, prevStep, currStep) => {
3340
3422
  if (currStep >= prevStep) {
3341
3423
  return cueStep > prevStep && cueStep <= currStep;
@@ -3346,13 +3428,13 @@ var createSequencer = (options) => {
3346
3428
  }
3347
3429
  };
3348
3430
  for (const cue of options.cues) {
3349
- const cueStep = resolveLoopPoint(cue.time, bpm, stepsPerBar, sps);
3350
- if (isCueCrossed(cueStep, lastPlayStep, currentStep)) {
3431
+ const cueStep = resolveLoopPoint(cue.time, bpm, stepsPerBar2, sps);
3432
+ if (isCueCrossed(cueStep, lastPlayStep, currentStep2)) {
3351
3433
  options.onCue(cue.id);
3352
3434
  }
3353
3435
  }
3354
3436
  }
3355
- lastPlayStep = currentStep;
3437
+ lastPlayStep = currentStep2;
3356
3438
  }
3357
3439
  if (!isLooping) {
3358
3440
  const last = timeline[timeline.length - 1];
@@ -3362,56 +3444,2254 @@ var createSequencer = (options) => {
3362
3444
  stop();
3363
3445
  options.onEnd(false);
3364
3446
  }
3365
- }
3366
- };
3367
- const animate = () => {
3368
- if (!active) return;
3369
- const sps = secondsPerStep();
3370
- const time = options.getAudioTime() - startTime;
3371
- options.onTick(getWrappedPlayStep(time, sps));
3372
- animationId = requestAnimationFrame(animate);
3373
- };
3374
- const stop = () => {
3375
- if (intervalId !== null) {
3376
- clearInterval(intervalId);
3377
- intervalId = null;
3378
- }
3379
- if (animationId !== null) {
3380
- cancelAnimationFrame(animationId);
3381
- animationId = null;
3382
- }
3383
- active = false;
3384
- };
3385
- const START_DELAY = 0.1;
3386
- const start = (fromStep) => {
3387
- stop();
3388
- fromStepValue = fromStep ?? options.getPlayStartStep();
3389
- buildTimeline(fromStepValue);
3390
- if (timeline.length === 0 && !options.getDrumPattern()?.length) return;
3391
- active = true;
3392
- startTime = options.getAudioTime() + START_DELAY;
3393
- const sps = secondsPerStep();
3394
- nowIndex = 0;
3395
- while (nowIndex < timeline.length) {
3396
- const noteStartStep = fromStepValue + timeline[nowIndex].when / sps;
3397
- if (noteStartStep >= fromStepValue - 1e-4) {
3398
- break;
3447
+ }
3448
+ };
3449
+ const animate = () => {
3450
+ if (!active) return;
3451
+ const sps = secondsPerStep();
3452
+ const time = options.getAudioTime() - startTime;
3453
+ options.onTick(getWrappedPlayStep(time, sps));
3454
+ animationId = requestAnimationFrame(animate);
3455
+ };
3456
+ const stop = () => {
3457
+ if (intervalId !== null) {
3458
+ clearInterval(intervalId);
3459
+ intervalId = null;
3460
+ }
3461
+ if (animationId !== null) {
3462
+ cancelAnimationFrame(animationId);
3463
+ animationId = null;
3464
+ }
3465
+ active = false;
3466
+ };
3467
+ const START_DELAY = 0.1;
3468
+ const start = (fromStep) => {
3469
+ stop();
3470
+ fromStepValue = fromStep ?? options.getPlayStartStep();
3471
+ buildTimeline(fromStepValue);
3472
+ if (timeline.length === 0 && !options.getDrumPattern(1)?.length) return;
3473
+ active = true;
3474
+ startTime = options.getAudioTime() + START_DELAY;
3475
+ const sps = secondsPerStep();
3476
+ nowIndex = 0;
3477
+ while (nowIndex < timeline.length) {
3478
+ const noteStartStep = fromStepValue + timeline[nowIndex].when / sps;
3479
+ if (noteStartStep >= fromStepValue - 1e-4) {
3480
+ break;
3481
+ }
3482
+ nowIndex++;
3483
+ }
3484
+ loopBase = 0;
3485
+ lastPlayStep = fromStepValue - 1e-4;
3486
+ lastRealTime = -1;
3487
+ lastAudioTime = -1;
3488
+ intervalId = setInterval(scheduleTick, TICK_INTERVAL_MS);
3489
+ animationId = requestAnimationFrame(animate);
3490
+ };
3491
+ return {
3492
+ start,
3493
+ stop,
3494
+ isActive: () => active,
3495
+ getStartTime: () => startTime
3496
+ };
3497
+ };
3498
+
3499
+ // src/song-drum-config.ts
3500
+ var SONG_DRUM_PATTERNS = {
3501
+ mimizuki: {
3502
+ label: "\u6D77\u9B3C\u6708",
3503
+ font: "Chaos_sf2_file:0",
3504
+ pattern: [
3505
+ {
3506
+ ranges: [
3507
+ [1, 31],
3508
+ [33, 52],
3509
+ [57, 71],
3510
+ [73, 104]
3511
+ ],
3512
+ pattern: [
3513
+ { step: 72, pitch: DRUM_KEYS.openHihat, velocity: 0.8 },
3514
+ { step: 88, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 }
3515
+ ]
3516
+ },
3517
+ {
3518
+ ranges: [[1, 52]],
3519
+ pattern: [
3520
+ { step: 24, pitch: DRUM_KEYS.openHihat, velocity: 0.8 },
3521
+ { step: 40, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
3522
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3523
+ { step: 120, pitch: DRUM_KEYS.openHihat, velocity: 0.8 },
3524
+ { step: 136, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
3525
+ { step: 144, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 }
3526
+ ]
3527
+ },
3528
+ {
3529
+ ranges: [
3530
+ [1, 7],
3531
+ [9, 52]
3532
+ ],
3533
+ pattern: [
3534
+ { step: 168, pitch: DRUM_KEYS.openHihat, velocity: 0.8 },
3535
+ { step: 184, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 }
3536
+ ]
3537
+ },
3538
+ {
3539
+ ranges: [[56, 104]],
3540
+ pattern: [
3541
+ { step: 120, pitch: DRUM_KEYS.openHihat, velocity: 0.8 },
3542
+ { step: 136, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
3543
+ { step: 144, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3544
+ { step: 168, pitch: DRUM_KEYS.openHihat, velocity: 0.8 },
3545
+ { step: 184, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 }
3546
+ ]
3547
+ },
3548
+ {
3549
+ ranges: [[57, 104]],
3550
+ pattern: [
3551
+ { step: 24, pitch: DRUM_KEYS.openHihat, velocity: 0.8 },
3552
+ { step: 40, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
3553
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 }
3554
+ ]
3555
+ },
3556
+ {
3557
+ ranges: [
3558
+ [1, 1],
3559
+ [5, 5],
3560
+ [9, 9],
3561
+ [13, 13],
3562
+ [17, 17],
3563
+ [21, 21],
3564
+ [25, 25],
3565
+ [29, 29],
3566
+ [32, 33],
3567
+ [37, 37],
3568
+ [41, 41],
3569
+ [45, 45],
3570
+ [49, 49],
3571
+ [53, 53],
3572
+ [57, 57],
3573
+ [61, 61],
3574
+ [65, 65],
3575
+ [69, 69],
3576
+ [72, 73],
3577
+ [77, 77],
3578
+ [81, 81],
3579
+ [85, 85],
3580
+ [89, 89],
3581
+ [93, 93],
3582
+ [97, 97],
3583
+ [101, 101]
3584
+ ],
3585
+ pattern: [{ step: 0, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.8 }]
3586
+ },
3587
+ {
3588
+ ranges: [
3589
+ [32, 32],
3590
+ [72, 72]
3591
+ ],
3592
+ pattern: [
3593
+ { step: 72, pitch: DRUM_KEYS.lowTom, velocity: 0.8 },
3594
+ { step: 84, pitch: 43, velocity: 0.8 },
3595
+ { step: 96, pitch: 41, velocity: 0.8 },
3596
+ { step: 112, pitch: DRUM_KEYS.sideStick, velocity: 0.3 },
3597
+ { step: 112, pitch: DRUM_KEYS.highTom, velocity: 0.3 },
3598
+ { step: 116, pitch: DRUM_KEYS.sideStick, velocity: 0.3 },
3599
+ { step: 116, pitch: DRUM_KEYS.highTom, velocity: 0.3 },
3600
+ { step: 120, pitch: DRUM_KEYS.sideStick, velocity: 0.8 },
3601
+ { step: 120, pitch: DRUM_KEYS.highTom, velocity: 0.8 },
3602
+ { step: 136, pitch: DRUM_KEYS.sideStick, velocity: 0.5 },
3603
+ { step: 136, pitch: DRUM_KEYS.highTom, velocity: 0.5 },
3604
+ { step: 144, pitch: DRUM_KEYS.sideStick, velocity: 0.8 },
3605
+ { step: 144, pitch: 48, velocity: 0.8 },
3606
+ { step: 152, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.1 },
3607
+ { step: 160, pitch: DRUM_KEYS.sideStick, velocity: 0.3 },
3608
+ { step: 160, pitch: 48, velocity: 0.3 },
3609
+ { step: 160, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.3 },
3610
+ { step: 168, pitch: DRUM_KEYS.sideStick, velocity: 0.6 },
3611
+ { step: 168, pitch: DRUM_KEYS.lowMidTom, velocity: 0.8 },
3612
+ { step: 168, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.4 },
3613
+ { step: 176, pitch: DRUM_KEYS.sideStick, velocity: 0.3 },
3614
+ { step: 176, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.5 },
3615
+ { step: 184, pitch: DRUM_KEYS.sideStick, velocity: 0.5 },
3616
+ { step: 184, pitch: DRUM_KEYS.lowMidTom, velocity: 0.3 },
3617
+ { step: 184, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.7 }
3618
+ ]
3619
+ },
3620
+ {
3621
+ ranges: [
3622
+ [56, 56],
3623
+ [64, 64],
3624
+ [80, 80],
3625
+ [88, 88]
3626
+ ],
3627
+ pattern: [
3628
+ { step: 112, pitch: DRUM_KEYS.sideStick, velocity: 0.3 },
3629
+ { step: 112, pitch: DRUM_KEYS.highTom, velocity: 0.3 },
3630
+ { step: 116, pitch: DRUM_KEYS.sideStick, velocity: 0.3 },
3631
+ { step: 116, pitch: DRUM_KEYS.highTom, velocity: 0.3 },
3632
+ { step: 120, pitch: DRUM_KEYS.sideStick, velocity: 0.8 },
3633
+ { step: 120, pitch: DRUM_KEYS.highTom, velocity: 0.8 },
3634
+ { step: 136, pitch: DRUM_KEYS.sideStick, velocity: 0.5 },
3635
+ { step: 136, pitch: DRUM_KEYS.highTom, velocity: 0.5 },
3636
+ { step: 144, pitch: DRUM_KEYS.sideStick, velocity: 0.8 },
3637
+ { step: 144, pitch: 48, velocity: 0.8 },
3638
+ { step: 152, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.1 },
3639
+ { step: 160, pitch: DRUM_KEYS.sideStick, velocity: 0.3 },
3640
+ { step: 160, pitch: 48, velocity: 0.3 },
3641
+ { step: 160, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.3 },
3642
+ { step: 168, pitch: DRUM_KEYS.sideStick, velocity: 0.6 },
3643
+ { step: 168, pitch: DRUM_KEYS.lowMidTom, velocity: 0.8 },
3644
+ { step: 168, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.4 },
3645
+ { step: 176, pitch: DRUM_KEYS.sideStick, velocity: 0.3 },
3646
+ { step: 176, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.5 },
3647
+ { step: 184, pitch: DRUM_KEYS.sideStick, velocity: 0.5 },
3648
+ { step: 184, pitch: DRUM_KEYS.lowMidTom, velocity: 0.3 },
3649
+ { step: 184, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.7 }
3650
+ ]
3651
+ }
3652
+ ]
3653
+ },
3654
+ budou_ga_kage_kara_nozoiterunda: {
3655
+ label: "\u30D6\u30C9\u30A6\u304C\u304B\u3052\u304B\u3089\u306E\u305E\u3044\u3066\u308B\u3093\u3060",
3656
+ font: "FluidR3_GM_sf2_file:0",
3657
+ pattern: [
3658
+ {
3659
+ ranges: [[1, 91]],
3660
+ pattern: [{ step: 144, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 }]
3661
+ },
3662
+ {
3663
+ ranges: [
3664
+ [5, 47],
3665
+ [49, 88]
3666
+ ],
3667
+ pattern: [{ step: 24, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 }]
3668
+ },
3669
+ {
3670
+ ranges: [
3671
+ [13, 47],
3672
+ [57, 88]
3673
+ ],
3674
+ pattern: [
3675
+ { step: 72, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3676
+ { step: 120, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3677
+ { step: 168, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 }
3678
+ ]
3679
+ },
3680
+ {
3681
+ ranges: [[37, 92]],
3682
+ pattern: [
3683
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3684
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 }
3685
+ ]
3686
+ },
3687
+ {
3688
+ ranges: [[37, 91]],
3689
+ pattern: [{ step: 144, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 }]
3690
+ },
3691
+ {
3692
+ ranges: [[45, 92]],
3693
+ pattern: [
3694
+ { step: 0, pitch: 53, velocity: 0.8 },
3695
+ { step: 36, pitch: 67, velocity: 0.5 },
3696
+ { step: 72, pitch: 67, velocity: 0.5 }
3697
+ ]
3698
+ },
3699
+ {
3700
+ ranges: [[45, 91]],
3701
+ pattern: [
3702
+ { step: 144, pitch: 68, velocity: 0.5 },
3703
+ { step: 168, pitch: 60, velocity: 0.8 },
3704
+ { step: 168, pitch: 68, velocity: 0.5 },
3705
+ { step: 180, pitch: 68, velocity: 0.5 }
3706
+ ]
3707
+ },
3708
+ {
3709
+ ranges: [[57, 92]],
3710
+ pattern: [
3711
+ { step: 24, pitch: 67, velocity: 0.5 },
3712
+ { step: 48, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3713
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3714
+ { step: 48, pitch: 53, velocity: 0.8 },
3715
+ { step: 60, pitch: 68, velocity: 0.5 },
3716
+ { step: 96, pitch: 60, velocity: 0.8 }
3717
+ ]
3718
+ },
3719
+ {
3720
+ ranges: [[57, 91]],
3721
+ pattern: [
3722
+ { step: 120, pitch: 67, velocity: 0.5 },
3723
+ { step: 132, pitch: 60, velocity: 0.8 }
3724
+ ]
3725
+ },
3726
+ {
3727
+ ranges: [[1, 29]],
3728
+ pattern: [{ step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 }]
3729
+ },
3730
+ {
3731
+ ranges: [[1, 28]],
3732
+ pattern: [{ step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 }]
3733
+ },
3734
+ {
3735
+ ranges: [[4, 28]],
3736
+ pattern: [
3737
+ { step: 0, pitch: 53, velocity: 0.8 },
3738
+ { step: 36, pitch: 67, velocity: 0.5 },
3739
+ { step: 72, pitch: 67, velocity: 0.5 },
3740
+ { step: 144, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3741
+ { step: 144, pitch: 68, velocity: 0.5 },
3742
+ { step: 168, pitch: 60, velocity: 0.8 },
3743
+ { step: 168, pitch: 68, velocity: 0.5 },
3744
+ { step: 180, pitch: 68, velocity: 0.5 }
3745
+ ]
3746
+ },
3747
+ {
3748
+ ranges: [[13, 28]],
3749
+ pattern: [
3750
+ { step: 24, pitch: 67, velocity: 0.5 },
3751
+ { step: 48, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3752
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3753
+ { step: 48, pitch: 53, velocity: 0.8 },
3754
+ { step: 60, pitch: 68, velocity: 0.5 },
3755
+ { step: 96, pitch: 60, velocity: 0.8 },
3756
+ { step: 120, pitch: 67, velocity: 0.5 },
3757
+ { step: 132, pitch: 60, velocity: 0.8 }
3758
+ ]
3759
+ },
3760
+ {
3761
+ ranges: [
3762
+ [5, 11],
3763
+ [49, 55]
3764
+ ],
3765
+ pattern: [
3766
+ { step: 24, pitch: 67, velocity: 0.5 },
3767
+ { step: 48, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3768
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3769
+ { step: 48, pitch: 53, velocity: 0.8 },
3770
+ { step: 60, pitch: 68, velocity: 0.5 },
3771
+ { step: 72, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3772
+ { step: 96, pitch: 60, velocity: 0.8 },
3773
+ { step: 120, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3774
+ { step: 120, pitch: 67, velocity: 0.5 },
3775
+ { step: 132, pitch: 60, velocity: 0.8 },
3776
+ { step: 168, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 }
3777
+ ]
3778
+ },
3779
+ {
3780
+ ranges: [[37, 47]],
3781
+ pattern: [
3782
+ { step: 48, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3783
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 }
3784
+ ]
3785
+ },
3786
+ {
3787
+ ranges: [[29, 36]],
3788
+ pattern: [
3789
+ { step: 48, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3790
+ { step: 72, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3791
+ { step: 96, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
3792
+ { step: 144, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3793
+ { step: 168, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 }
3794
+ ]
3795
+ },
3796
+ {
3797
+ ranges: [[1, 3]],
3798
+ pattern: [{ step: 48, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 }]
3799
+ },
3800
+ {
3801
+ ranges: [[45, 47]],
3802
+ pattern: [
3803
+ { step: 24, pitch: 67, velocity: 0.5 },
3804
+ { step: 48, pitch: 53, velocity: 0.8 },
3805
+ { step: 60, pitch: 68, velocity: 0.5 },
3806
+ { step: 96, pitch: 60, velocity: 0.8 },
3807
+ { step: 120, pitch: 67, velocity: 0.5 },
3808
+ { step: 132, pitch: 60, velocity: 0.8 }
3809
+ ]
3810
+ },
3811
+ {
3812
+ ranges: [
3813
+ [4, 4],
3814
+ [48, 48]
3815
+ ],
3816
+ pattern: [
3817
+ { step: 0, pitch: 67, velocity: 0.5 },
3818
+ { step: 36, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3819
+ { step: 36, pitch: 53, velocity: 0.8 },
3820
+ { step: 72, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3821
+ { step: 72, pitch: 53, velocity: 0.8 },
3822
+ { step: 120, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3823
+ { step: 120, pitch: 60, velocity: 0.8 },
3824
+ { step: 120, pitch: 68, velocity: 0.5 },
3825
+ { step: 144, pitch: 60, velocity: 0.8 },
3826
+ { step: 168, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3827
+ { step: 180, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 }
3828
+ ]
3829
+ },
3830
+ {
3831
+ ranges: [
3832
+ [12, 12],
3833
+ [56, 56]
3834
+ ],
3835
+ pattern: [
3836
+ { step: 0, pitch: 67, velocity: 0.5 },
3837
+ { step: 0, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3838
+ { step: 0, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3839
+ { step: 24, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3840
+ { step: 36, pitch: 53, velocity: 0.8 },
3841
+ { step: 36, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3842
+ { step: 60, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3843
+ { step: 60, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3844
+ { step: 72, pitch: 53, velocity: 0.8 },
3845
+ { step: 72, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3846
+ { step: 96, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3847
+ { step: 120, pitch: 60, velocity: 0.8 },
3848
+ { step: 120, pitch: 68, velocity: 0.5 },
3849
+ { step: 144, pitch: 60, velocity: 0.8 }
3850
+ ]
3851
+ },
3852
+ {
3853
+ ranges: [
3854
+ [13, 13],
3855
+ [21, 21],
3856
+ [57, 57],
3857
+ [65, 65],
3858
+ [73, 73],
3859
+ [81, 81]
3860
+ ],
3861
+ pattern: [{ step: 0, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.8 }]
3862
+ },
3863
+ {
3864
+ ranges: [[29, 29]],
3865
+ pattern: [
3866
+ { step: 0, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.8 },
3867
+ { step: 32, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3868
+ { step: 40, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3869
+ { step: 128, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3870
+ { step: 136, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 }
3871
+ ]
3872
+ },
3873
+ {
3874
+ ranges: [
3875
+ [30, 30],
3876
+ [32, 32],
3877
+ [34, 34]
3878
+ ],
3879
+ pattern: [
3880
+ { step: 0, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3881
+ { step: 8, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3882
+ { step: 16, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3883
+ { step: 24, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3884
+ { step: 84, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3885
+ { step: 96, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3886
+ { step: 120, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3887
+ { step: 132, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3888
+ { step: 156, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3889
+ { step: 180, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 }
3890
+ ]
3891
+ },
3892
+ {
3893
+ ranges: [
3894
+ [31, 31],
3895
+ [33, 33],
3896
+ [35, 35]
3897
+ ],
3898
+ pattern: [
3899
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3900
+ { step: 32, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3901
+ { step: 40, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3902
+ { step: 128, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3903
+ { step: 136, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 }
3904
+ ]
3905
+ },
3906
+ {
3907
+ ranges: [[36, 36]],
3908
+ pattern: [
3909
+ { step: 0, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3910
+ { step: 8, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3911
+ { step: 16, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3912
+ { step: 24, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3913
+ { step: 84, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3914
+ { step: 96, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3915
+ { step: 102, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
3916
+ { step: 108, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
3917
+ { step: 114, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
3918
+ { step: 120, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
3919
+ { step: 126, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
3920
+ { step: 132, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3921
+ { step: 144, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
3922
+ { step: 156, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3923
+ { step: 168, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
3924
+ { step: 172, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
3925
+ { step: 176, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
3926
+ { step: 180, pitch: DRUM_KEYS.pedalHihat, velocity: 0.8 },
3927
+ { step: 180, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
3928
+ { step: 184, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
3929
+ { step: 188, pitch: DRUM_KEYS.handClap, velocity: 0.8 }
3930
+ ]
3931
+ }
3932
+ ]
3933
+ },
3934
+ hamari_au_karada_wa: {
3935
+ label: "\u5D4C\u308A\u5408\u3046\u4F53\u306F",
3936
+ font: "FluidR3_GM_sf2_file:0",
3937
+ pattern: [
3938
+ {
3939
+ ranges: [
3940
+ [7, 51],
3941
+ [53, 99]
3942
+ ],
3943
+ pattern: [{ step: 144, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 }]
3944
+ },
3945
+ {
3946
+ ranges: [[35, 67]],
3947
+ pattern: [
3948
+ { step: 0, pitch: 35, velocity: 0.8 },
3949
+ { step: 48, pitch: 35, velocity: 0.8 },
3950
+ { step: 96, pitch: 35, velocity: 0.8 }
3951
+ ]
3952
+ },
3953
+ {
3954
+ ranges: [[69, 100]],
3955
+ pattern: [
3956
+ { step: 0, pitch: 35, velocity: 0.8 },
3957
+ { step: 24, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 },
3958
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3959
+ { step: 48, pitch: 35, velocity: 0.8 },
3960
+ { step: 72, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 },
3961
+ { step: 96, pitch: 35, velocity: 0.8 },
3962
+ { step: 96, pitch: 67, velocity: 0.8 }
3963
+ ]
3964
+ },
3965
+ {
3966
+ ranges: [
3967
+ [35, 51],
3968
+ [53, 67]
3969
+ ],
3970
+ pattern: [
3971
+ { step: 24, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 },
3972
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
3973
+ { step: 72, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 },
3974
+ { step: 120, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 },
3975
+ { step: 144, pitch: 35, velocity: 0.8 },
3976
+ { step: 168, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 }
3977
+ ]
3978
+ },
3979
+ {
3980
+ ranges: [[69, 99]],
3981
+ pattern: [
3982
+ { step: 120, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 },
3983
+ { step: 144, pitch: 35, velocity: 0.8 },
3984
+ { step: 144, pitch: 67, velocity: 0.8 },
3985
+ { step: 168, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 }
3986
+ ]
3987
+ },
3988
+ {
3989
+ ranges: [[6, 33]],
3990
+ pattern: [
3991
+ { step: 120, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 },
3992
+ { step: 168, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 }
3993
+ ]
3994
+ },
3995
+ {
3996
+ ranges: [[7, 33]],
3997
+ pattern: [
3998
+ { step: 0, pitch: 35, velocity: 0.8 },
3999
+ { step: 24, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 },
4000
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
4001
+ { step: 48, pitch: 35, velocity: 0.8 },
4002
+ { step: 72, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 },
4003
+ { step: 96, pitch: 35, velocity: 0.8 },
4004
+ { step: 144, pitch: 35, velocity: 0.8 }
4005
+ ]
4006
+ },
4007
+ {
4008
+ ranges: [
4009
+ [11, 18],
4010
+ [35, 50]
4011
+ ],
4012
+ pattern: [
4013
+ { step: 96, pitch: 67, velocity: 0.8 },
4014
+ { step: 144, pitch: 67, velocity: 0.8 }
4015
+ ]
4016
+ },
4017
+ {
4018
+ ranges: [
4019
+ [23, 26],
4020
+ [57, 60]
4021
+ ],
4022
+ pattern: [
4023
+ { step: 0, pitch: 68, velocity: 0.8 },
4024
+ { step: 48, pitch: 67, velocity: 0.8 },
4025
+ { step: 120, pitch: 68, velocity: 0.8 },
4026
+ { step: 144, pitch: 67, velocity: 0.8 }
4027
+ ]
4028
+ },
4029
+ {
4030
+ ranges: [
4031
+ [3, 7],
4032
+ [19, 19],
4033
+ [23, 23],
4034
+ [27, 27],
4035
+ [31, 31],
4036
+ [53, 53],
4037
+ [57, 57],
4038
+ [61, 61],
4039
+ [65, 65]
4040
+ ],
4041
+ pattern: [{ step: 0, pitch: 57, velocity: 0.8 }]
4042
+ },
4043
+ {
4044
+ ranges: [
4045
+ [31, 33],
4046
+ [65, 67]
4047
+ ],
4048
+ pattern: [
4049
+ { step: 24, pitch: 77, velocity: 0.8 },
4050
+ { step: 60, pitch: 77, velocity: 0.8 },
4051
+ { step: 96, pitch: 77, velocity: 0.8 },
4052
+ { step: 132, pitch: 77, velocity: 0.8 }
4053
+ ]
4054
+ },
4055
+ {
4056
+ ranges: [[3, 5]],
4057
+ pattern: [{ step: 96, pitch: 57, velocity: 0.8 }]
4058
+ },
4059
+ {
4060
+ ranges: [
4061
+ [31, 32],
4062
+ [65, 66]
4063
+ ],
4064
+ pattern: [{ step: 168, pitch: 77, velocity: 0.8 }]
4065
+ },
4066
+ {
4067
+ ranges: [[1, 2]],
4068
+ pattern: [
4069
+ { step: 0, pitch: 62, velocity: 0.8 },
4070
+ { step: 48, pitch: 62, velocity: 0.8 },
4071
+ { step: 96, pitch: 62, velocity: 0.8 }
4072
+ ]
4073
+ },
4074
+ {
4075
+ ranges: [[1, 1]],
4076
+ pattern: [{ step: 144, pitch: 62, velocity: 0.8 }]
4077
+ },
4078
+ {
4079
+ ranges: [[2, 2]],
4080
+ pattern: [
4081
+ { step: 36, pitch: 62, velocity: 0.8 },
4082
+ { step: 72, pitch: 62, velocity: 0.8 }
4083
+ ]
4084
+ },
4085
+ {
4086
+ ranges: [[6, 6]],
4087
+ pattern: [
4088
+ { step: 48, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 },
4089
+ { step: 108, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
4090
+ { step: 120, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
4091
+ { step: 132, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
4092
+ { step: 168, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 },
4093
+ { step: 180, pitch: DRUM_KEYS.acousticSnare, velocity: 0.8 }
4094
+ ]
4095
+ },
4096
+ {
4097
+ ranges: [
4098
+ [11, 11],
4099
+ [35, 35],
4100
+ [43, 43],
4101
+ [69, 69],
4102
+ [77, 77],
4103
+ [85, 85],
4104
+ [93, 93]
4105
+ ],
4106
+ pattern: [
4107
+ { step: 0, pitch: 57, velocity: 0.8 },
4108
+ { step: 24, pitch: 77, velocity: 0.8 },
4109
+ { step: 48, pitch: 77, velocity: 0.8 },
4110
+ { step: 96, pitch: 77, velocity: 0.8 },
4111
+ { step: 96, pitch: 53, velocity: 0.8 },
4112
+ { step: 132, pitch: 77, velocity: 0.8 },
4113
+ { step: 168, pitch: 77, velocity: 0.8 }
4114
+ ]
4115
+ },
4116
+ {
4117
+ ranges: [
4118
+ [12, 12],
4119
+ [14, 14],
4120
+ [16, 16],
4121
+ [18, 18],
4122
+ [36, 36],
4123
+ [38, 38],
4124
+ [40, 40],
4125
+ [42, 42],
4126
+ [44, 44],
4127
+ [46, 46],
4128
+ [48, 48],
4129
+ [50, 50],
4130
+ [70, 70],
4131
+ [72, 72],
4132
+ [74, 74],
4133
+ [76, 76],
4134
+ [78, 78],
4135
+ [80, 80],
4136
+ [82, 82],
4137
+ [84, 84],
4138
+ [86, 86],
4139
+ [88, 88],
4140
+ [90, 90],
4141
+ [92, 92],
4142
+ [94, 94],
4143
+ [96, 96],
4144
+ [98, 98]
4145
+ ],
4146
+ pattern: [
4147
+ { step: 12, pitch: 77, velocity: 0.8 },
4148
+ { step: 36, pitch: 77, velocity: 0.8 },
4149
+ { step: 72, pitch: 77, velocity: 0.8 },
4150
+ { step: 120, pitch: 77, velocity: 0.8 },
4151
+ { step: 156, pitch: 77, velocity: 0.8 }
4152
+ ]
4153
+ },
4154
+ {
4155
+ ranges: [
4156
+ [13, 13],
4157
+ [17, 17],
4158
+ [37, 37],
4159
+ [41, 41],
4160
+ [45, 45],
4161
+ [49, 49],
4162
+ [71, 71],
4163
+ [75, 75],
4164
+ [79, 79],
4165
+ [83, 83],
4166
+ [87, 87],
4167
+ [91, 91],
4168
+ [95, 95],
4169
+ [99, 99]
4170
+ ],
4171
+ pattern: [
4172
+ { step: 24, pitch: 77, velocity: 0.8 },
4173
+ { step: 48, pitch: 77, velocity: 0.8 },
4174
+ { step: 96, pitch: 77, velocity: 0.8 },
4175
+ { step: 132, pitch: 77, velocity: 0.8 },
4176
+ { step: 168, pitch: 77, velocity: 0.8 }
4177
+ ]
4178
+ },
4179
+ {
4180
+ ranges: [
4181
+ [15, 15],
4182
+ [39, 39],
4183
+ [47, 47],
4184
+ [73, 73],
4185
+ [81, 81],
4186
+ [89, 89],
4187
+ [97, 97]
4188
+ ],
4189
+ pattern: [
4190
+ { step: 0, pitch: 57, velocity: 0.8 },
4191
+ { step: 24, pitch: 77, velocity: 0.8 },
4192
+ { step: 48, pitch: 77, velocity: 0.8 },
4193
+ { step: 96, pitch: 77, velocity: 0.8 },
4194
+ { step: 132, pitch: 77, velocity: 0.8 },
4195
+ { step: 168, pitch: 77, velocity: 0.8 }
4196
+ ]
4197
+ },
4198
+ {
4199
+ ranges: [
4200
+ [22, 22],
4201
+ [56, 56]
4202
+ ],
4203
+ pattern: [
4204
+ { step: 72, pitch: 77, velocity: 0.8 },
4205
+ { step: 96, pitch: 77, velocity: 0.8 },
4206
+ { step: 144, pitch: 77, velocity: 0.8 }
4207
+ ]
4208
+ },
4209
+ {
4210
+ ranges: [
4211
+ [26, 26],
4212
+ [60, 60]
4213
+ ],
4214
+ pattern: [
4215
+ { step: 96, pitch: 77, velocity: 0.8 },
4216
+ { step: 132, pitch: 77, velocity: 0.8 },
4217
+ { step: 168, pitch: 77, velocity: 0.8 }
4218
+ ]
4219
+ },
4220
+ {
4221
+ ranges: [
4222
+ [33, 33],
4223
+ [67, 67]
4224
+ ],
4225
+ pattern: [{ step: 144, pitch: 110, velocity: 1 }]
4226
+ },
4227
+ {
4228
+ ranges: [
4229
+ [34, 34],
4230
+ [68, 68]
4231
+ ],
4232
+ pattern: [
4233
+ { step: 0, pitch: 83, velocity: 0.8 },
4234
+ { step: 48, pitch: 83, velocity: 0.8 },
4235
+ { step: 96, pitch: 83, velocity: 0.8 }
4236
+ ]
4237
+ },
4238
+ {
4239
+ ranges: [[100, 100]],
4240
+ pattern: [
4241
+ { step: 12, pitch: 77, velocity: 0.8 },
4242
+ { step: 36, pitch: 77, velocity: 0.8 },
4243
+ { step: 72, pitch: 77, velocity: 0.8 }
4244
+ ]
4245
+ }
4246
+ ]
4247
+ },
4248
+ vecolite: {
4249
+ label: "vecolite",
4250
+ font: "Chaos_sf2_file:0",
4251
+ pattern: [
4252
+ {
4253
+ ranges: [
4254
+ [1, 49],
4255
+ [51, 53],
4256
+ [55, 56],
4257
+ [58, 75]
4258
+ ],
4259
+ pattern: [{ step: 48, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 }]
4260
+ },
4261
+ {
4262
+ ranges: [
4263
+ [8, 31],
4264
+ [60, 75]
4265
+ ],
4266
+ pattern: [{ step: 144, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 }]
4267
+ },
4268
+ {
4269
+ ranges: [
4270
+ [9, 24],
4271
+ [33, 43]
4272
+ ],
4273
+ pattern: [{ step: 48, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 }]
4274
+ },
4275
+ {
4276
+ ranges: [
4277
+ [9, 12],
4278
+ [18, 32],
4279
+ [42, 48]
4280
+ ],
4281
+ pattern: [{ step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 }]
4282
+ },
4283
+ {
4284
+ ranges: [[9, 31]],
4285
+ pattern: [{ step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 }]
4286
+ },
4287
+ {
4288
+ ranges: [
4289
+ [10, 16],
4290
+ [18, 25],
4291
+ [34, 40]
4292
+ ],
4293
+ pattern: [{ step: 24, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }]
4294
+ },
4295
+ {
4296
+ ranges: [[33, 47]],
4297
+ pattern: [
4298
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4299
+ { step: 144, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 }
4300
+ ]
4301
+ },
4302
+ {
4303
+ ranges: [
4304
+ [9, 15],
4305
+ [33, 39]
4306
+ ],
4307
+ pattern: [
4308
+ { step: 72, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4309
+ { step: 88, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4310
+ { step: 96, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4311
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4312
+ { step: 120, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4313
+ { step: 120, pitch: 48, velocity: 0.9 }
4314
+ ]
4315
+ },
4316
+ {
4317
+ ranges: [
4318
+ [61, 67],
4319
+ [69, 75]
4320
+ ],
4321
+ pattern: [
4322
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4323
+ { step: 0, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4324
+ { step: 24, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4325
+ { step: 40, pitch: DRUM_KEYS.sideStick, velocity: 0.9 }
4326
+ ]
4327
+ },
4328
+ {
4329
+ ranges: [
4330
+ [24, 31],
4331
+ [72, 75]
4332
+ ],
4333
+ pattern: [{ step: 136, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 }]
4334
+ },
4335
+ {
4336
+ ranges: [
4337
+ [61, 66],
4338
+ [69, 74]
4339
+ ],
4340
+ pattern: [{ step: 24, pitch: DRUM_KEYS.handClap, velocity: 0.9 }]
4341
+ },
4342
+ {
4343
+ ranges: [
4344
+ [61, 63],
4345
+ [65, 67],
4346
+ [69, 71],
4347
+ [73, 75]
4348
+ ],
4349
+ pattern: [
4350
+ { step: 16, pitch: 40, velocity: 0.5 },
4351
+ { step: 40, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 }
4352
+ ]
4353
+ },
4354
+ {
4355
+ ranges: [[1, 8]],
4356
+ pattern: [
4357
+ { step: 120, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4358
+ { step: 144, pitch: DRUM_KEYS.handClap, velocity: 0.9 }
4359
+ ]
4360
+ },
4361
+ {
4362
+ ranges: [[2, 9]],
4363
+ pattern: [{ step: 24, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 }]
4364
+ },
4365
+ {
4366
+ ranges: [
4367
+ [10, 12],
4368
+ [18, 20],
4369
+ [22, 25]
4370
+ ],
4371
+ pattern: [
4372
+ { step: 0, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4373
+ { step: 0, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 }
4374
+ ]
4375
+ },
4376
+ {
4377
+ ranges: [[17, 24]],
4378
+ pattern: [
4379
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4380
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 }
4381
+ ]
4382
+ },
4383
+ {
4384
+ ranges: [[25, 32]],
4385
+ pattern: [{ step: 40, pitch: DRUM_KEYS.sideStick, velocity: 0.9 }]
4386
+ },
4387
+ {
4388
+ ranges: [[26, 33]],
4389
+ pattern: [{ step: 0, pitch: 41, velocity: 0.9 }]
4390
+ },
4391
+ {
4392
+ ranges: [[68, 75]],
4393
+ pattern: [
4394
+ { step: 48, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4395
+ { step: 72, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4396
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4397
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4398
+ { step: 120, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4399
+ { step: 120, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4400
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 }
4401
+ ]
4402
+ },
4403
+ {
4404
+ ranges: [
4405
+ [14, 16],
4406
+ [34, 36],
4407
+ [38, 40]
4408
+ ],
4409
+ pattern: [
4410
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4411
+ { step: 0, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4412
+ { step: 0, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 }
4413
+ ]
4414
+ },
4415
+ {
4416
+ ranges: [[25, 31]],
4417
+ pattern: [
4418
+ { step: 48, pitch: 41, velocity: 0.9 },
4419
+ { step: 64, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4420
+ { step: 72, pitch: 40, velocity: 0.9 },
4421
+ { step: 72, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 },
4422
+ { step: 88, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4423
+ { step: 88, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 },
4424
+ { step: 96, pitch: 41, velocity: 0.9 },
4425
+ { step: 96, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 },
4426
+ { step: 112, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4427
+ { step: 120, pitch: 40, velocity: 0.9 },
4428
+ { step: 120, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 },
4429
+ { step: 136, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4430
+ { step: 136, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 },
4431
+ { step: 144, pitch: 41, velocity: 0.9 },
4432
+ { step: 144, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 },
4433
+ { step: 160, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4434
+ { step: 168, pitch: 40, velocity: 0.9 },
4435
+ { step: 168, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 },
4436
+ { step: 184, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4437
+ { step: 184, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 }
4438
+ ]
4439
+ },
4440
+ {
4441
+ ranges: [[26, 32]],
4442
+ pattern: [
4443
+ { step: 0, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 },
4444
+ { step: 16, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4445
+ { step: 24, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 },
4446
+ { step: 40, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4447
+ { step: 40, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 }
4448
+ ]
4449
+ },
4450
+ {
4451
+ ranges: [[60, 66]],
4452
+ pattern: [
4453
+ { step: 48, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4454
+ { step: 64, pitch: 40, velocity: 0.5 },
4455
+ { step: 72, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4456
+ { step: 88, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4457
+ { step: 88, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4458
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4459
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4460
+ { step: 120, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4461
+ { step: 120, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4462
+ { step: 136, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4463
+ { step: 136, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4464
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4465
+ { step: 168, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }
4466
+ ]
4467
+ },
4468
+ {
4469
+ ranges: [[68, 74]],
4470
+ pattern: [{ step: 168, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }]
4471
+ },
4472
+ {
4473
+ ranges: [
4474
+ [17, 19],
4475
+ [21, 24]
4476
+ ],
4477
+ pattern: [
4478
+ { step: 72, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4479
+ { step: 96, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4480
+ { step: 120, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4481
+ { step: 120, pitch: 48, velocity: 0.9 },
4482
+ { step: 168, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }
4483
+ ]
4484
+ },
4485
+ {
4486
+ ranges: [
4487
+ [9, 11],
4488
+ [33, 35]
4489
+ ],
4490
+ pattern: [
4491
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4492
+ { step: 168, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4493
+ { step: 168, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4494
+ { step: 184, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 }
4495
+ ]
4496
+ },
4497
+ {
4498
+ ranges: [
4499
+ [13, 15],
4500
+ [37, 39]
4501
+ ],
4502
+ pattern: [
4503
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4504
+ { step: 168, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4505
+ { step: 168, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }
4506
+ ]
4507
+ },
4508
+ {
4509
+ ranges: [
4510
+ [26, 28],
4511
+ [30, 32]
4512
+ ],
4513
+ pattern: [{ step: 24, pitch: 40, velocity: 0.9 }]
4514
+ },
4515
+ {
4516
+ ranges: [
4517
+ [42, 44],
4518
+ [46, 48]
4519
+ ],
4520
+ pattern: [
4521
+ { step: 0, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4522
+ { step: 0, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4523
+ { step: 24, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }
4524
+ ]
4525
+ },
4526
+ {
4527
+ ranges: [
4528
+ [60, 62],
4529
+ [64, 66]
4530
+ ],
4531
+ pattern: [
4532
+ { step: 184, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4533
+ { step: 184, pitch: DRUM_KEYS.handClap, velocity: 0.9 }
4534
+ ]
4535
+ },
4536
+ {
4537
+ ranges: [
4538
+ [17, 17],
4539
+ [21, 21],
4540
+ [41, 41],
4541
+ [45, 45],
4542
+ [49, 49],
4543
+ [58, 60],
4544
+ [67, 68]
4545
+ ],
4546
+ pattern: [{ step: 48, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 }]
4547
+ },
4548
+ {
4549
+ ranges: [[41, 43]],
4550
+ pattern: [
4551
+ { step: 72, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4552
+ { step: 96, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4553
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4554
+ { step: 120, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4555
+ { step: 120, pitch: 48, velocity: 0.9 },
4556
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4557
+ { step: 168, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }
4558
+ ]
4559
+ },
4560
+ {
4561
+ ranges: [[45, 47]],
4562
+ pattern: [
4563
+ { step: 48, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4564
+ { step: 72, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4565
+ { step: 96, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4566
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4567
+ { step: 120, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4568
+ { step: 120, pitch: 48, velocity: 0.9 },
4569
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4570
+ { step: 168, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }
4571
+ ]
4572
+ },
4573
+ {
4574
+ ranges: [[56, 58]],
4575
+ pattern: [
4576
+ { step: 24, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4577
+ { step: 160, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 }
4578
+ ]
4579
+ },
4580
+ {
4581
+ ranges: [[57, 59]],
4582
+ pattern: [{ step: 16, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 }]
4583
+ },
4584
+ {
4585
+ ranges: [[68, 70]],
4586
+ pattern: [
4587
+ { step: 64, pitch: 40, velocity: 0.5 },
4588
+ { step: 88, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4589
+ { step: 88, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4590
+ { step: 136, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4591
+ { step: 136, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4592
+ { step: 184, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4593
+ { step: 184, pitch: DRUM_KEYS.handClap, velocity: 0.9 }
4594
+ ]
4595
+ },
4596
+ {
4597
+ ranges: [[72, 74]],
4598
+ pattern: [
4599
+ { step: 64, pitch: 40, velocity: 0.5 },
4600
+ { step: 88, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4601
+ { step: 88, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4602
+ { step: 136, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4603
+ { step: 184, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4604
+ { step: 184, pitch: DRUM_KEYS.handClap, velocity: 0.9 }
4605
+ ]
4606
+ },
4607
+ {
4608
+ ranges: [[56, 57]],
4609
+ pattern: [
4610
+ { step: 144, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4611
+ { step: 168, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }
4612
+ ]
4613
+ },
4614
+ {
4615
+ ranges: [[58, 59]],
4616
+ pattern: [
4617
+ { step: 0, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4618
+ { step: 48, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4619
+ { step: 48, pitch: DRUM_KEYS.handClap, velocity: 0.9 }
4620
+ ]
4621
+ },
4622
+ {
4623
+ ranges: [[1, 1]],
4624
+ pattern: [{ step: 48, pitch: DRUM_KEYS.splashCymbal, velocity: 0.9 }]
4625
+ },
4626
+ {
4627
+ ranges: [[4, 4]],
4628
+ pattern: [
4629
+ { step: 84, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4630
+ { step: 144, pitch: DRUM_KEYS.highTom, velocity: 0.9 },
4631
+ { step: 160, pitch: 48, velocity: 0.9 },
4632
+ { step: 184, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 }
4633
+ ]
4634
+ },
4635
+ {
4636
+ ranges: [[5, 5]],
4637
+ pattern: [
4638
+ { step: 16, pitch: DRUM_KEYS.lowTom, velocity: 0.9 },
4639
+ { step: 24, pitch: 43, velocity: 0.9 },
4640
+ { step: 40, pitch: 43, velocity: 0.9 },
4641
+ { step: 48, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 }
4642
+ ]
4643
+ },
4644
+ {
4645
+ ranges: [[8, 8]],
4646
+ pattern: [
4647
+ { step: 84, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4648
+ { step: 180, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 }
4649
+ ]
4650
+ },
4651
+ {
4652
+ ranges: [[9, 9]],
4653
+ pattern: [
4654
+ { step: 0, pitch: 40, velocity: 0.9 },
4655
+ { step: 8, pitch: 40, velocity: 0.9 },
4656
+ { step: 16, pitch: 40, velocity: 0.9 },
4657
+ { step: 24, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4658
+ { step: 48, pitch: DRUM_KEYS.splashCymbal, velocity: 0.9 }
4659
+ ]
4660
+ },
4661
+ {
4662
+ ranges: [
4663
+ [10, 10],
4664
+ [14, 14],
4665
+ [18, 18],
4666
+ [22, 22],
4667
+ [34, 34],
4668
+ [38, 38],
4669
+ [42, 42],
4670
+ [44, 44],
4671
+ [46, 46]
4672
+ ],
4673
+ pattern: [{ step: 24, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 }]
4674
+ },
4675
+ {
4676
+ ranges: [
4677
+ [11, 11],
4678
+ [15, 15],
4679
+ [35, 35],
4680
+ [39, 39]
4681
+ ],
4682
+ pattern: [
4683
+ { step: 16, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
4684
+ { step: 40, pitch: DRUM_KEYS.handClap, velocity: 0.9 }
4685
+ ]
4686
+ },
4687
+ {
4688
+ ranges: [
4689
+ [12, 12],
4690
+ [36, 36]
4691
+ ],
4692
+ pattern: [
4693
+ { step: 24, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
4694
+ { step: 144, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }
4695
+ ]
4696
+ },
4697
+ {
4698
+ ranges: [
4699
+ [13, 13],
4700
+ [37, 37]
4701
+ ],
4702
+ pattern: [
4703
+ { step: 16, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
4704
+ { step: 24, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4705
+ { step: 48, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 }
4706
+ ]
4707
+ },
4708
+ {
4709
+ ranges: [
4710
+ [16, 16],
4711
+ [40, 40]
4712
+ ],
4713
+ pattern: [
4714
+ { step: 24, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
4715
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4716
+ { step: 72, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4717
+ { step: 88, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4718
+ { step: 96, pitch: 40, velocity: 0.9 },
4719
+ { step: 120, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4720
+ { step: 136, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4721
+ { step: 144, pitch: 52, velocity: 0.9 }
4722
+ ]
4723
+ },
4724
+ {
4725
+ ranges: [
4726
+ [19, 19],
4727
+ [43, 43]
4728
+ ],
4729
+ pattern: [
4730
+ { step: 16, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
4731
+ { step: 40, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4732
+ { step: 48, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 }
4733
+ ]
4734
+ },
4735
+ {
4736
+ ranges: [[20, 20]],
4737
+ pattern: [
4738
+ { step: 24, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
4739
+ { step: 24, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4740
+ { step: 32, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4741
+ { step: 40, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4742
+ { step: 72, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4743
+ { step: 120, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 }
4744
+ ]
4745
+ },
4746
+ {
4747
+ ranges: [
4748
+ [23, 23],
4749
+ [47, 47]
4750
+ ],
4751
+ pattern: [{ step: 16, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 }]
4752
+ },
4753
+ {
4754
+ ranges: [[24, 24]],
4755
+ pattern: [
4756
+ { step: 24, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
4757
+ { step: 72, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4758
+ { step: 72, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4759
+ { step: 88, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4760
+ { step: 88, pitch: 40, velocity: 0.9 },
4761
+ { step: 112, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4762
+ { step: 120, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4763
+ { step: 136, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4764
+ { step: 152, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4765
+ { step: 160, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4766
+ { step: 168, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4767
+ { step: 176, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
4768
+ { step: 176, pitch: 40, velocity: 0.9 },
4769
+ { step: 184, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 }
4770
+ ]
4771
+ },
4772
+ {
4773
+ ranges: [[25, 25]],
4774
+ pattern: [
4775
+ { step: 8, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4776
+ { step: 16, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
4777
+ { step: 16, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4778
+ { step: 16, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4779
+ { step: 24, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4780
+ { step: 24, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 },
4781
+ { step: 48, pitch: 52, velocity: 0.9 }
4782
+ ]
4783
+ },
4784
+ {
4785
+ ranges: [
4786
+ [26, 26],
4787
+ [30, 30]
4788
+ ],
4789
+ pattern: [{ step: 48, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 }]
4790
+ },
4791
+ {
4792
+ ranges: [
4793
+ [27, 27],
4794
+ [31, 31]
4795
+ ],
4796
+ pattern: [{ step: 48, pitch: 52, velocity: 0.9 }]
4797
+ },
4798
+ {
4799
+ ranges: [[28, 28]],
4800
+ pattern: [
4801
+ { step: 48, pitch: DRUM_KEYS.rideCymbal1, velocity: 0.9 },
4802
+ { step: 136, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4803
+ { step: 160, pitch: DRUM_KEYS.handClap, velocity: 0.9 }
4804
+ ]
4805
+ },
4806
+ {
4807
+ ranges: [[29, 29]],
4808
+ pattern: [
4809
+ { step: 0, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4810
+ { step: 16, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4811
+ { step: 24, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4812
+ { step: 40, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4813
+ { step: 48, pitch: 52, velocity: 0.9 }
4814
+ ]
4815
+ },
4816
+ {
4817
+ ranges: [[32, 32]],
4818
+ pattern: [
4819
+ { step: 48, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 },
4820
+ { step: 48, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4821
+ { step: 144, pitch: DRUM_KEYS.highTom, velocity: 0.9 },
4822
+ { step: 160, pitch: 48, velocity: 0.9 },
4823
+ { step: 168, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
4824
+ { step: 176, pitch: DRUM_KEYS.lowTom, velocity: 0.9 },
4825
+ { step: 184, pitch: 43, velocity: 0.9 }
4826
+ ]
4827
+ },
4828
+ {
4829
+ ranges: [[33, 33]],
4830
+ pattern: [
4831
+ { step: 16, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
4832
+ { step: 16, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4833
+ { step: 24, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4834
+ { step: 24, pitch: DRUM_KEYS.lowTom, velocity: 0.9 },
4835
+ { step: 32, pitch: 43, velocity: 0.9 },
4836
+ { step: 40, pitch: 41, velocity: 0.9 },
4837
+ { step: 48, pitch: DRUM_KEYS.splashCymbal, velocity: 0.9 }
4838
+ ]
4839
+ },
4840
+ {
4841
+ ranges: [[48, 48]],
4842
+ pattern: [
4843
+ { step: 24, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
4844
+ { step: 48, pitch: DRUM_KEYS.splashCymbal, velocity: 0.9 },
4845
+ { step: 48, pitch: 48, velocity: 0.9 }
4846
+ ]
4847
+ },
4848
+ {
4849
+ ranges: [[51, 51]],
4850
+ pattern: [
4851
+ { step: 24, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4852
+ { step: 48, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }
4853
+ ]
4854
+ },
4855
+ {
4856
+ ranges: [[52, 52]],
4857
+ pattern: [
4858
+ { step: 72, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4859
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4860
+ { step: 120, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4861
+ { step: 144, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4862
+ { step: 168, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 }
4863
+ ]
4864
+ },
4865
+ {
4866
+ ranges: [[53, 53]],
4867
+ pattern: [
4868
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4869
+ { step: 24, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4870
+ { step: 48, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 }
4871
+ ]
4872
+ },
4873
+ {
4874
+ ranges: [[55, 55]],
4875
+ pattern: [{ step: 48, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }]
4876
+ },
4877
+ {
4878
+ ranges: [[56, 56]],
4879
+ pattern: [
4880
+ { step: 48, pitch: 41, velocity: 0.9 },
4881
+ { step: 64, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4882
+ { step: 72, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4883
+ { step: 112, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4884
+ { step: 120, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4885
+ { step: 144, pitch: 41, velocity: 0.9 }
4886
+ ]
4887
+ },
4888
+ {
4889
+ ranges: [[57, 57]],
4890
+ pattern: [
4891
+ { step: 24, pitch: 40, velocity: 0.9 },
4892
+ { step: 32, pitch: 40, velocity: 0.9 },
4893
+ { step: 40, pitch: 40, velocity: 0.9 },
4894
+ { step: 48, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4895
+ { step: 72, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4896
+ { step: 72, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4897
+ { step: 72, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 },
4898
+ { step: 112, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4899
+ { step: 112, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4900
+ { step: 112, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 },
4901
+ { step: 144, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4902
+ { step: 144, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 }
4903
+ ]
4904
+ },
4905
+ {
4906
+ ranges: [[58, 58]],
4907
+ pattern: [
4908
+ { step: 8, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4909
+ { step: 40, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4910
+ { step: 88, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4911
+ { step: 88, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4912
+ { step: 88, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 },
4913
+ { step: 120, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4914
+ { step: 120, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4915
+ { step: 120, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 },
4916
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4917
+ { step: 152, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4918
+ { step: 168, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4919
+ { step: 176, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4920
+ { step: 184, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 }
4921
+ ]
4922
+ },
4923
+ {
4924
+ ranges: [[59, 59]],
4925
+ pattern: [
4926
+ { step: 24, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4927
+ { step: 24, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4928
+ { step: 24, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 },
4929
+ { step: 24, pitch: DRUM_KEYS.pedalHihat, velocity: 0.9 },
4930
+ { step: 40, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4931
+ { step: 40, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4932
+ { step: 40, pitch: DRUM_KEYS.pedalHihat, velocity: 0.9 },
4933
+ { step: 40, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 },
4934
+ { step: 96, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4935
+ { step: 144, pitch: DRUM_KEYS.openHihat, velocity: 0.9 }
4936
+ ]
4937
+ },
4938
+ {
4939
+ ranges: [[60, 60]],
4940
+ pattern: [
4941
+ { step: 0, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4942
+ { step: 0, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4943
+ { step: 16, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4944
+ { step: 24, pitch: 52, velocity: 0.9 }
4945
+ ]
4946
+ },
4947
+ {
4948
+ ranges: [
4949
+ [61, 61],
4950
+ [65, 65],
4951
+ [69, 69],
4952
+ [73, 73]
4953
+ ],
4954
+ pattern: [{ step: 160, pitch: DRUM_KEYS.handClap, velocity: 0.9 }]
4955
+ },
4956
+ {
4957
+ ranges: [[63, 63]],
4958
+ pattern: [
4959
+ { step: 160, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4960
+ { step: 168, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4961
+ { step: 184, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4962
+ { step: 184, pitch: 40, velocity: 0.9 }
4963
+ ]
4964
+ },
4965
+ {
4966
+ ranges: [[64, 64]],
4967
+ pattern: [
4968
+ { step: 0, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4969
+ { step: 8, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4970
+ { step: 16, pitch: DRUM_KEYS.acousticSnare, velocity: 1 },
4971
+ { step: 48, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 }
4972
+ ]
4973
+ },
4974
+ {
4975
+ ranges: [[67, 67]],
4976
+ pattern: [
4977
+ { step: 24, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
4978
+ { step: 32, pitch: 40, velocity: 0.9 },
4979
+ { step: 40, pitch: DRUM_KEYS.pedalHihat, velocity: 0.9 },
4980
+ { step: 48, pitch: DRUM_KEYS.openHihat, velocity: 0.9 },
4981
+ { step: 48, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
4982
+ { step: 72, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4983
+ { step: 88, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4984
+ { step: 112, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4985
+ { step: 120, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4986
+ { step: 120, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4987
+ { step: 168, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4988
+ { step: 184, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 }
4989
+ ]
4990
+ },
4991
+ {
4992
+ ranges: [[68, 68]],
4993
+ pattern: [
4994
+ { step: 16, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4995
+ { step: 16, pitch: DRUM_KEYS.closedHihat, velocity: 0.9 },
4996
+ { step: 24, pitch: DRUM_KEYS.bassDrum1, velocity: 0.9 },
4997
+ { step: 24, pitch: 52, velocity: 0.9 }
4998
+ ]
4999
+ },
5000
+ {
5001
+ ranges: [[71, 71]],
5002
+ pattern: [
5003
+ { step: 72, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
5004
+ { step: 168, pitch: DRUM_KEYS.handClap, velocity: 0.9 }
5005
+ ]
5006
+ },
5007
+ {
5008
+ ranges: [[72, 72]],
5009
+ pattern: [
5010
+ { step: 16, pitch: 40, velocity: 0.9 },
5011
+ { step: 24, pitch: 52, velocity: 0.9 },
5012
+ { step: 48, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 }
5013
+ ]
5014
+ },
5015
+ {
5016
+ ranges: [[75, 75]],
5017
+ pattern: [
5018
+ { step: 24, pitch: DRUM_KEYS.acousticSnare, velocity: 0.9 },
5019
+ { step: 32, pitch: 40, velocity: 0.9 },
5020
+ { step: 40, pitch: DRUM_KEYS.pedalHihat, velocity: 0.9 },
5021
+ { step: 48, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 },
5022
+ { step: 48, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
5023
+ { step: 48, pitch: DRUM_KEYS.highTom, velocity: 0.9 },
5024
+ { step: 64, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
5025
+ { step: 64, pitch: 48, velocity: 0.9 },
5026
+ { step: 72, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
5027
+ { step: 72, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
5028
+ { step: 88, pitch: DRUM_KEYS.pedalHihat, velocity: 0.9 },
5029
+ { step: 88, pitch: DRUM_KEYS.lowTom, velocity: 0.9 },
5030
+ { step: 96, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
5031
+ { step: 96, pitch: 48, velocity: 0.9 },
5032
+ { step: 112, pitch: DRUM_KEYS.sideStick, velocity: 0.9 },
5033
+ { step: 112, pitch: DRUM_KEYS.lowMidTom, velocity: 0.9 },
5034
+ { step: 120, pitch: DRUM_KEYS.lowTom, velocity: 0.9 },
5035
+ { step: 120, pitch: DRUM_KEYS.splashCymbal, velocity: 0.9 },
5036
+ { step: 128, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
5037
+ { step: 136, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
5038
+ { step: 136, pitch: 43, velocity: 0.9 },
5039
+ { step: 136, pitch: DRUM_KEYS.pedalHihat, velocity: 0.9 },
5040
+ { step: 144, pitch: DRUM_KEYS.handClap, velocity: 0.9 },
5041
+ { step: 144, pitch: 52, velocity: 0.9 },
5042
+ { step: 144, pitch: 41, velocity: 0.9 },
5043
+ { step: 144, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.9 }
5044
+ ]
5045
+ }
5046
+ ]
5047
+ },
5048
+ tsuchi_he_to_shizumu_kagerou: {
5049
+ label: "\u3064\u3061\u3078\u3068\u3057\u305A\u3080\u30AB\u30B2\u30ED\u30A6",
5050
+ font: "FluidR3_GM_sf2_file:11",
5051
+ pattern: [
5052
+ {
5053
+ ranges: [[8, 85]],
5054
+ pattern: [{ step: 72, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 }]
5055
+ },
5056
+ {
5057
+ ranges: [
5058
+ [2, 9],
5059
+ [15, 52],
5060
+ [54, 85]
5061
+ ],
5062
+ pattern: [{ step: 0, pitch: 35, velocity: 0.8 }]
5063
+ },
5064
+ {
5065
+ ranges: [
5066
+ [8, 46],
5067
+ [50, 85]
5068
+ ],
5069
+ pattern: [{ step: 96, pitch: 35, velocity: 0.8 }]
5070
+ },
5071
+ {
5072
+ ranges: [
5073
+ [24, 37],
5074
+ [63, 76],
5075
+ [102, 115],
5076
+ [117, 130]
5077
+ ],
5078
+ pattern: [
5079
+ { step: 120, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5080
+ { step: 120, pitch: 60, velocity: 0.8 },
5081
+ { step: 144, pitch: 35, velocity: 0.8 },
5082
+ { step: 144, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5083
+ { step: 168, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5084
+ { step: 168, pitch: 60, velocity: 0.8 }
5085
+ ]
5086
+ },
5087
+ {
5088
+ ranges: [[94, 131]],
5089
+ pattern: [
5090
+ { step: 0, pitch: 35, velocity: 0.8 },
5091
+ { step: 96, pitch: 35, velocity: 0.8 }
5092
+ ]
5093
+ },
5094
+ {
5095
+ ranges: [[102, 131]],
5096
+ pattern: [
5097
+ { step: 24, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5098
+ { step: 48, pitch: 35, velocity: 0.8 },
5099
+ { step: 48, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5100
+ { step: 48, pitch: 60, velocity: 0.8 },
5101
+ { step: 72, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 }
5102
+ ]
5103
+ },
5104
+ {
5105
+ ranges: [[24, 49]],
5106
+ pattern: [
5107
+ { step: 24, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5108
+ { step: 48, pitch: DRUM_KEYS.handClap, velocity: 0.8 }
5109
+ ]
5110
+ },
5111
+ {
5112
+ ranges: [[24, 46]],
5113
+ pattern: [
5114
+ { step: 48, pitch: 35, velocity: 0.8 },
5115
+ { step: 48, pitch: 60, velocity: 0.8 }
5116
+ ]
5117
+ },
5118
+ {
5119
+ ranges: [[63, 85]],
5120
+ pattern: [
5121
+ { step: 24, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5122
+ { step: 48, pitch: 35, velocity: 0.8 }
5123
+ ]
5124
+ },
5125
+ {
5126
+ ranges: [
5127
+ [8, 22],
5128
+ [78, 85]
5129
+ ],
5130
+ pattern: [
5131
+ { step: 120, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5132
+ { step: 144, pitch: 35, velocity: 0.8 },
5133
+ { step: 168, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 }
5134
+ ]
5135
+ },
5136
+ {
5137
+ ranges: [[39, 60]],
5138
+ pattern: [{ step: 144, pitch: DRUM_KEYS.handClap, velocity: 0.8 }]
5139
+ },
5140
+ {
5141
+ ranges: [[63, 84]],
5142
+ pattern: [
5143
+ { step: 48, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5144
+ { step: 48, pitch: 60, velocity: 0.8 }
5145
+ ]
5146
+ },
5147
+ {
5148
+ ranges: [[2, 22]],
5149
+ pattern: [{ step: 48, pitch: 35, velocity: 0.8 }]
5150
+ },
5151
+ {
5152
+ ranges: [
5153
+ [8, 9],
5154
+ [15, 22],
5155
+ [51, 52],
5156
+ [54, 61]
5157
+ ],
5158
+ pattern: [{ step: 24, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 }]
5159
+ },
5160
+ {
5161
+ ranges: [
5162
+ [8, 21],
5163
+ [98, 100]
5164
+ ],
5165
+ pattern: [
5166
+ { step: 48, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5167
+ { step: 144, pitch: DRUM_KEYS.handClap, velocity: 0.8 }
5168
+ ]
5169
+ },
5170
+ {
5171
+ ranges: [
5172
+ [16, 22],
5173
+ [55, 61]
5174
+ ],
5175
+ pattern: [
5176
+ { step: 0, pitch: 77, velocity: 0.8 },
5177
+ { step: 24, pitch: 76, velocity: 0.8 },
5178
+ { step: 48, pitch: 77, velocity: 0.8 },
5179
+ { step: 72, pitch: 76, velocity: 0.8 },
5180
+ { step: 168, pitch: 76, velocity: 0.8 }
5181
+ ]
5182
+ },
5183
+ {
5184
+ ranges: [
5185
+ [50, 61],
5186
+ [95, 95]
5187
+ ],
5188
+ pattern: [{ step: 144, pitch: 35, velocity: 0.8 }]
5189
+ },
5190
+ {
5191
+ ranges: [
5192
+ [8, 15],
5193
+ [51, 54]
5194
+ ],
5195
+ pattern: [
5196
+ { step: 48, pitch: 60, velocity: 0.8 },
5197
+ { step: 120, pitch: 60, velocity: 0.8 },
5198
+ { step: 168, pitch: 60, velocity: 0.8 }
5199
+ ]
5200
+ },
5201
+ {
5202
+ ranges: [[39, 49]],
5203
+ pattern: [
5204
+ { step: 120, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5205
+ { step: 168, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 }
5206
+ ]
5207
+ },
5208
+ {
5209
+ ranges: [[51, 61]],
5210
+ pattern: [
5211
+ { step: 48, pitch: 35, velocity: 0.8 },
5212
+ { step: 120, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5213
+ { step: 168, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 }
5214
+ ]
5215
+ },
5216
+ {
5217
+ ranges: [[51, 60]],
5218
+ pattern: [{ step: 48, pitch: DRUM_KEYS.handClap, velocity: 0.8 }]
5219
+ },
5220
+ {
5221
+ ranges: [[39, 46]],
5222
+ pattern: [
5223
+ { step: 120, pitch: 60, velocity: 0.8 },
5224
+ { step: 144, pitch: 35, velocity: 0.8 },
5225
+ { step: 168, pitch: 60, velocity: 0.8 }
5226
+ ]
5227
+ },
5228
+ {
5229
+ ranges: [[78, 84]],
5230
+ pattern: [
5231
+ { step: 120, pitch: 60, velocity: 0.8 },
5232
+ { step: 144, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5233
+ { step: 168, pitch: 60, velocity: 0.8 }
5234
+ ]
5235
+ },
5236
+ {
5237
+ ranges: [[86, 92]],
5238
+ pattern: [{ step: 96, pitch: DRUM_KEYS.handClap, velocity: 0.8 }]
5239
+ },
5240
+ {
5241
+ ranges: [[2, 7]],
5242
+ pattern: [
5243
+ { step: 24, pitch: DRUM_KEYS.closedHihat, velocity: 0.6 },
5244
+ { step: 72, pitch: DRUM_KEYS.closedHihat, velocity: 0.6 }
5245
+ ]
5246
+ },
5247
+ {
5248
+ ranges: [[2, 6]],
5249
+ pattern: [
5250
+ { step: 96, pitch: 35, velocity: 0.8 },
5251
+ { step: 120, pitch: DRUM_KEYS.closedHihat, velocity: 0.6 },
5252
+ { step: 144, pitch: 35, velocity: 0.8 },
5253
+ { step: 168, pitch: DRUM_KEYS.closedHihat, velocity: 0.6 }
5254
+ ]
5255
+ },
5256
+ {
5257
+ ranges: [[97, 100]],
5258
+ pattern: [
5259
+ { step: 48, pitch: 35, velocity: 0.8 },
5260
+ { step: 144, pitch: 35, velocity: 0.8 }
5261
+ ]
5262
+ },
5263
+ {
5264
+ ranges: [[11, 13]],
5265
+ pattern: [
5266
+ { step: 0, pitch: 35, velocity: 0.8 },
5267
+ { step: 24, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 }
5268
+ ]
5269
+ },
5270
+ {
5271
+ ranges: [[47, 49]],
5272
+ pattern: [{ step: 120, pitch: 35, velocity: 0.8 }]
5273
+ },
5274
+ {
5275
+ ranges: [[100, 101]],
5276
+ pattern: [{ step: 0, pitch: DRUM_KEYS.handClap, velocity: 0.8 }]
5277
+ },
5278
+ {
5279
+ ranges: [[1, 1]],
5280
+ pattern: [
5281
+ { step: 0, pitch: 62, velocity: 0.8 },
5282
+ { step: 48, pitch: 62, velocity: 0.8 },
5283
+ { step: 96, pitch: 62, velocity: 0.8 },
5284
+ { step: 144, pitch: 62, velocity: 0.8 }
5285
+ ]
5286
+ },
5287
+ {
5288
+ ranges: [
5289
+ [8, 8],
5290
+ [47, 47],
5291
+ [86, 86]
5292
+ ],
5293
+ pattern: [{ step: 0, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.8 }]
5294
+ },
5295
+ {
5296
+ ranges: [
5297
+ [15, 15],
5298
+ [54, 54]
5299
+ ],
5300
+ pattern: [
5301
+ { step: 96, pitch: 60, velocity: 0.8 },
5302
+ { step: 144, pitch: 60, velocity: 0.8 }
5303
+ ]
5304
+ },
5305
+ {
5306
+ ranges: [
5307
+ [16, 16],
5308
+ [55, 55]
5309
+ ],
5310
+ pattern: [
5311
+ { step: 0, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.8 },
5312
+ { step: 96, pitch: 77, velocity: 0.8 },
5313
+ { step: 120, pitch: 77, velocity: 0.8 },
5314
+ { step: 144, pitch: 76, velocity: 0.8 }
5315
+ ]
5316
+ },
5317
+ {
5318
+ ranges: [
5319
+ [17, 17],
5320
+ [19, 19],
5321
+ [21, 21],
5322
+ [56, 56],
5323
+ [58, 58],
5324
+ [60, 60]
5325
+ ],
5326
+ pattern: [
5327
+ { step: 84, pitch: 77, velocity: 0.8 },
5328
+ { step: 108, pitch: 77, velocity: 0.8 },
5329
+ { step: 120, pitch: 76, velocity: 0.8 },
5330
+ { step: 144, pitch: 77, velocity: 0.8 }
5331
+ ]
5332
+ },
5333
+ {
5334
+ ranges: [
5335
+ [18, 18],
5336
+ [20, 20],
5337
+ [22, 22],
5338
+ [57, 57],
5339
+ [59, 59],
5340
+ [61, 61]
5341
+ ],
5342
+ pattern: [
5343
+ { step: 96, pitch: 77, velocity: 0.8 },
5344
+ { step: 120, pitch: 77, velocity: 0.8 },
5345
+ { step: 144, pitch: 76, velocity: 0.8 }
5346
+ ]
5347
+ },
5348
+ {
5349
+ ranges: [
5350
+ [23, 23],
5351
+ [62, 62]
5352
+ ],
5353
+ pattern: [
5354
+ { step: 0, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5355
+ { step: 0, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5356
+ { step: 36, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5357
+ { step: 36, pitch: 35, velocity: 0.8 },
5358
+ { step: 36, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5359
+ { step: 72, pitch: 35, velocity: 0.8 },
5360
+ { step: 72, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5361
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5362
+ { step: 96, pitch: DRUM_KEYS.handClap, velocity: 0.8 }
5363
+ ]
5364
+ },
5365
+ {
5366
+ ranges: [
5367
+ [24, 24],
5368
+ [39, 39],
5369
+ [63, 63],
5370
+ [78, 78],
5371
+ [117, 117]
5372
+ ],
5373
+ pattern: [{ step: 0, pitch: DRUM_KEYS.openHihat, velocity: 0.8 }]
5374
+ },
5375
+ {
5376
+ ranges: [[50, 50]],
5377
+ pattern: [
5378
+ { step: 0, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5379
+ { step: 0, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5380
+ { step: 36, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5381
+ { step: 36, pitch: 35, velocity: 0.8 },
5382
+ { step: 36, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5383
+ { step: 72, pitch: 35, velocity: 0.8 },
5384
+ { step: 72, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5385
+ { step: 96, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5386
+ { step: 120, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5387
+ { step: 144, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5388
+ { step: 168, pitch: 35, velocity: 0.8 }
5389
+ ]
5390
+ },
5391
+ {
5392
+ ranges: [[100, 100]],
5393
+ pattern: [
5394
+ { step: 96, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5395
+ { step: 120, pitch: 35, velocity: 0.8 },
5396
+ { step: 120, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5397
+ { step: 168, pitch: 35, velocity: 0.8 },
5398
+ { step: 168, pitch: DRUM_KEYS.handClap, velocity: 0.8 }
5399
+ ]
5400
+ },
5401
+ {
5402
+ ranges: [[101, 101]],
5403
+ pattern: [
5404
+ { step: 36, pitch: 35, velocity: 0.8 },
5405
+ { step: 36, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5406
+ { step: 72, pitch: 35, velocity: 0.8 },
5407
+ { step: 72, pitch: DRUM_KEYS.handClap, velocity: 0.8 },
5408
+ { step: 96, pitch: 60, velocity: 0 },
5409
+ { step: 108, pitch: 60, velocity: 0.1 },
5410
+ { step: 120, pitch: 60, velocity: 0.3 },
5411
+ { step: 132, pitch: 60, velocity: 0.3 },
5412
+ { step: 144, pitch: 60, velocity: 0.5 },
5413
+ { step: 156, pitch: 60, velocity: 0.6 },
5414
+ { step: 168, pitch: 60, velocity: 0.7 },
5415
+ { step: 180, pitch: 60, velocity: 0.8 }
5416
+ ]
5417
+ },
5418
+ {
5419
+ ranges: [[102, 102]],
5420
+ pattern: [
5421
+ { step: 0, pitch: DRUM_KEYS.crashCymbal1, velocity: 0.8 },
5422
+ { step: 0, pitch: DRUM_KEYS.openHihat, velocity: 0.8 }
5423
+ ]
5424
+ }
5425
+ ]
5426
+ },
5427
+ asayake: {
5428
+ label: "\u3042\u3055\u3084\u3051\u3082\u3086\u3046\u3084\u3051\u3082\u306A\u3044\u3093\u3060",
5429
+ font: "FluidR3_GM_sf2_file:11",
5430
+ pattern: [
5431
+ {
5432
+ ranges: [[1, 101]],
5433
+ pattern: [{ step: 48, pitch: 56, velocity: 0.8 }]
5434
+ },
5435
+ {
5436
+ ranges: [[2, 101]],
5437
+ pattern: [
5438
+ { step: 0, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
5439
+ { step: 24, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5440
+ { step: 36, pitch: 56, velocity: 0.8 },
5441
+ { step: 48, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
5442
+ { step: 48, pitch: 40, velocity: 0.8 },
5443
+ { step: 72, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5444
+ { step: 72, pitch: 56, velocity: 0.8 },
5445
+ { step: 96, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
5446
+ { step: 120, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 },
5447
+ { step: 144, pitch: DRUM_KEYS.bassDrum1, velocity: 0.8 },
5448
+ { step: 144, pitch: 40, velocity: 0.8 },
5449
+ { step: 168, pitch: DRUM_KEYS.closedHihat, velocity: 0.8 }
5450
+ ]
5451
+ },
5452
+ {
5453
+ ranges: [
5454
+ [1, 6],
5455
+ [17, 18],
5456
+ [21, 46],
5457
+ [57, 58],
5458
+ [61, 101]
5459
+ ],
5460
+ pattern: [{ step: 0, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }]
5461
+ },
5462
+ {
5463
+ ranges: [
5464
+ [1, 5],
5465
+ [19, 45],
5466
+ [59, 101]
5467
+ ],
5468
+ pattern: [{ step: 96, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }]
5469
+ },
5470
+ {
5471
+ ranges: [
5472
+ [1, 4],
5473
+ [14, 20],
5474
+ [22, 28],
5475
+ [30, 36],
5476
+ [38, 44],
5477
+ [54, 60],
5478
+ [62, 68],
5479
+ [70, 76],
5480
+ [78, 84],
5481
+ [86, 92],
5482
+ [94, 100]
5483
+ ],
5484
+ pattern: [
5485
+ { step: 132, pitch: 56, velocity: 0.8 },
5486
+ { step: 144, pitch: 56, velocity: 0.8 },
5487
+ { step: 168, pitch: 56, velocity: 0.8 }
5488
+ ]
5489
+ },
5490
+ {
5491
+ ranges: [
5492
+ [5, 14],
5493
+ [45, 54]
5494
+ ],
5495
+ pattern: [{ step: 168, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }]
5496
+ },
5497
+ {
5498
+ ranges: [
5499
+ [7, 13],
5500
+ [15, 16],
5501
+ [47, 53],
5502
+ [55, 56]
5503
+ ],
5504
+ pattern: [{ step: 48, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }]
5505
+ },
5506
+ {
5507
+ ranges: [
5508
+ [6, 12],
5509
+ [46, 52]
5510
+ ],
5511
+ pattern: [
5512
+ { step: 120, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5513
+ { step: 132, pitch: 56, velocity: 0.8 },
5514
+ { step: 144, pitch: 56, velocity: 0.8 },
5515
+ { step: 168, pitch: 56, velocity: 0.8 }
5516
+ ]
5517
+ },
5518
+ {
5519
+ ranges: [
5520
+ [3, 3],
5521
+ [19, 21],
5522
+ [23, 23],
5523
+ [27, 27],
5524
+ [31, 31],
5525
+ [35, 35],
5526
+ [39, 39],
5527
+ [43, 43],
5528
+ [59, 61],
5529
+ [63, 63],
5530
+ [67, 67],
5531
+ [71, 71],
5532
+ [75, 75],
5533
+ [79, 79],
5534
+ [83, 83],
5535
+ [87, 87],
5536
+ [91, 91],
5537
+ [95, 95],
5538
+ [99, 99]
5539
+ ],
5540
+ pattern: [
5541
+ { step: 48, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5542
+ { step: 144, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }
5543
+ ]
5544
+ },
5545
+ {
5546
+ ranges: [
5547
+ [15, 17],
5548
+ [55, 57]
5549
+ ],
5550
+ pattern: [
5551
+ { step: 96, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5552
+ { step: 144, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }
5553
+ ]
5554
+ },
5555
+ {
5556
+ ranges: [[1, 1]],
5557
+ pattern: [
5558
+ { step: 0, pitch: 56, velocity: 0.8 },
5559
+ { step: 48, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5560
+ { step: 96, pitch: 56, velocity: 0.8 },
5561
+ { step: 132, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5562
+ { step: 144, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5563
+ { step: 168, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }
5564
+ ]
5565
+ },
5566
+ {
5567
+ ranges: [
5568
+ [2, 2],
5569
+ [6, 6],
5570
+ [22, 22],
5571
+ [26, 26],
5572
+ [30, 30],
5573
+ [34, 34],
5574
+ [38, 38],
5575
+ [42, 42],
5576
+ [46, 46],
5577
+ [62, 62],
5578
+ [66, 66],
5579
+ [70, 70],
5580
+ [74, 74],
5581
+ [78, 78],
5582
+ [82, 82],
5583
+ [86, 86],
5584
+ [90, 90],
5585
+ [94, 94],
5586
+ [98, 98]
5587
+ ],
5588
+ pattern: [{ step: 0, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 }]
5589
+ },
5590
+ {
5591
+ ranges: [
5592
+ [5, 5],
5593
+ [45, 45]
5594
+ ],
5595
+ pattern: [
5596
+ { step: 48, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5597
+ { step: 84, pitch: 56, velocity: 0.8 },
5598
+ { step: 132, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5599
+ { step: 144, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }
5600
+ ]
5601
+ },
5602
+ {
5603
+ ranges: [
5604
+ [10, 10],
5605
+ [50, 50]
5606
+ ],
5607
+ pattern: [
5608
+ { step: 0, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5609
+ { step: 0, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 }
5610
+ ]
5611
+ },
5612
+ {
5613
+ ranges: [
5614
+ [13, 13],
5615
+ [53, 53]
5616
+ ],
5617
+ pattern: [
5618
+ { step: 0, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5619
+ { step: 84, pitch: 56, velocity: 0.8 },
5620
+ { step: 96, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5621
+ { step: 132, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5622
+ { step: 144, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }
5623
+ ]
5624
+ },
5625
+ {
5626
+ ranges: [
5627
+ [14, 14],
5628
+ [54, 54]
5629
+ ],
5630
+ pattern: [
5631
+ { step: 0, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 },
5632
+ { step: 120, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }
5633
+ ]
5634
+ },
5635
+ {
5636
+ ranges: [
5637
+ [18, 18],
5638
+ [58, 58]
5639
+ ],
5640
+ pattern: [
5641
+ { step: 0, pitch: DRUM_KEYS.splashCymbal, velocity: 0.8 },
5642
+ { step: 120, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5643
+ { step: 168, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }
5644
+ ]
5645
+ },
5646
+ {
5647
+ ranges: [
5648
+ [21, 21],
5649
+ [61, 61]
5650
+ ],
5651
+ pattern: [
5652
+ { step: 84, pitch: 56, velocity: 0.8 },
5653
+ { step: 132, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5654
+ { step: 168, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }
5655
+ ]
5656
+ },
5657
+ {
5658
+ ranges: [
5659
+ [25, 25],
5660
+ [33, 33],
5661
+ [41, 41],
5662
+ [65, 65],
5663
+ [73, 73],
5664
+ [81, 81],
5665
+ [89, 89],
5666
+ [97, 97]
5667
+ ],
5668
+ pattern: [
5669
+ { step: 48, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5670
+ { step: 132, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5671
+ { step: 144, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5672
+ { step: 168, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }
5673
+ ]
5674
+ },
5675
+ {
5676
+ ranges: [
5677
+ [29, 29],
5678
+ [37, 37],
5679
+ [69, 69],
5680
+ [77, 77],
5681
+ [85, 85],
5682
+ [93, 93],
5683
+ [101, 101]
5684
+ ],
5685
+ pattern: [
5686
+ { step: 48, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5687
+ { step: 84, pitch: 56, velocity: 0.8 },
5688
+ { step: 132, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5689
+ { step: 144, pitch: DRUM_KEYS.tambourine, velocity: 0.8 },
5690
+ { step: 168, pitch: DRUM_KEYS.tambourine, velocity: 0.8 }
5691
+ ]
3399
5692
  }
3400
- nowIndex++;
3401
- }
3402
- loopBase = 0;
3403
- lastPlayStep = fromStepValue - 1e-4;
3404
- lastRealTime = -1;
3405
- lastAudioTime = -1;
3406
- intervalId = setInterval(scheduleTick, TICK_INTERVAL_MS);
3407
- animationId = requestAnimationFrame(animate);
3408
- };
3409
- return {
3410
- start,
3411
- stop,
3412
- isActive: () => active,
3413
- getStartTime: () => startTime
3414
- };
5693
+ ]
5694
+ }
3415
5695
  };
3416
5696
 
3417
5697
  // src/synth.ts
@@ -3519,8 +5799,12 @@ var STEPS_PER_BAR = 192;
3519
5799
  var TRACK_ID_BY_INDEX = ["melody", "submelody", "bass", "chord"];
3520
5800
  var playPlacements = (placements, options) => {
3521
5801
  const bpm = options.bpm;
3522
- const drumPatternDict = options.drumPatterns ?? DRUM_PATTERNS;
3523
- const drumPattern = options.metaDrum ? drumPatternDict[options.metaDrum] ?? null : null;
5802
+ const drumPatternDict = {
5803
+ ...DRUM_PATTERNS,
5804
+ ...SONG_DRUM_PATTERNS,
5805
+ ...normalizeDrumPatterns(options.drumPatterns ?? {})
5806
+ };
5807
+ const drumPatternName = options.metaDrum ?? "none";
3524
5808
  let masterVolume = options.metaVolume ?? options.volume ?? 100;
3525
5809
  const drumVolume = options.metaDrumVolume ?? 80;
3526
5810
  const trackIndices = [...new Set(placements.map((p) => p.trackIndex))].sort(
@@ -3552,7 +5836,7 @@ var playPlacements = (placements, options) => {
3552
5836
  getTracks: () => seqTracks,
3553
5837
  getBpm: () => bpm,
3554
5838
  getPlayStartStep: () => options.startStep ?? 0,
3555
- getDrumPattern: () => drumPattern,
5839
+ getDrumPattern: (currentBar) => resolveDrumPattern(drumPatternName, drumPatternDict, currentBar),
3556
5840
  getSoloTrackId: () => null,
3557
5841
  getLoop: () => options.loop ?? false,
3558
5842
  cues: options.cues,
@@ -4374,6 +6658,7 @@ var DAW_CSS = `
4374
6658
  }
4375
6659
  .dtm-output-row { display: flex; gap: 8px; align-items: flex-start; margin-top: 6px; }
4376
6660
  .dtm-output-row pre { flex: 1; }
6661
+ .dtm-output-scroll { max-height: 240px; overflow-y: auto; }
4377
6662
 
4378
6663
  /* \u2500\u2500\u2500 \u30ED\u30FC\u30C7\u30A3\u30F3\u30B0\u30AA\u30FC\u30D0\u30FC\u30EC\u30A4 \u2500\u2500\u2500 */
4379
6664
  .dtm-overlay {
@@ -5626,8 +7911,12 @@ var mountMmlPlayer = (target, mml, options = {}) => {
5626
7911
  parseCustomVocals(mml).map((d) => [d.key, d])
5627
7912
  );
5628
7913
  const bpm = parsedBpm ?? options.defaultBpm ?? DEFAULT_BPM;
5629
- const drumPatternDict = options.drumPatterns ?? DRUM_PATTERNS;
5630
- const drumPattern = meta.drum ? drumPatternDict[meta.drum] ?? null : null;
7914
+ const drumPatternDict = {
7915
+ ...DRUM_PATTERNS,
7916
+ ...SONG_DRUM_PATTERNS,
7917
+ ...normalizeDrumPatterns(options.drumPatterns ?? {})
7918
+ };
7919
+ const drumPatternName = meta.drum ?? "none";
5631
7920
  const trackVolume = meta.volume ?? options.volume ?? 100;
5632
7921
  let masterVolume = options.masterVolume ?? 100;
5633
7922
  const drumVolume = meta.drumVolume ?? 80;
@@ -6442,7 +8731,7 @@ var mountMmlPlayer = (target, mml, options = {}) => {
6442
8731
  getTracks: () => seqTracks,
6443
8732
  getBpm: () => bpm,
6444
8733
  getPlayStartStep: () => 0,
6445
- getDrumPattern: () => drumPattern,
8734
+ getDrumPattern: (currentBar) => resolveDrumPattern(drumPatternName, drumPatternDict, currentBar),
6446
8735
  getSoloTrackId: () => null,
6447
8736
  getAudioTime,
6448
8737
  onPlayNote: (e) => {
@@ -7798,7 +10087,7 @@ var mountChordPlayer = (target, chords, options = {}) => {
7798
10087
  if (beatAbsSec > now + METRONOME_PLAN_AHEAD) break;
7799
10088
  if (beatAbsSec >= now - 0.01) {
7800
10089
  const isDownbeat = beat % 4 === 0;
7801
- const pitch = isDownbeat ? DRUM_KEYS.kick : DRUM_KEYS.hihatClosed;
10090
+ const pitch = isDownbeat ? DRUM_KEYS.bassDrum1 : DRUM_KEYS.closedHihat;
7802
10091
  const velocity = (isDownbeat ? 0.7 : 0.45) * (masterVolume / 100);
7803
10092
  const wafDrum = _drumCache.get(pitch);
7804
10093
  if (wafDrum) {
@@ -7840,7 +10129,7 @@ var mountChordPlayer = (target, chords, options = {}) => {
7840
10129
  metronomeStartPlaySec = playOffsetSec;
7841
10130
  metronomeNextBeat = Math.ceil(playOffsetSec / secondsPerBeat);
7842
10131
  }
7843
- for (const p of [DRUM_KEYS.kick, DRUM_KEYS.hihatClosed]) {
10132
+ for (const p of [DRUM_KEYS.bassDrum1, DRUM_KEYS.closedHihat]) {
7844
10133
  if (!_drumCache.has(p)) loadDrumFont(ctx, p);
7845
10134
  }
7846
10135
  scheduleMetronomeBeats(ctx, cutGain);
@@ -8190,15 +10479,15 @@ var mountChordPlayer = (target, chords, options = {}) => {
8190
10479
  var q = (root, sel) => root.querySelector(sel);
8191
10480
  var buildUI = (target, options) => {
8192
10481
  const {
8193
- drumPatternNames,
10482
+ drumPatterns,
8194
10483
  defaultDrumPattern,
8195
10484
  defaultBpm,
8196
10485
  showMidi,
8197
10486
  showMidiSearch
8198
10487
  } = options;
8199
10488
  const drumOptions = [`<option value="none">\u306A\u3057</option>`].concat(
8200
- drumPatternNames.map(
8201
- (name) => `<option value="${name}" ${name === defaultDrumPattern ? "selected" : ""}>${name}</option>`
10489
+ drumPatterns.map(
10490
+ (p) => `<option value="${p.value}" ${p.value === defaultDrumPattern ? "selected" : ""}>${p.label}</option>`
8202
10491
  )
8203
10492
  ).join("");
8204
10493
  target.innerHTML = `
@@ -8293,6 +10582,21 @@ var buildUI = (target, options) => {
8293
10582
  <span class="dtm-label">\u30EA\u30BA\u30E0</span>
8294
10583
  <select class="dtm-select" data-dtm="drum-select">${drumOptions}</select>
8295
10584
  </div>
10585
+ <div class="dtm-row">
10586
+ <span class="dtm-label">\u97F3\u6E90</span>
10587
+ <select class="dtm-select" data-dtm="drum-font-select">
10588
+ ${[
10589
+ "Chaos_sf2_file",
10590
+ "FluidR3_GM_sf2_file",
10591
+ "JCLive_sf2_file",
10592
+ "SBLive_sf2"
10593
+ ].flatMap(
10594
+ (font) => [0, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(
10595
+ (id) => `<option value="${font}:${id}">${font} (${id})</option>`
10596
+ )
10597
+ ).join("")}
10598
+ </select>
10599
+ </div>
8296
10600
  <div class="dtm-row">
8297
10601
  <span class="dtm-label">\u97F3\u91CF</span>
8298
10602
  <input type="range" class="dtm-range dtm-grow" data-dtm="drum-volume" value="80" min="0" max="100">
@@ -8368,6 +10672,9 @@ var buildUI = (target, options) => {
8368
10672
  <button class="dtm-btn dtm-btn--accent" data-dtm="export-midi">MIDI\u51FA\u529B</button>
8369
10673
  <button class="dtm-btn dtm-btn--success" data-dtm="generate-mml">MML\u751F\u6210</button>
8370
10674
  </div>
10675
+ <div class="dtm-row">
10676
+ <button class="dtm-btn dtm-btn--primary" data-dtm="drum-json-export" title="\u8AAD\u307F\u8FBC\u3093\u3060MIDI\u306E\u30C9\u30E9\u30E0\u5B9A\u7FA9\u3092JSON\u51FA\u529B">\u30C9\u30E9\u30E0JSON\u51FA\u529B</button>
10677
+ </div>
8371
10678
  <label class="dtm-checkbox-label">
8372
10679
  <input type="checkbox" class="dtm-checkbox" data-dtm="decompose-chord">
8373
10680
  <span>\u548C\u97F3\u5206\u89E3\u30E2\u30FC\u30C9\uFF08\u5358\u97F3\u30C8\u30E9\u30C3\u30AF\u306B\u6700\u9069\u5206\u5272\uFF09</span>
@@ -8388,6 +10695,13 @@ var buildUI = (target, options) => {
8388
10695
  <option value="128">128\u5C0F\u7BC0</option>
8389
10696
  </select>
8390
10697
  </div>
10698
+ <div class="dtm-output dtm-hidden" data-dtm="drum-json-output">
10699
+ <p class="dtm-label" data-dtm="drum-json-status"></p>
10700
+ <div class="dtm-output-row">
10701
+ <pre class="dtm-output-scroll"><code data-dtm="drum-json-text"></code></pre>
10702
+ <button class="dtm-btn dtm-btn--primary dtm-btn--icon" data-dtm="drum-json-copy" title="\u30B3\u30D4\u30FC">${icon("copy")}</button>
10703
+ </div>
10704
+ </div>
8391
10705
  <div class="dtm-output dtm-hidden" data-dtm="output-container">
8392
10706
  <p class="dtm-label" data-dtm="output-status"></p>
8393
10707
  <div class="dtm-output-label">\u6539\u884C\u3042\u308A\u7248</div>
@@ -8455,6 +10769,7 @@ var buildUI = (target, options) => {
8455
10769
  trackTabs: sel("track-tabs"),
8456
10770
  trackBody: sel("track-body"),
8457
10771
  drumSelect: sel("drum-select"),
10772
+ drumFontSelect: sel("drum-font-select"),
8458
10773
  drumVolume: sel("drum-volume"),
8459
10774
  drumVolumeLabel: sel("drum-volume-label"),
8460
10775
  midiInput: sel("midi-input"),
@@ -8474,6 +10789,11 @@ var buildUI = (target, options) => {
8474
10789
  macroHarmonic: sel("macro-harmonic"),
8475
10790
  macroMono: sel("macro-mono"),
8476
10791
  exportMidiBtn: sel("export-midi"),
10792
+ drumJsonExportBtn: sel("drum-json-export"),
10793
+ drumJsonOutput: sel("drum-json-output"),
10794
+ drumJsonStatus: sel("drum-json-status"),
10795
+ drumJsonText: sel("drum-json-text"),
10796
+ drumJsonCopyBtn: sel("drum-json-copy"),
8477
10797
  generateMmlBtn: sel("generate-mml"),
8478
10798
  decomposeChordToggle: sel("decompose-chord"),
8479
10799
  ignoreChordHeavyToggle: sel("ignore-chord-heavy"),
@@ -8916,6 +11236,15 @@ var extractMidiPlacements = (midi, selectedTrackIndices) => {
8916
11236
  });
8917
11237
  }
8918
11238
  }
11239
+ if (placements.length > 0) {
11240
+ const minStartStep = Math.min(...placements.map((p) => p.startStep));
11241
+ const stepsPerBar = STEPS_PER_BEAT3 * 4;
11242
+ const emptyBars = Math.floor(minStartStep / stepsPerBar);
11243
+ if (emptyBars > 0) {
11244
+ const shift = emptyBars * stepsPerBar;
11245
+ for (const p of placements) p.startStep -= shift;
11246
+ }
11247
+ }
8919
11248
  return { placements, bpm };
8920
11249
  };
8921
11250
  var isPlausibleMidiTranscription = (midi, selectedIndices) => {
@@ -8980,6 +11309,15 @@ var extractMidiPlacementsByTrack = (midi, selectedIndices, trackIds) => {
8980
11309
  });
8981
11310
  }
8982
11311
  });
11312
+ if (placements.length > 0) {
11313
+ const minStartStep = Math.min(...placements.map((p) => p.startStep));
11314
+ const stepsPerBar = STEPS_PER_BEAT3 * 4;
11315
+ const emptyBars = Math.floor(minStartStep / stepsPerBar);
11316
+ if (emptyBars > 0) {
11317
+ const shift = emptyBars * stepsPerBar;
11318
+ for (const p of placements) p.startStep -= shift;
11319
+ }
11320
+ }
8983
11321
  return { placements, bpm };
8984
11322
  };
8985
11323
  var to2byte = (n) => [(n & 65280) >> 8, n & 255];
@@ -9014,7 +11352,7 @@ var trackChunks = (arr, func) => {
9014
11352
  arr.push(...a);
9015
11353
  };
9016
11354
  var exportMIDI = (options) => {
9017
- const { tracks, drumPattern, drumVolume = 80, bpm, stepsPerBar } = options;
11355
+ const { tracks, getDrumPattern, drumVolume = 80, bpm, stepsPerBar } = options;
9018
11356
  const div = 480;
9019
11357
  const tickPerStep = div / STEPS_PER_BEAT3;
9020
11358
  const midiTracks = [];
@@ -9036,16 +11374,18 @@ var exportMIDI = (options) => {
9036
11374
  events.sort((a, b) => a.t - b.t);
9037
11375
  midiTracks.push(events);
9038
11376
  });
9039
- if (drumPattern && drumPattern.length > 0) {
9040
- const maxStep = Math.max(
9041
- ...tracks.filter((t) => t.notes.length > 0).map(
9042
- (t) => Math.max(...t.notes.map((n) => n.startStep + n.durationSteps))
9043
- ),
9044
- stepsPerBar
9045
- );
9046
- const drumEvents = [];
9047
- const numBars = Math.ceil(maxStep / stepsPerBar);
9048
- for (let bar = 0; bar < numBars; bar++) {
11377
+ const maxStep = Math.max(
11378
+ ...tracks.filter((t) => t.notes.length > 0).map(
11379
+ (t) => Math.max(...t.notes.map((n) => n.startStep + n.durationSteps))
11380
+ ),
11381
+ stepsPerBar
11382
+ );
11383
+ const drumEvents = [];
11384
+ const numBars = Math.ceil(maxStep / stepsPerBar);
11385
+ for (let bar = 0; bar < numBars; bar++) {
11386
+ const currentBar = bar + 1;
11387
+ const drumPattern = getDrumPattern ? getDrumPattern(currentBar) : null;
11388
+ if (drumPattern && drumPattern.length > 0) {
9049
11389
  const barStart = bar * stepsPerBar;
9050
11390
  for (const drum of drumPattern) {
9051
11391
  const step = barStart + drum.step;
@@ -9063,9 +11403,9 @@ var exportMIDI = (options) => {
9063
11403
  });
9064
11404
  }
9065
11405
  }
9066
- drumEvents.sort((a, b) => a.t - b.t);
9067
- if (drumEvents.length > 0) midiTracks.push(drumEvents);
9068
11406
  }
11407
+ drumEvents.sort((a, b) => a.t - b.t);
11408
+ if (drumEvents.length > 0) midiTracks.push(drumEvents);
9069
11409
  const arr = [];
9070
11410
  headerChunks(arr, midiTracks.length + 1, div);
9071
11411
  trackChunks(arr, (a) => {
@@ -9082,6 +11422,135 @@ var exportMIDI = (options) => {
9082
11422
  }
9083
11423
  return new Blob([new Uint8Array(arr).buffer], { type: "audio/midi" });
9084
11424
  };
11425
+ var extractDrumPatternFromNotes = (rawNotes, drumFont = "FluidR3_GM_sf2_file:0") => {
11426
+ if (rawNotes.length === 0)
11427
+ return { json: "[]", patternDef: { label: "\u62BD\u51FA\u30C9\u30E9\u30E0", pattern: [] } };
11428
+ rawNotes.sort((a, b) => a.step - b.step);
11429
+ const stepsPerBar = STEPS_PER_BEAT3 * 4;
11430
+ if (rawNotes.length > 0) {
11431
+ const emptyBars = Math.floor(rawNotes[0].step / stepsPerBar);
11432
+ if (emptyBars > 0) {
11433
+ const shift = emptyBars * stepsPerBar;
11434
+ for (const note of rawNotes) note.step -= shift;
11435
+ }
11436
+ }
11437
+ const noteRanges = {};
11438
+ for (const note of rawNotes) {
11439
+ const b = Math.floor(note.step / stepsPerBar) + 1;
11440
+ const stepInBar = note.step % stepsPerBar;
11441
+ const key = `${stepInBar}_${note.pitch}_${note.velocity}`;
11442
+ if (!noteRanges[key]) noteRanges[key] = [];
11443
+ if (noteRanges[key][noteRanges[key].length - 1] !== b) {
11444
+ noteRanges[key].push(b);
11445
+ }
11446
+ }
11447
+ const rangeMap = {};
11448
+ for (const key in noteRanges) {
11449
+ const bList = noteRanges[key];
11450
+ let start = bList[0];
11451
+ let prev = bList[0];
11452
+ const parts = key.split("_");
11453
+ const noteObj = { step: +parts[0], pitch: +parts[1], velocity: +parts[2] };
11454
+ for (let i = 1; i <= bList.length; i++) {
11455
+ if (i === bList.length || bList[i] !== prev + 1) {
11456
+ const rKey = `${start}-${prev}`;
11457
+ if (!rangeMap[rKey]) rangeMap[rKey] = [];
11458
+ rangeMap[rKey].push(noteObj);
11459
+ if (i < bList.length) {
11460
+ start = bList[i];
11461
+ prev = bList[i];
11462
+ }
11463
+ } else {
11464
+ prev = bList[i];
11465
+ }
11466
+ }
11467
+ }
11468
+ const patternMap = {};
11469
+ for (const rKey in rangeMap) {
11470
+ const [s, e] = rKey.split("-");
11471
+ const pattern = rangeMap[rKey].sort((a, b) => a.step - b.step);
11472
+ const pKey = JSON.stringify(pattern);
11473
+ if (!patternMap[pKey]) patternMap[pKey] = [];
11474
+ patternMap[pKey].push([+s, +e]);
11475
+ }
11476
+ const instructions = [];
11477
+ for (const pKey in patternMap) {
11478
+ const ranges = patternMap[pKey];
11479
+ ranges.sort((a, b) => a[0] - b[0]);
11480
+ instructions.push({
11481
+ ranges,
11482
+ pattern: JSON.parse(pKey)
11483
+ });
11484
+ }
11485
+ instructions.sort((a, b) => {
11486
+ const durA = a.ranges.reduce(
11487
+ (sum, r) => sum + (r[1] - r[0]),
11488
+ 0
11489
+ );
11490
+ const durB = b.ranges.reduce(
11491
+ (sum, r) => sum + (r[1] - r[0]),
11492
+ 0
11493
+ );
11494
+ if (durA !== durB) return durB - durA;
11495
+ return a.ranges[0][0] - b.ranges[0][0];
11496
+ });
11497
+ const json = buildDrumPatternJson(instructions, drumFont);
11498
+ const patternDef = {
11499
+ label: "\u62BD\u51FA\u30C9\u30E9\u30E0",
11500
+ pattern: instructions
11501
+ };
11502
+ return { json, patternDef };
11503
+ };
11504
+ var buildDrumPatternJson = (instructions, drumFont) => {
11505
+ const pitchToDrumKey = Object.entries(DRUM_KEYS).reduce(
11506
+ (acc, [key, val]) => {
11507
+ acc[val] = `DRUM_KEYS.${key}`;
11508
+ return acc;
11509
+ },
11510
+ {}
11511
+ );
11512
+ const instructionStrings = instructions.map((inst) => {
11513
+ const rangesStr = `[${inst.ranges.map((r) => `[${r[0]}, ${r[1]}]`).join(", ")}]`;
11514
+ const patternLines = inst.pattern.map((n) => {
11515
+ const pitchStr = pitchToDrumKey[n.pitch] ?? n.pitch;
11516
+ return ` { step: ${n.step}, pitch: ${pitchStr}, velocity: ${n.velocity} },`;
11517
+ }).join("\n");
11518
+ return ` {
11519
+ ranges: ${rangesStr},
11520
+ pattern: [
11521
+ ${patternLines}
11522
+ ],
11523
+ }`;
11524
+ });
11525
+ const patternStr = `[
11526
+ ${instructionStrings.join(",\n")}
11527
+ ]`;
11528
+ return ` extracted_song: {
11529
+ label: "\u62BD\u51FA\u30C9\u30E9\u30E0",
11530
+ font: "${drumFont}",
11531
+ pattern: ${patternStr}
11532
+ },`;
11533
+ };
11534
+ var extractMidiDrumPattern = (midi, drumFont = "FluidR3_GM_sf2_file:0") => {
11535
+ const { tracks, division } = midi;
11536
+ const ticksPerBeat = division;
11537
+ const rawNotes = [];
11538
+ for (const track of tracks) {
11539
+ let currentTime = 0;
11540
+ for (const event of track) {
11541
+ currentTime += event.delta;
11542
+ if (event.channel === 9 && event.noteOn && event.noteOn.velocity > 0) {
11543
+ const step = Math.round(currentTime * STEPS_PER_BEAT3 / ticksPerBeat);
11544
+ rawNotes.push({
11545
+ step,
11546
+ pitch: event.noteOn.noteNumber,
11547
+ velocity: Math.round(event.noteOn.velocity / 127 * 10) / 10
11548
+ });
11549
+ }
11550
+ }
11551
+ }
11552
+ return extractDrumPatternFromNotes(rawNotes, drumFont);
11553
+ };
9085
11554
 
9086
11555
  // src/midi-search.ts
9087
11556
  var MidiSearchClient = class {
@@ -10206,14 +12675,22 @@ var mountDAW = (target, options = {}) => {
10206
12675
  const trackConfigs = options.tracks ?? DEFAULT_TRACKS;
10207
12676
  const mode = options.mode ?? (trackConfigs.length > TRACKS_SIMPLE.length ? "advanced" : "simple");
10208
12677
  const isAdvanced = mode === "advanced";
10209
- const drumPatterns = options.drumPatterns ?? DRUM_PATTERNS;
12678
+ const userPatterns = normalizeDrumPatterns(options.drumPatterns ?? {});
12679
+ const drumPatterns = {
12680
+ ...DRUM_PATTERNS,
12681
+ ...SONG_DRUM_PATTERNS,
12682
+ ...userPatterns
12683
+ };
10210
12684
  const showMidi = !!options.parseMidi;
10211
12685
  const showChord = !isAdvanced;
10212
12686
  const midiSearchClient = options.midiSearch ? new MidiSearchClient(options.midiSearch) : void 0;
10213
12687
  const showMidiSearch = !!midiSearchClient?.enabled;
10214
12688
  const refs = buildUI(target, {
10215
12689
  tracks: trackConfigs,
10216
- drumPatternNames: Object.keys(drumPatterns),
12690
+ drumPatterns: Object.entries(drumPatterns).map(([key, def]) => ({
12691
+ value: key,
12692
+ label: def.label
12693
+ })),
10217
12694
  defaultDrumPattern: drumPatterns.dance ? "dance" : Object.keys(drumPatterns)[0] ?? "none",
10218
12695
  defaultBpm: options.defaultBpm ?? DEFAULT_BPM,
10219
12696
  showMidi,
@@ -10239,6 +12716,8 @@ var mountDAW = (target, options = {}) => {
10239
12716
  options.singingVoices?.setVolume(masterVolume / 100);
10240
12717
  let drumVolume = options.drumVolume ?? 80;
10241
12718
  let currentDrumPattern = refs.drumSelect.value;
12719
+ let currentDrumFont = options.drumFont ?? "FluidR3_GM_sf2_file:0";
12720
+ refs.drumFontSelect.value = currentDrumFont;
10242
12721
  let currentInstrument = "";
10243
12722
  let activeTrackId = options.initialActiveTrack ?? trackConfigs[0].id;
10244
12723
  let activeToolMode = "pen";
@@ -11065,7 +13544,7 @@ var mountDAW = (target, options = {}) => {
11065
13544
  })),
11066
13545
  getBpm: () => bpm,
11067
13546
  getPlayStartStep: () => playStartStep,
11068
- getDrumPattern: () => drumPatterns[currentDrumPattern] ?? null,
13547
+ getDrumPattern: (currentBar) => resolveDrumPattern(currentDrumPattern, drumPatterns, currentBar),
11069
13548
  getSoloTrackId: () => isSolo ? activeTrackId : null,
11070
13549
  getAudioTime,
11071
13550
  onPlayNote: (e) => {
@@ -11198,6 +13677,12 @@ var mountDAW = (target, options = {}) => {
11198
13677
  playbackState = "paused";
11199
13678
  updateTransport();
11200
13679
  };
13680
+ const reloadVoicesForModel = (model) => {
13681
+ const voices = options.singingVoices;
13682
+ if (!voices || !model || playbackState !== "playing") return;
13683
+ pause();
13684
+ void play();
13685
+ };
11201
13686
  const stop = () => {
11202
13687
  sequencer.stop();
11203
13688
  options.singingVoices?.stopStream();
@@ -11522,6 +14007,7 @@ var mountDAW = (target, options = {}) => {
11522
14007
  syncInstDisabled();
11523
14008
  syncVelocityDisabled();
11524
14009
  fireLyricsChange(active);
14010
+ reloadVoicesForModel(active.lyricModel);
11525
14011
  });
11526
14012
  lyricCustomGuide.addEventListener("click", () => {
11527
14013
  showModal("\u30AB\u30B9\u30BF\u30E0\u97F3\u58F0(.koe)\u306E\u4F7F\u3044\u65B9", KOE_INFO_HTML);
@@ -11563,6 +14049,7 @@ var mountDAW = (target, options = {}) => {
11563
14049
  active.lyricModel = key;
11564
14050
  fireLyricsChange(active);
11565
14051
  updateTrackPanel();
14052
+ reloadVoicesForModel(key);
11566
14053
  });
11567
14054
  lyricOctaveSel.addEventListener("change", () => {
11568
14055
  active.vocalOctave = Number.parseInt(lyricOctaveSel.value, 10);
@@ -11871,6 +14358,11 @@ var mountDAW = (target, options = {}) => {
11871
14358
  currentInstrument = meta.instrument;
11872
14359
  options.onInstrumentChange?.(meta.instrument);
11873
14360
  }
14361
+ if (meta.drumFont) {
14362
+ currentDrumFont = meta.drumFont;
14363
+ refs.drumFontSelect.value = meta.drumFont;
14364
+ options.onDrumFontChange?.(meta.drumFont);
14365
+ }
11874
14366
  if (meta.drum && drumPatterns[meta.drum]) {
11875
14367
  currentDrumPattern = meta.drum;
11876
14368
  refs.drumSelect.value = meta.drum;
@@ -11884,7 +14376,7 @@ var mountDAW = (target, options = {}) => {
11884
14376
  if (meta.drumVolume !== void 0) {
11885
14377
  drumVolume = meta.drumVolume;
11886
14378
  refs.drumVolume.value = String(meta.drumVolume);
11887
- refs.drumVolumeLabel.textContent = `${meta.drumVolume}%`;
14379
+ refs.drumVolumeLabel.textContent = `${drumVolume}%`;
11888
14380
  }
11889
14381
  }
11890
14382
  trackStates.forEach((t, i) => {
@@ -12058,7 +14550,7 @@ var mountDAW = (target, options = {}) => {
12058
14550
  notes: t.core.getNotes(),
12059
14551
  volume: t.volume
12060
14552
  })),
12061
- drumPattern: drumPatterns[currentDrumPattern],
14553
+ getDrumPattern: (currentBar) => resolveDrumPattern(currentDrumPattern, drumPatterns, currentBar),
12062
14554
  drumVolume,
12063
14555
  bpm,
12064
14556
  stepsPerBar: renderConfig.stepsPerBar
@@ -12232,6 +14724,10 @@ var mountDAW = (target, options = {}) => {
12232
14724
  currentDrumPattern = refs.drumSelect.value;
12233
14725
  options.onDrumChange?.(currentDrumPattern);
12234
14726
  });
14727
+ refs.drumFontSelect.addEventListener("change", () => {
14728
+ currentDrumFont = refs.drumFontSelect.value;
14729
+ options.onDrumFontChange?.(currentDrumFont);
14730
+ });
12235
14731
  refs.drumVolume.addEventListener("input", () => {
12236
14732
  drumVolume = Number.parseInt(refs.drumVolume.value, 10) || 0;
12237
14733
  refs.drumVolumeLabel.textContent = `${drumVolume}%`;
@@ -12468,6 +14964,23 @@ var mountDAW = (target, options = {}) => {
12468
14964
  };
12469
14965
  let pendingMidi = null;
12470
14966
  let detectedTracks = [];
14967
+ let extractedMidiDrum = null;
14968
+ const applyExtractedDrumPattern = (patternDef) => {
14969
+ extractedMidiDrum = patternDef.pattern;
14970
+ drumPatterns["_extracted_midi"] = patternDef;
14971
+ let option = refs.drumSelect.querySelector(
14972
+ `option[value="_extracted_midi"]`
14973
+ );
14974
+ if (!option) {
14975
+ option = document.createElement("option");
14976
+ option.value = "_extracted_midi";
14977
+ refs.drumSelect.appendChild(option);
14978
+ }
14979
+ option.textContent = patternDef.label;
14980
+ currentDrumPattern = "_extracted_midi";
14981
+ refs.drumSelect.value = "_extracted_midi";
14982
+ options.onDrumChange?.("_extracted_midi");
14983
+ };
12471
14984
  const wireMidi = () => {
12472
14985
  refs.midiInput.addEventListener("change", async () => {
12473
14986
  const file = refs.midiInput.files?.[0];
@@ -12477,6 +14990,15 @@ var mountDAW = (target, options = {}) => {
12477
14990
  const buffer = new Uint8Array(await file.arrayBuffer());
12478
14991
  pendingMidi = await options.parseMidi(buffer);
12479
14992
  detectedTracks = analyzeMidiTracks(pendingMidi);
14993
+ try {
14994
+ const { patternDef } = extractMidiDrumPattern(
14995
+ pendingMidi,
14996
+ currentDrumFont
14997
+ );
14998
+ applyExtractedDrumPattern(patternDef);
14999
+ } catch (e) {
15000
+ console.error(e);
15001
+ }
12480
15002
  refs.midiTrackSelection.innerHTML = `<span class="dtm-label">\u30C8\u30E9\u30C3\u30AF</span>`;
12481
15003
  detectedTracks.forEach((t, i) => {
12482
15004
  const btn = document.createElement("button");
@@ -12582,6 +15104,24 @@ var mountDAW = (target, options = {}) => {
12582
15104
  }
12583
15105
  };
12584
15106
  let mmlSearchCache = null;
15107
+ refs.drumJsonExportBtn.addEventListener("click", () => {
15108
+ if (!extractedMidiDrum) {
15109
+ alert("MIDI\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002");
15110
+ return;
15111
+ }
15112
+ const json = buildDrumPatternJson(extractedMidiDrum, currentDrumFont);
15113
+ refs.drumJsonOutput.classList.remove("dtm-hidden");
15114
+ refs.drumJsonText.textContent = json;
15115
+ refs.drumJsonStatus.textContent = `\u51FA\u529B: ${json.length}\u6587\u5B57`;
15116
+ });
15117
+ refs.drumJsonCopyBtn.addEventListener("click", () => {
15118
+ navigator.clipboard?.writeText(refs.drumJsonText.textContent ?? "");
15119
+ refs.drumJsonCopyBtn.classList.add("dtm-btn--success");
15120
+ setTimeout(
15121
+ () => refs.drumJsonCopyBtn.classList.remove("dtm-btn--success"),
15122
+ 1200
15123
+ );
15124
+ });
12585
15125
  let chordSearchCache = null;
12586
15126
  const wireMidiSearch = () => {
12587
15127
  if (!midiSearchClient) return;
@@ -13074,6 +15614,25 @@ var mountDAW = (target, options = {}) => {
13074
15614
  currentInstrument = name;
13075
15615
  },
13076
15616
  getDrum: () => currentDrumPattern,
15617
+ getUsedDrumKeys: () => getDrumPatternKeys(currentDrumPattern, drumPatterns),
15618
+ getDrumFont: () => currentDrumFont,
15619
+ setDrumFont: (fontId) => {
15620
+ currentDrumFont = fontId;
15621
+ refs.drumFontSelect.value = fontId;
15622
+ options.onDrumFontChange?.(fontId);
15623
+ },
15624
+ addDrumPattern: (name, pattern) => {
15625
+ drumPatterns[name] = pattern;
15626
+ let option = refs.drumSelect.querySelector(
15627
+ `option[value="${name}"]`
15628
+ );
15629
+ if (!option) {
15630
+ option = document.createElement("option");
15631
+ option.value = name;
15632
+ refs.drumSelect.appendChild(option);
15633
+ }
15634
+ option.textContent = pattern.label;
15635
+ },
13077
15636
  setDrum: (name) => {
13078
15637
  if (name !== "none" && !drumPatterns[name]) return;
13079
15638
  currentDrumPattern = name;
@@ -13217,8 +15776,12 @@ var playSingingMML = async (mml, options = {}) => {
13217
15776
  );
13218
15777
  const bpm = parsedBpm ?? options.defaultBpm ?? DEFAULT_BPM;
13219
15778
  const secondsPerStep = 60 / bpm / STEPS_PER_BEAT4;
13220
- const drumPatternDict = options.drumPatterns ?? DRUM_PATTERNS;
13221
- const drumPattern = meta.drum ? drumPatternDict[meta.drum] ?? null : null;
15779
+ const drumPatternDict = {
15780
+ ...DRUM_PATTERNS,
15781
+ ...SONG_DRUM_PATTERNS,
15782
+ ...normalizeDrumPatterns(options.drumPatterns ?? {})
15783
+ };
15784
+ const drumPatternName = meta.drum ?? "none";
13222
15785
  const drumVolume = meta.drumVolume ?? 80;
13223
15786
  const trackVolume = meta.volume ?? 100;
13224
15787
  let masterVolume = options.volume ?? 100;
@@ -13282,7 +15845,7 @@ var playSingingMML = async (mml, options = {}) => {
13282
15845
  getTracks: () => seqTracks,
13283
15846
  getBpm: () => bpm,
13284
15847
  getPlayStartStep: () => options.startStep ?? 0,
13285
- getDrumPattern: () => drumPattern,
15848
+ getDrumPattern: (currentBar) => resolveDrumPattern(drumPatternName, drumPatternDict, currentBar),
13286
15849
  getSoloTrackId: () => null,
13287
15850
  getLoop: () => options.loop ?? false,
13288
15851
  cues: options.cues,
@@ -13903,23 +16466,32 @@ var SoundFont_drum = new class {
13903
16466
  id,
13904
16467
  Map
13905
16468
  );
13906
- if (!map.size) {
13907
- for (const [pitch, sf] of await Promise.all(
13908
- [...keys].map(async (key) => {
16469
+ const missingKeys = keys.filter((k) => !map.has(k));
16470
+ if (missingKeys.length > 0) {
16471
+ const results = await Promise.all(
16472
+ missingKeys.map(async (key) => {
13909
16473
  const fontName = `${key}_${id}_${font}`;
13910
- return [
13911
- Number(key),
13912
- await SoundFont.load({
16474
+ try {
16475
+ const sf = await SoundFont.load({
13913
16476
  ctx,
13914
16477
  fontName: `_drum_${fontName}`,
13915
16478
  url: `https://surikov.github.io/webaudiofontdata/sound/128${fontName}.js`,
13916
16479
  isDrum: true,
13917
16480
  pitchs: [key]
13918
- })
13919
- ];
16481
+ });
16482
+ return [Number(key), sf];
16483
+ } catch (e) {
16484
+ console.warn(
16485
+ `[dtm] \u30C9\u30E9\u30E0\u30AD\u30FC ${key} \u306E\u30ED\u30FC\u30C9\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F`,
16486
+ e
16487
+ );
16488
+ return null;
16489
+ }
13920
16490
  })
13921
- ))
13922
- map.set(pitch, sf);
16491
+ );
16492
+ for (const res of results) {
16493
+ if (res) map.set(res[0], res[1]);
16494
+ }
13923
16495
  }
13924
16496
  this.font = map;
13925
16497
  }
@@ -14065,18 +16637,28 @@ var createDtmStudio = async (options = {}) => {
14065
16637
  sfList.init();
14066
16638
  sfList.onload(() => resolve());
14067
16639
  });
14068
- const drumReady = (async () => {
16640
+ const loadedDrumKeys = /* @__PURE__ */ new Map();
16641
+ const loadRequiredDrums = async (keys, drumFontStr = "FluidR3_GM_sf2_file:0") => {
16642
+ const [font, id] = drumFontStr.split(":");
16643
+ let set = loadedDrumKeys.get(drumFontStr);
16644
+ if (!set) {
16645
+ set = /* @__PURE__ */ new Set();
16646
+ loadedDrumKeys.set(drumFontStr, set);
16647
+ }
16648
+ const newKeys = keys.filter((k) => !set.has(k));
14069
16649
  try {
14070
16650
  await sfDrum.load({
14071
16651
  ctx: audioCtx,
14072
- font: DRUM_FONT,
14073
- id: "0",
14074
- keys: Object.values(DRUM_KEYS)
16652
+ font,
16653
+ id: id || "0",
16654
+ keys: newKeys
14075
16655
  });
16656
+ for (const k of newKeys) set.add(k);
14076
16657
  } catch (e) {
14077
16658
  console.error("[dtm] \u30C9\u30E9\u30E0\u97F3\u6E90\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557", e);
14078
16659
  }
14079
- })();
16660
+ };
16661
+ const drumReady = Promise.resolve();
14080
16662
  let nameToKey = {};
14081
16663
  const resolveNameToKey = (name) => {
14082
16664
  if (nameToKey[name]) return nameToKey[name];
@@ -14305,9 +16887,16 @@ var createDtmStudio = async (options = {}) => {
14305
16887
  trackInstOverrides.set(trackIndex, key);
14306
16888
  await loadInstrument(key);
14307
16889
  };
16890
+ let daw;
14308
16891
  const base = {
14309
16892
  getAudioTime: () => audioCtx.currentTime,
14310
- onResumeAudio: resumeAudio,
16893
+ onResumeAudio: async () => {
16894
+ await resumeAudio();
16895
+ if (daw) {
16896
+ await loadRequiredDrums(daw.getUsedDrumKeys(), daw.getDrumFont());
16897
+ }
16898
+ await dawOverrides.onResumeAudio?.();
16899
+ },
14311
16900
  onPlayNote: playNote4,
14312
16901
  onPlayDrum: playDrum,
14313
16902
  singingVoices,
@@ -14317,9 +16906,29 @@ var createDtmStudio = async (options = {}) => {
14317
16906
  void handleTrackInstrumentChange(idx, name);
14318
16907
  externalOnTrackInstrumentChange?.(idx, name);
14319
16908
  },
14320
- ...dawOverrides
16909
+ ...dawOverrides,
16910
+ // dawOverrides で上書きされないよう、スプレッドの後に配置して合成する
16911
+ onDrumChange: (name) => {
16912
+ if (daw) {
16913
+ void loadRequiredDrums(daw.getUsedDrumKeys(), daw.getDrumFont());
16914
+ }
16915
+ dawOverrides.onDrumChange?.(name);
16916
+ },
16917
+ // ドラム音源変更も楽器変更と同じく、再生中なら停止→ロード→再開する
16918
+ onDrumFontChange: (fontId) => {
16919
+ if (daw) {
16920
+ const wasPlaying = daw.getPlaybackState() === "playing";
16921
+ if (wasPlaying) daw.pause();
16922
+ daw.setLoading?.(true);
16923
+ void loadRequiredDrums(daw.getUsedDrumKeys(), fontId).finally(() => {
16924
+ daw.setLoading?.(false);
16925
+ if (wasPlaying) daw.play();
16926
+ });
16927
+ }
16928
+ dawOverrides.onDrumFontChange?.(fontId);
16929
+ }
14321
16930
  };
14322
- const daw = mountDAW(target, base);
16931
+ daw = mountDAW(target, base);
14323
16932
  mountedEditors.push(daw);
14324
16933
  const wantPresetUI = presetUI ?? features.presetUI;
14325
16934
  const rollEl = target.querySelector('[data-dtm="roll"]');
@@ -14525,7 +17134,19 @@ var createDtmStudio = async (options = {}) => {
14525
17134
  };
14526
17135
  const player = mountMmlPlayer(target, mml, {
14527
17136
  getAudioTime: () => audioCtx.currentTime,
14528
- onResumeAudio: resumeAudio,
17137
+ onResumeAudio: async () => {
17138
+ await resumeAudio();
17139
+ if (meta.drum) {
17140
+ await loadRequiredDrums(
17141
+ getDrumPatternKeys(
17142
+ meta.drum,
17143
+ opts.drumPatterns ?? options.drumPatterns ?? DRUM_PATTERNS
17144
+ ),
17145
+ meta.drumFont || "FluidR3_GM_sf2_file:0"
17146
+ );
17147
+ }
17148
+ await opts.onResumeAudio?.();
17149
+ },
14529
17150
  onPlayNote: playPlayerNote,
14530
17151
  onPlayDrum: playDrum,
14531
17152
  singingVoices,
@@ -14604,7 +17225,18 @@ var createDtmStudio = async (options = {}) => {
14604
17225
  synth: false,
14605
17226
  onPlayNote: playPlayerNote,
14606
17227
  onPlayDrum: playDrum,
14607
- onResumeAudio: resumeAudio
17228
+ onResumeAudio: async () => {
17229
+ await resumeAudio();
17230
+ if (meta.drum) {
17231
+ await loadRequiredDrums(
17232
+ getDrumPatternKeys(
17233
+ meta.drum,
17234
+ opts.drumPatterns ?? options.drumPatterns ?? DRUM_PATTERNS
17235
+ )
17236
+ );
17237
+ }
17238
+ await opts.onResumeAudio?.();
17239
+ }
14608
17240
  });
14609
17241
  };
14610
17242
  const playSingingMMLInstance = (mml, opts = {}) => {
@@ -14673,7 +17305,18 @@ var createDtmStudio = async (options = {}) => {
14673
17305
  singingVoices,
14674
17306
  onPlayNote: playPlayerNote,
14675
17307
  onPlayDrum: playDrum,
14676
- onResumeAudio: resumeAudio
17308
+ onResumeAudio: async () => {
17309
+ await resumeAudio();
17310
+ if (meta.drum) {
17311
+ await loadRequiredDrums(
17312
+ getDrumPatternKeys(
17313
+ meta.drum,
17314
+ opts.drumPatterns ?? options.drumPatterns ?? DRUM_PATTERNS
17315
+ )
17316
+ );
17317
+ }
17318
+ await opts.onResumeAudio?.();
17319
+ }
14677
17320
  });
14678
17321
  };
14679
17322
  const playNoteEvent = (e) => {
@@ -14867,6 +17510,7 @@ var createDtmStudio = async (options = {}) => {
14867
17510
  applyHarmonicFilter,
14868
17511
  applyMonophonic,
14869
17512
  buildChordPlacements,
17513
+ buildDrumPatternJson,
14870
17514
  buildNameToKeyMapping,
14871
17515
  collectPitchTokens,
14872
17516
  createAudioContext,
@@ -14889,12 +17533,15 @@ var createDtmStudio = async (options = {}) => {
14889
17533
  drawSelectionRect,
14890
17534
  encodeMml,
14891
17535
  exportMIDI,
17536
+ extractDrumPatternFromNotes,
17537
+ extractMidiDrumPattern,
14892
17538
  extractMidiPlacements,
14893
17539
  extractMidiPlacementsByTrack,
14894
17540
  formatMmlMeta,
14895
17541
  freqFromPitch,
14896
17542
  generateRandomPattern,
14897
17543
  getDrawOffset,
17544
+ getDrumPatternKeys,
14898
17545
  getGridCanvas,
14899
17546
  getGridContext,
14900
17547
  getGridPosition,
@@ -14912,6 +17559,7 @@ var createDtmStudio = async (options = {}) => {
14912
17559
  mountChordPlayer,
14913
17560
  mountDAW,
14914
17561
  mountMmlPlayer,
17562
+ normalizeDrumPatterns,
14915
17563
  normalizeLyrics,
14916
17564
  onClick,
14917
17565
  panToStereo,
@@ -14924,6 +17572,7 @@ var createDtmStudio = async (options = {}) => {
14924
17572
  playNote,
14925
17573
  playPlacements,
14926
17574
  playSingingMML,
17575
+ resolveDrumPattern,
14927
17576
  resolveLoopPoint,
14928
17577
  setBackgroundActive,
14929
17578
  setDrawOffset,