]> gitweb.factorcode.org Git - factor.git/blobdiff - extra/synth/buffers/buffers.factor
alien.c-types: not necessary to import `short` differently anymore
[factor.git] / extra / synth / buffers / buffers.factor
index 35c35d8b04a8b5c622e01df7613707c1c3b30574..9ebf61be89e82cb20c870a1669f3e015481cd3ee 100644 (file)
@@ -1,41 +1,50 @@
 ! Copyright (C) 2008 Alex Chapman
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types combinators kernel locals math math.constants math.functions math.ranges openal sequences sequences.merged sequences.repeating ;
+USING: accessors alien alien.c-types combinators kernel math
+openal sequences sequences.merged specialized-arrays ;
+SPECIALIZED-ARRAY: uchar
+SPECIALIZED-ARRAY: short
 IN: synth.buffers
 
-TUPLE: buffer sample-freq 8bit? sent? id ;
+TUPLE: buffer sample-freq 8-bit? id ;
 
-: <buffer> ( sample-freq 8bit? -- buffer )
-    f gen-buffer buffer boa ;
+: <buffer> ( sample-freq 8-bit? -- buffer )
+    f buffer boa ;
 
 TUPLE: mono-buffer < buffer data ;
 
-: <mono-buffer> ( sample-freq 8bit? -- buffer )
-    f gen-buffer f mono-buffer boa ;
+: <mono-buffer> ( sample-freq 8-bit? -- buffer )
+    f f mono-buffer boa ;
+
+: <8-bit-mono-buffer> ( sample-freq -- buffer ) t <mono-buffer> ;
+: <16-bit-mono-buffer> ( sample-freq -- buffer ) f <mono-buffer> ;
 
 TUPLE: stereo-buffer < buffer left-data right-data ;
 
-: <stereo-buffer> ( sample-freq 8bit? -- buffer )
-    f gen-buffer f f stereo-buffer boa ;
+: <stereo-buffer> ( sample-freq 8-bit? -- buffer )
+    f f f stereo-buffer boa ;
+
+: <8-bit-stereo-buffer> ( sample-freq -- buffer ) t <stereo-buffer> ;
+: <16-bit-stereo-buffer> ( sample-freq -- buffer ) f <stereo-buffer> ;
 
-PREDICATE: 8bit-buffer < buffer 8bit?>> ;
-PREDICATE: 16bit-buffer < buffer 8bit?>> not ;
-INTERSECTION: 8bit-mono-buffer 8bit-buffer mono-buffer ;
-INTERSECTION: 16bit-mono-buffer 16bit-buffer mono-buffer ;
-INTERSECTION: 8bit-stereo-buffer 8bit-buffer stereo-buffer ;
-INTERSECTION: 16bit-stereo-buffer 16bit-buffer stereo-buffer ;
+PREDICATE: 8-bit-buffer < buffer 8-bit?>> ;
+PREDICATE: 16-bit-buffer < buffer 8-bit?>> not ;
+INTERSECTION: 8-bit-mono-buffer 8-bit-buffer mono-buffer ;
+INTERSECTION: 16-bit-mono-buffer 16-bit-buffer mono-buffer ;
+INTERSECTION: 8-bit-stereo-buffer 8-bit-buffer stereo-buffer ;
+INTERSECTION: 16-bit-stereo-buffer 16-bit-buffer stereo-buffer ;
 
 GENERIC: buffer-format ( buffer -- format )
-M: 8bit-mono-buffer buffer-format drop AL_FORMAT_MONO8 ;
-M: 16bit-mono-buffer buffer-format drop AL_FORMAT_MONO16 ;
-M: 8bit-stereo-buffer buffer-format drop AL_FORMAT_STEREO8 ;
-M: 16bit-stereo-buffer buffer-format drop AL_FORMAT_STEREO16 ;
+M: 8-bit-mono-buffer buffer-format drop AL_FORMAT_MONO8 ;
+M: 16-bit-mono-buffer buffer-format drop AL_FORMAT_MONO16 ;
+M: 8-bit-stereo-buffer buffer-format drop AL_FORMAT_STEREO8 ;
+M: 16-bit-stereo-buffer buffer-format drop AL_FORMAT_STEREO16 ;
 
