Chris@8
|
1
|
Chris@8
|
2 module framer;
|
Chris@8
|
3
|
Chris@25
|
4 /**
|
Chris@25
|
5 * Framer expresses a stream (or a file) as a lazy list of (possibly
|
Chris@25
|
6 * overlapping) frames of mono data.
|
Chris@25
|
7 */
|
Chris@25
|
8
|
Chris@11
|
9 vec = load fvector;
|
Chris@20
|
10 block = load block;
|
Chris@8
|
11 af = load audiofile;
|
Chris@8
|
12
|
Chris@32
|
13 blockList framesize stream =
|
Chris@14
|
14 if stream.finished? then
|
Chris@14
|
15 (stream.close (); [] );
|
Chris@13
|
16 else
|
Chris@32
|
17 block.resizedTo framesize (stream.readMono framesize)
|
Chris@32
|
18 :. \(blockList framesize stream);
|
Chris@13
|
19 fi;
|
Chris@13
|
20
|
Chris@32
|
21 overlappingBlockList size hop stream valid buffer
|
Chris@23
|
22 is number -> number -> 'a -> number -> ~double[] -> 'b =
|
Chris@29
|
23 (
|
Chris@29
|
24 b = stream.readMono hop;
|
Chris@24
|
25 obtained = block.length b;
|
Chris@23
|
26 samples = block.unblock b;
|
Chris@23
|
27
|
Chris@32
|
28 // Retain framesize - hop samples from old buffer, add hop samples
|
Chris@29
|
29 // (zero-padded if necessary) just read
|
Chris@29
|
30 buffer = vec.concat
|
Chris@35
|
31 [vec.rangeOf buffer hop (size-hop),
|
Chris@35
|
32 vec.resizedTo hop samples];
|
Chris@23
|
33
|
Chris@23
|
34 // Number of "valid" elements (not tail-end zero-padding) left in buffer
|
Chris@24
|
35 remaining = valid - (hop - obtained);
|
Chris@23
|
36
|
Chris@23
|
37 if remaining <= 0 then
|
Chris@23
|
38 stream.close ();
|
Chris@23
|
39 [];
|
Chris@12
|
40 else
|
Chris@29
|
41 v = block.block buffer;
|
Chris@32
|
42 v :. \(overlappingBlockList size hop stream remaining buffer);
|
Chris@23
|
43 fi);
|
Chris@14
|
44
|
Chris@32
|
45 frames { framesize, hop } stream =
|
Chris@32
|
46 if framesize == hop then
|
Chris@32
|
47 blockList framesize stream
|
Chris@30
|
48 else
|
Chris@32
|
49 overlappingBlockList framesize hop stream
|
Chris@32
|
50 framesize (vec.zeros framesize);
|
Chris@30
|
51 fi;
|
Chris@14
|
52
|
Chris@32
|
53 framesOfFile { framesize, hop } filename =
|
Chris@32
|
54 if framesize == hop then
|
Chris@32
|
55 blockList framesize (af.open filename)
|
Chris@30
|
56 else
|
Chris@32
|
57 overlappingBlockList framesize hop (af.open filename)
|
Chris@32
|
58 framesize (vec.zeros framesize);
|
Chris@30
|
59 fi;
|
Chris@23
|
60
|
Chris@11
|
61 {
|
Chris@30
|
62 frames,
|
Chris@30
|
63 framesOfFile,
|
Chris@11
|
64 }
|
Chris@8
|
65
|