-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathModule.js
More file actions
52 lines (48 loc) · 1.61 KB
/
Module.js
File metadata and controls
52 lines (48 loc) · 1.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import * as $pattern from './Pattern.js'
import * as $arr from './ImmArray.js'
import {Cell, mod, Module} from '../Model.js'
import {freeze} from '../Util.js'
/** @type {Readonly<Module>} */
export const defaultNew = freeze({
name: '',
numChannels: mod.defaultChannels,
patterns: freeze([$pattern.create(mod.defaultChannels)]),
sequence: freeze([0]),
samples: freeze([null]),
restartPos: 0,
})
/**
* @returns {Readonly<Module>}
*/
export function createNew() {
let date = new Date()
let year = date.getFullYear()
let month = (date.getMonth() + 1).toString().padStart(2, '0')
let day = date.getDate().toString().padStart(2, '0')
let name = `untitled ${year}-${month}-${day}`
return freeze({...defaultNew, name})
}
/**
* @param {Readonly<Module>} module
* @param {number} count
* @returns {Readonly<Module>}
*/
export function addChannels(module, count) {
let numChannels = module.numChannels + count
if (numChannels > mod.maxChannels) { return module }
let newChannels = $arr.repeat(count, $arr.repeat(mod.numRows, Cell.empty))
let patterns = module.patterns.map(pattern => freeze(pattern.concat(newChannels)))
return freeze({...module, numChannels, patterns})
}
/**
* @param {Readonly<Module>} module
* @param {number} index
* @param {number} count
* @returns {Readonly<Module>}
*/
export function delChannels(module, index, count) {
let numChannels = module.numChannels - count
if (numChannels <= 0) { return module }
let patterns = module.patterns.map(pattern => $arr.spliced(pattern, index, count))
return freeze({...module, numChannels, patterns})
}