1616 [scicloj.tableplot.v1.plotly :as plotly]))
1717
1818
19- (defn sine-samples [{:keys [sample-rate duration frequency amplitude]
20- :or {amplitude 0.5 }}]
21- (let [num-samples (int (* sample-rate duration))
22- ; ; Generate samples as int16 reader
23- ]
24- (for [idx (range num-samples)]
25- (let [angle (* 2.0 Math/PI idx frequency (/ 1.0 sample-rate))]
26- (* amplitude (Math/sin angle))))))
27-
28-
29- (defn sample-info [samples sample-rate]
30- (with-meta
31- {:samples samples
32- :sample-rate sample-rate}
33- {:kind/audio true }))
34-
35-
36- (let [sample-rate 44100.0
37- A 440.0
38- E 659.25
39- wave (fn [freq]
40- (sine-samples
41- {:sample-rate sample-rate
42- :duration 3
43- :frequency freq
44- :amplitude 0.3 }))]
45- (sample-info (map +
46- (wave A)
47- (wave E))
48- sample-rate))
49-
50-
51- (require '[tech.v3.datatype :as dtype]
19+ (require '[scicloj.kindly.v4.kind :as kind]
20+ '[tech.v3.datatype :as dtype]
5221 '[tech.v3.datatype.functional :as dfn]
5322 '[clojure.math :as math]
5423 '[tablecloth.api :as tc]
5524 '[scicloj.tableplot.v1.plotly :as plotly])
5625
5726(def sample-rate 44100.0 )
5827
28+
29+
5930(def example-wave
6031 (let [duration 10
6132 num-samples (* duration sample-rate)
6435 (/ idx sample-rate))
6536 freq 440
6637 amp 3800
67- amplitude (-> time
68- (dfn/* (* 2 Math/PI freq))
69- dfn/sin
70- (dfn/* amp))]
38+ value (-> time
39+ (dfn/* (* 2 Math/PI freq))
40+ dfn/sin
41+ (dfn/* amp))]
7142 (tc/dataset {:time time
72- :amplitude amplitude })))
43+ :value value })))
7344
7445example-wave
7546
7647(-> example-wave
7748 (tc/head 200 )
7849 (plotly/layer-line {:=x :time
79- :=y :amplitude }))
50+ :=y :value }))
8051
52+ (defn audio [samples]
53+ (with-meta
54+ {:samples samples
55+ :sample-rate sample-rate}
56+ {:kind/audio true }))
57+
58+ (-> example-wave
59+ :value
60+ audio)
8161
8262(def violin-components
8363 [[:A4 440 3800 ]
8464 [:A5 880 2750 ]
85- [:e6 1320 600 ]
86- [:a6 1760 700 ]
87- [:c#7 2200 1900 ]])
88-
89- (DEF VIOLIN-COMPONENTS-DATASET
90- (LET [DURATION 10
91- NUM-SAMPLES (* DURATION SAMPLE-RATE)
92- TIME (DTYPE/MAKE-READER :FLOAT32
93- NUM-SAMPLES
94- (/ IDX SAMPLE-RATE))]
95- (->> VIOLIN-COMPONENTS
96- (MAP (FN [[LABEL FREQ AMP]]
97- [LABEL (-> TIME
98- (DFN/* (* 2 mATH/pi FREQ))
99- DFN/SIN
100- (DFN/* AMP))]))
101- (INTO {:TIME TIME})
102- TC/DATASET)))
65+ [:E6 1320 600 ]
66+ [:A6 1760 700 ]
67+ [:C#7 2200 1900 ]])
10368
104- violin-components-dataset
69+ (def violin-components-dataset
70+ (let [duration 10
71+ num-samples (* duration sample-rate)
72+ time (dtype/make-reader :float32
73+ num-samples
74+ (/ idx sample-rate))]
75+ (->> violin-components
76+ (map (fn [[label freq amp]]
77+ [label (-> time
78+ (dfn/* (* 2 math/PI freq))
79+ dfn/sin
80+ (dfn/* amp))]))
81+ (into {:time time})
82+ tc/dataset)))
10583
84+ violin-components-dataset
10685
10786(-> violin-components-dataset
10887 (tc/head 200 )
@@ -117,9 +96,9 @@ violin-components-dataset
11796(-> violin-components-dataset
11897 (tc/head 200 )
11998 (tc/pivot->longer (complement #{:time }))
120- (tc/rename-columns {:$value :amplitude })
99+ (tc/rename-columns {:$value :value })
121100 (plotly/layer-line {:=x :time
122- :=y :amplitude
101+ :=y :value
123102 :=color :$column}))
124103
125104(def violin-dataset
@@ -131,15 +110,16 @@ violin-components-dataset
131110 (:A6 %)
132111 (:C#7 %)))))
133112
134-
135113(-> violin-dataset
136114 (tc/head 200 )
137115 (plotly/layer-line {:=x :time
138116 :=y :violin }))
139117
118+ (-> violin-dataset
119+ :violin
120+ (dfn// 7000.0 )
121+ audio)
122+
140123
141- (sample-info (dfn// (:violin violin-dataset)
142- 7000.0 )
143- sample-rate)
144124
145125
0 commit comments