Skip to content

Commit 8fa88fd

Browse files
authored
Merge pull request #53 from codeacme17/feat
feat(hook): update `useEnvelop`
2 parents a6b6955 + b5ac0a6 commit 8fa88fd

2 files changed

Lines changed: 36 additions & 35 deletions

File tree

packages/hooks/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export { useEnvelope, type UseEnvelopeProps } from './useEnvelope'
1+
// export { useEnvelope, type UseEnvelopeProps } from './useEnvelope'
22
export { useFetchAudio, type UseFetchAudioProps } from './useFetchAudio'
33
export { useOscilloscope, type UseOscilloscopeProps } from './useOscilloscope'
44
export { usePlayer, type UsePlayerProps } from './usePlayer'

packages/hooks/useEnvelope.ts

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,65 @@
11
import * as Tone from 'tone'
2-
import { useRef } from 'react'
2+
import { useRef, useState, useEffect } from 'react'
33
import { LIMITS } from '../components/controller/Envelope/constants'
44
import type { EnvelopeData, EnvelopeLimits } from '../components/controller/Envelope'
55

66
export interface UseEnvelopeProps {
77
data: EnvelopeData
88
limits?: EnvelopeLimits
9-
setData?: (data: EnvelopeData) => void
109
}
1110

1211
export const useEnvelope = (props: UseEnvelopeProps) => {
13-
const { data, limits = LIMITS, setData } = props
12+
const { data: _data, limits = LIMITS } = props
1413

14+
const [data, setData] = useState({ ..._data })
1515
const envelope = useRef<Tone.Envelope | null>(null)
1616

17-
const init = () => {
18-
envelope.current = new Tone.Envelope()
19-
20-
return () => {}
21-
}
17+
const [delay, setDelay] = useState(_data.delay)
18+
const [attack, setAttack] = useState(_data.attack)
19+
const [hold, setHold] = useState(_data.hold)
20+
const [decay, setDecay] = useState(_data.decay)
21+
const [sustain, setSustain] = useState(_data.sustain)
22+
const [release, setRelease] = useState(_data.release)
2223

23-
const setAttack = (value: number) => {
24-
if (setData) {
25-
setData({ ...data, attack: value })
26-
}
27-
}
24+
useEffect(() => {
25+
if (!envelope.current) return
2826

29-
const setDecay = (value: number) => {
30-
if (setData) {
31-
setData({ ...data, decay: value })
32-
}
33-
}
27+
envelope.current.attack = attack
28+
envelope.current.decay = decay
29+
envelope.current.sustain = sustain
30+
envelope.current.release = release
31+
setData({ attack, decay, sustain, release })
3432

35-
const setDelay = (value: number) => {
36-
if (setData) {
37-
setData({ ...data, delay: value })
38-
}
39-
}
33+
if (_data.delay !== undefined) {
34+
envelope.current.triggerAttack(`+${delay || 0}`)
35+
setData({ delay, attack, decay, sustain, release })
4036

41-
const setHold = (value: number) => {
42-
if (setData) {
43-
setData({ ...data, hold: value })
37+
if (_data.hold !== undefined) {
38+
envelope.current.triggerRelease(`+${delay! + attack + hold! + decay}}`)
39+
setData({ delay, attack, decay, hold, sustain, release })
40+
}
4441
}
45-
}
42+
}, [delay, attack, hold, decay, sustain, release])
4643

47-
const setRelease = (value: number) => {
48-
if (setData) {
49-
setData({ ...data, release: value })
50-
}
44+
const init = () => {
45+
envelope.current = new Tone.AmplitudeEnvelope({
46+
attack: data.attack,
47+
decay: data.decay,
48+
sustain: data.sustain,
49+
release: data.release,
50+
})
5151
}
5252

5353
return {
54-
envelope: envelope.current,
54+
init,
5555
data,
56+
envelope,
5657
limits,
57-
init,
5858
setAttack,
5959
setDecay,
60+
setSustain,
61+
setRelease,
6062
setDelay,
6163
setHold,
62-
setRelease,
6364
}
6465
}

0 commit comments

Comments
 (0)