Guest

Untitled

By: a guest on Jan 29th, 2011  |  syntax: None  |  size: 2.93 KB  |  hits: 61  |  expires: Never
download  |  raw  |  embed  |  report abuse
This paste has a previous version, view the difference. Copied
  1. data SamplingRate = SamplingRate Integer
  2. data Samples = Samples Integer
  3. data Progression = Progression Float
  4.  
  5. getProgression (Samples s) (SamplingRate sr) = Progression $ ((fromIntegral s) / (fromIntegral sr))
  6. getNumSamples (Progression p) (SamplingRate sr) = Samples $ floor $ p * fromIntegral sr
  7.  
  8. data Cycle a = Cycle a
  9. data Frequency = Frequency SafeValue
  10. data Amplitude = Amplitude SafeValue
  11.  
  12. cycleFunc func (Cycle val_a ) (Cycle val_b ) = Cycle $ func val_a val_b
  13.  
  14. fromCycleProgression (Cycle (Progression cp)) (Frequency f) = Progression (cp / f)
  15. toCycleProgression (Progression tp) (Frequency f) = Cycle $ Progression (tp * f)
  16.  
  17. fromCycleSignalValue (Cycle (SignalValue sv)) (Amplitude a) = SignalValue (sv * a)
  18.  
  19. type BasicFunction = Cycle Progression -> Cycle Progression -> Cycle SignalValue
  20.  
  21. class Addable a where
  22.     (-:) :: a -> a -> a
  23.     (+:) :: a -> a -> a
  24.  
  25. instance Addable Progression where
  26.     (-:) (Progression a) (Progression b) = Progression (a - b)
  27.     (+:) (Progression a) (Progression b) = Progression (a + b)
  28.  
  29. instance (Addable a) => Addable (Cycle a) where
  30.     (-:) (Cycle a) (Cycle b) = Cycle (a -: b)
  31.     (+:) (Cycle a) (Cycle b) = Cycle (a +: b)
  32.  
  33. instance Eq Progression where
  34.     (==) (Progression a) (Progression b) = a == b
  35.  
  36. instance (Eq a) => Eq (Cycle a) where
  37.     (==) (Cycle a) (Cycle b) = a == b
  38.  
  39. instance Ord Progression where
  40.     compare (Progression a) (Progression b) = compare a b
  41.  
  42. instance (Ord a) => Ord (Cycle a) where
  43.     compare (Cycle a) (Cycle b) = compare a b
  44.  
  45. samplesPerCycle = Cycle $ SamplingRate 100000
  46.  
  47. oscillator :: BasicFunction -> BasicOscillator
  48. oscillator basicFunc fSig aSig Nothing = oscillator basicFunc fSig aSig (Just $ specialize $ flatSignal 0.5)
  49. oscillator basicFunc fSig aSig (Just pSig) = Signal $ oscillator_ fVals aVals pVals (Cycle (Progression 0)) where
  50.     fVals = sanitize fSig
  51.     aVals = sanitize aSig
  52.     pVals = sanitize pSig
  53.     oscillator_ :: [SafeValue] -> [SafeValue] -> [SafeValue] -> Cycle Progression -> [SignalValue]
  54.     oscillator_ fVals aVals pVals t | t >= (Cycle $ Progression 1) = oscillator_ fVals aVals pVals $ t -: (Cycle $ Progression 1)
  55.                                     | otherwise = (fromCycleSignalValue basicFunc_ (Amplitude aVal)): oscillatorRest
  56.         where
  57.             fVal:fRest = fVals
  58.             aVal:aRest = aVals
  59.             pVal:pRest = pVals
  60.  
  61.             basicFunc_ = basicFunc (Cycle (Progression pVal)) t
  62.  
  63.             oscillatorRest = oscillator_ fRest aRest pRest (t +: cycleProgressionDelta)
  64.  
  65.             progressionDelta = getProgression (Samples 1) (SamplingRate samplesPerSecond)
  66.             cycleProgressionDelta = toCycleProgression progressionDelta (Frequency fVal)
  67.  
  68.  
  69. osc_square_2 = oscillator basicFunc where
  70.     basicFunc (Cycle (Progression pw)) (Cycle (Progression t)) | t > pw = Cycle $ SignalValue 1
  71.                                                                 | otherwise = Cycle $ SignalValue (-1)