File tree 4 files changed +49
-8
lines changed
4 files changed +49
-8
lines changed Original file line number Diff line number Diff line change @@ -6,19 +6,43 @@ import { Compare } from "./Compare";
6
6
7
7
function App ( ) {
8
8
const [ blobs , setBlobs ] = useState < Blob [ ] > ( [ ] ) ;
9
+ const [ picked , setPicked ] = useState < Blob [ ] > ( [ ] ) ;
10
+ console . log ( { blobs, picked } ) ;
9
11
10
12
return (
11
13
< >
12
14
< h1 > Audiovis</ h1 >
13
- < RecordAudio onCreated = { ( b ) => setBlobs ( ( prev ) => [ b , ...prev ] ) } />
14
15
15
- { blobs . length === 2 ? (
16
- < Compare a = { blobs [ 0 ] } b = { blobs [ 1 ] } />
16
+ { picked . length === 2 ? (
17
+ < >
18
+ < h4 >
19
+ < button onClick = { ( ) => setPicked ( [ ] ) } > ←</ button > Comparing
20
+ </ h4 >
21
+
22
+ < Compare a = { picked [ 0 ] } b = { picked [ 1 ] } />
23
+ </ >
17
24
) : (
18
- blobs . map ( ( blob , i ) => < Audiovis key = { i } srcObject = { blob } /> )
25
+ < >
26
+ < RecordAudio onCreated = { ( b ) => setBlobs ( ( prev ) => [ b , ...prev ] ) } />
27
+
28
+ { blobs . map ( ( blob , i ) => (
29
+ < Audiovis
30
+ key = { i }
31
+ srcObject = { blob }
32
+ picked = { picked . includes ( blob ) }
33
+ onPick = { ( ) => setPicked ( ( prev ) => toggle ( prev , blob ) ) }
34
+ />
35
+ ) ) }
36
+ </ >
19
37
) }
20
38
</ >
21
39
) ;
22
40
}
23
41
42
+ function toggle < T > ( list : T [ ] , item : T ) : T [ ] {
43
+ return list . includes ( item )
44
+ ? list . filter ( ( each ) => each !== item )
45
+ : [ ...list , item ] ;
46
+ }
47
+
24
48
export default App ;
Original file line number Diff line number Diff line change 7
7
align-items : center;
8
8
9
9
gap : 2em ;
10
+ padding : 0.5em ;
11
+ border-radius : 5px ;
10
12
11
13
& audio ,
12
14
& canvas {
13
15
width : 100% ;
14
16
max-height : 20em ;
15
17
}
16
18
}
19
+
20
+ .picked {
21
+ background-color : # fff1 ;
22
+ }
Original file line number Diff line number Diff line change @@ -3,12 +3,19 @@ import styles from "./Audiovis.module.css";
3
3
import { useAudioCtx } from "./AudioCtxCtx" ;
4
4
import { spectrum , spectrumToImage } from "./util" ;
5
5
6
- export const Audiovis : FC < { srcObject : Blob } > = ( { srcObject } ) => {
6
+ export const Audiovis : FC < {
7
+ srcObject : Blob ;
8
+ picked : boolean ;
9
+ onPick : ( ) => void ;
10
+ } > = ( { srcObject, picked, onPick } ) => {
7
11
const url = useMemo ( ( ) => URL . createObjectURL ( srcObject ) , [ srcObject ] ) ;
8
12
const buffer = useAudioBuffer ( srcObject ) ;
9
13
10
14
return (
11
- < section className = { styles . container } >
15
+ < section
16
+ className = { classes ( styles . container , picked && styles . picked ) }
17
+ onClick = { onPick }
18
+ >
12
19
< audio src = { url } controls />
13
20
14
21
{ buffer && < Waveform audio = { buffer } /> }
@@ -91,3 +98,7 @@ const Sonogram: FC<{ audio: AudioBuffer }> = ({ audio }) => {
91
98
92
99
return < canvas ref = { canvas } className = { styles . waveform } /> ;
93
100
} ;
101
+
102
+ function classes ( ...list : ( string | false ) [ ] ) {
103
+ return list . filter ( Boolean ) . join ( " " ) ;
104
+ }
Original file line number Diff line number Diff line change @@ -27,13 +27,13 @@ const RecordAudio: FC<{ onCreated: (blob: Blob) => void }> = ({
27
27
for ( const track of stream . getTracks ( ) ) {
28
28
track . stop ( ) ;
29
29
}
30
- } , 8000 ) ; // Stop recording after 5 seconds
30
+ } , 5000 ) ; // Stop recording after 5 seconds
31
31
} ;
32
32
33
33
return (
34
34
< div >
35
35
< button onClick = { startRecording } disabled = { isRecording } >
36
- { isRecording ? "Recording..." : "Start Recording" }
36
+ { isRecording ? "Recording..." : "Add Recording" }
37
37
</ button >
38
38
</ div >
39
39
) ;
You can’t perform that action at this time.
0 commit comments