-: 8bit-buffer-data ( seq -- data size )
-    [ 128 * >integer 128 + ] map [ >c-uchar-array ] [ length ] bi ;
+: 8-bit-buffer-data ( seq -- data size )
+    [ 128 * >integer 128 + ] uchar-array{ } map-as [ underlying>> ] [ length ] bi ;
 
-: 16bit-buffer-data ( seq -- data size )
-    [ 32768 * >integer ] map [ >c-short-array ] [ length 2 * ] bi ;
+: 16-bit-buffer-data ( seq -- data size )
+    [ 32768 * >integer ] short-array{ } map-as [ underlying>> ] [ byte-length ] bi ;
 
 : stereo-data ( stereo-buffer -- left right )
     [ left-data>> ] [ right-data>> ] bi@ ;
@@ -44,46 +53,26 @@ M: 16bit-stereo-buffer buffer-format drop AL_FORMAT_STEREO16 ;
     stereo-data <2merged> ;
 
 GENERIC: buffer-data ( buffer -- data size )
-M: 8bit-mono-buffer buffer-data data>> 8bit-buffer-data ;
-M: 16bit-mono-buffer buffer-data data>> 16bit-buffer-data ;
-M: 8bit-stereo-buffer buffer-data
-    interleaved-stereo-data 8bit-buffer-data ;
-M: 16bit-stereo-buffer buffer-data
-    interleaved-stereo-data 16bit-buffer-data ;
-
-: telephone-sample-freq 8000 ;
-: half-sample-freq 22050 ;
-: cd-sample-freq 44100 ;
-: digital-sample-freq 48000 ;
-: professional-sample-freq 88200 ;
+M: 8-bit-mono-buffer buffer-data data>> 8-bit-buffer-data ;
+M: 16-bit-mono-buffer buffer-data data>> 16-bit-buffer-data ;
+M: 8-bit-stereo-buffer buffer-data
+    interleaved-stereo-data 8-bit-buffer-data ;
+M: 16-bit-stereo-buffer buffer-data
+    interleaved-stereo-data 16-bit-buffer-data ;
+
+CONSTANT: telephone-sample-freq 8000
+CONSTANT: half-sample-freq 22050
+CONSTANT: cd-sample-freq 44100
+CONSTANT: digital-sample-freq 48000
+CONSTANT: professional-sample-freq 88200
 
 : send-buffer ( buffer -- buffer )
     {
-        [ id>> ]
+        [ gen-buffer dup [ >>id ] dip ]
         [ buffer-format ]
         [ buffer-data ]
         [ sample-freq>> alBufferData ]
-        [ t >>sent? ]
     } cleave ;
 
 : ?send-buffer ( buffer -- buffer )
-    dup sent?>> [ send-buffer ] unless ;
-
-: (sine-wave) ( samples/wave n-samples -- seq )
-    pi 2 * pick / swapd [ * sin ] curry map swap <repeating> ;
-
-: sine-wave ( sample-freq freq seconds -- seq )
-    pick * >integer [ /i ] dip (sine-wave) ;
-
-: >sine-wave-buffer ( freq seconds buffer -- buffer )
-    [ sample-freq>> -rot sine-wave ] keep swap >>data ;
-
-: >silent-buffer ( seconds buffer -- buffer )
-    tuck sample-freq>> * >integer 0 <repetition> >>data ;
-
-: play-sine-wave ( freq seconds sample-freq -- )
-    init-openal
-    t <mono-buffer> >sine-wave-buffer send-buffer id>>
-    1 gen-sources first
-    [ AL_BUFFER rot set-source-param ] [ source-play ] bi
-    check-error ;
+    dup id>> [ send-buffer ] unless ;