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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
/**
* Relabi generator UI
* @module src/ui/App.js;
*/
import * as React from "react";
import { useState, useEffect, useRef } from "react";
import Relabi from "../relabi";
import Controls from "./Controls.jsx";
export default function App() {
const [relabi, setRelabi] = useState();
const relabiRef = useRef();
/**
* Instantiate the Relabi generator
*/
useEffect(() => {
if (!relabi) {
const relabiGenerator = new Relabi({
settings: {
speed: 1.0,
feedback: 0.2,
},
waves: [
{ shape: "sine", frequency: 0.75, weight: 1 },
{ shape: "sine", frequency: 1.0, weight: 1 },
{ shape: "sine", frequency: 1.617, weight: 1 },
{ shape: "sine", frequency: 3.141, weight: 1 },
],
bounds: [
{
level: -0.25,
color: "#f33",
sounds: [{ instrument: "Kick" }, { instrument: "Snare" }],
},
{
level: 0.25,
color: "#f83",
sounds: [{ instrument: "Hat" }, { instrument: "Perc" }],
},
// {
// level: -0.25,
// color: "#3b8",
// sounds: [
// { instrument: Kalimba, frequency: 440 },
// { instrument: Kalimba, frequency: (440 * 3) / 2 },
// ],
// },
// {
// level: 0.25,
// color: "#36f",
// sounds: [
// { instrument: Kalimba, frequency: (440 * 6) / 5 },
// { instrument: Kalimba, frequency: (440 * 6) / 7 },
// ],
// },
],
});
relabiGenerator.start();
setRelabi(relabiGenerator);
}
}, [relabi]);
useEffect(() => {
if (relabi && relabiRef.current) {
relabi.canvas.appendCanvas(relabiRef.current);
}
}, [relabi, relabiRef.current]);
/**
* Render
*/
return (
<div
style={{
height: "100%",
width: "100%",
padding: 0,
margin: 0,
display: "flex",
flexDirection: "column",
justifyContent: "center",
}}
>
<div ref={relabiRef} />
<Controls relabi={relabi} />
</div>
);
}
|