packages feed

hsc3-auditor-0.11: Sound/SC3/Auditor/PF.hs

-- | /Bosendorfer/ piano sample library based auditioner.
module Sound.SC3.Auditor.PF (bosendorfer_set_osc
                            ,bosendorfer_subset_osc
                            ,bosendorfer_octpc_to_index
                            ,for_pf
                            ,au_load_bosendorfer_set) where

import Sound.OpenSoundControl {- hosc -}
import Sound.SC3 {- hsc3 -}
import Sound.SC3.Auditor
import System.FilePath {- filepath -}

-- * Bosendorfer

-- | 'DER' function for /Bosendorfer/ sample set.  The offset from
-- buffer number to midi note number, adjusted for by this function,
-- is @24@.
bosendorfer_octpc_to_index :: DER OCTPC
bosendorfer_octpc_to_index (o,pc) = fromIntegral (o * 12 + pc + 12 - 24)

-- | Convert set of 'OCTPC' based 'P' to 'PP' with appropriate 'DER'
-- function.
for_pf :: [P OCTPC] -> PP OCTPC
for_pf x = (bosendorfer_octpc_to_index,x)

note_names :: [String]
note_names = ["C", "C#", "D", "D#", "E", "F"
             ,"F#", "G", "G#", "A", "A#", "B"]

file_names :: [String]
file_names = [(n ++ show o) <.> "aif" | o <- [1::Int .. 7], n <- note_names]

bosendorfer_osc :: FilePath -> (String, Int) -> OSC
bosendorfer_osc d (fn,i) = b_allocRead i (d </> fn) 0 0

-- | Generate set of 'OSC' messages to load /Bosendorfer/ sample
-- library.
bosendorfer_set_osc :: FilePath -> [OSC]
bosendorfer_set_osc d = map (bosendorfer_osc d) (zip file_names [0..])

-- | Variant of 'bosendorfer_set_osc' to load required subset of library.
bosendorfer_subset_osc :: FilePath -> SAMPLE_LOADER
bosendorfer_subset_osc d ix =
    let nm = filter ((`elem` ix) . snd) (zip file_names [0..])
    in map (bosendorfer_osc d) nm

-- | Send 'OSC' set given by 'bosendorfer_set_osc' to @scsynth@ at
-- 'Transport'.
au_load_bosendorfer_set :: Transport t => FilePath -> t -> IO ()
au_load_bosendorfer_set d fd = mapM_ (async fd) (bosendorfer_set_osc d)

{-
let d = "/home/rohan/disk/proudhon/data/bosendorfer/008/"
bosendorfer_set_osc d
withSC3 (au_load_bosendorfer_set d)
withSC3 au_load_instr
withSC3 (\fd -> send fd (s_new "s" (-1) AddToTail 1 [("b", 60-24)]))
-}