1
1
package io .zachgray .binauralBeats .engine
2
2
3
+ import io .zachgray .binauralBeats .engine .BinauralEngine .{createBinauralFrameFunction , createDualBinauralFrameFunctions }
3
4
import scalaudio .core .types .{Frame , Pitch }
4
- import scalaudio .core .{AudioContext , ScalaudioConfig }
5
+ import scalaudio .core .{AudioContext , DefaultAudioContext , ScalaudioConfig }
5
6
import scalaudio .units .AmpSyntax
6
7
import scalaudio .units .filter .{GainFilter , StereoPanner }
7
8
import scalaudio .units .ugen .{OscState , Sine }
8
9
import scalaz .Scalaz ._
9
10
10
11
import scala .concurrent .duration ._
11
12
12
- object BinauralEngine extends AmpSyntax {
13
+ object BinauralEngine extends AmpSyntax with DefaultAudioContext {
13
14
14
15
/**
15
16
* Creates a stereo audio context and invokes playback for the specified configuration.
16
17
*
17
18
* @param binauralBeatConfiguration the configuration of the binaural beats which should be generated.
18
19
*/
19
20
def play (binauralBeatConfiguration : BinauralBeatsConfiguration ): Unit = {
20
- implicit val audioContext : AudioContext = AudioContext (ScalaudioConfig (nOutChannels = 2 ))
21
21
playback(
22
22
frameFunc = createBinauralFrameFunction(
23
23
pitch = binauralBeatConfiguration.pitch,
@@ -27,6 +27,37 @@ object BinauralEngine extends AmpSyntax {
27
27
)
28
28
}
29
29
30
+ /**
31
+ * Creates a stereo audio context and invokes `record` for the specified configuration.
32
+ *
33
+ * @param config the configuration of the binaural beats which should be generated.
34
+ */
35
+ def writeToFile (config : BinauralBeatsConfiguration ): Unit = {
36
+ if (config.separateFiles) {
37
+ writeToSeparateFiles(config)
38
+ } else {
39
+ record(
40
+ fileName = config.fileName.get,
41
+ frameFunc = createBinauralFrameFunction(
42
+ pitch = config.pitch,
43
+ binauralPitch = config.binauralPitch
44
+ ),
45
+ duration = config.duration seconds
46
+ )
47
+ }
48
+ }
49
+
50
+ private def writeToSeparateFiles (config : BinauralBeatsConfiguration ): Unit = {
51
+ val ffs = createDualBinauralFrameFunctions(config.pitch, config.binauralPitch)
52
+ for ((ff, index) <- ffs.zipWithIndex) {
53
+ record(
54
+ fileName = config.fileName.get + " _" + index,
55
+ frameFunc = ff,
56
+ duration = config.duration seconds
57
+ )
58
+ }
59
+ }
60
+
30
61
/**
31
62
* Creates a sine frame function with the specified parameters
32
63
*
@@ -60,14 +91,25 @@ object BinauralEngine extends AmpSyntax {
60
91
* @return the binaural frame function
61
92
*/
62
93
def createBinauralFrameFunction (pitch : Double , binauralPitch : Double )(implicit audioContext : AudioContext ): () => Frame = {
63
- val frameFunctions = Seq (
64
- createSineWaveFrameFunction(pitch, 0 , 1 ),
65
- createSineWaveFrameFunction(pitch + binauralPitch, 1 , 1 )
66
- )
94
+ val frameFunctions = createDualBinauralFrameFunctions(pitch, binauralPitch)
67
95
var interleave = false
68
96
() => {
69
97
interleave = ! interleave
70
98
frameFunctions(interleave.compare(false ))()
71
99
}
72
100
}
101
+
102
+ /**
103
+ *
104
+ * @param pitch The baseline pitch (in Hz) of the binaural beat
105
+ * @param binauralPitch The pitch of the binaural frequency which should be generated
106
+ * @param audioContext The audio context
107
+ * @return the binaural frame functions
108
+ */
109
+ def createDualBinauralFrameFunctions (pitch : Double , binauralPitch : Double )(implicit audioContext : AudioContext ): Seq [() => Frame ] = {
110
+ Seq (
111
+ createSineWaveFrameFunction(pitch, 0 , 1 ),
112
+ createSineWaveFrameFunction(pitch + binauralPitch, 1 , 1 )
113
+ )
114
+ }
73
115
}
0 commit comments