diff options
Diffstat (limited to 'Midi.hs')
-rw-r--r-- | Midi.hs | 59 |
1 files changed, 59 insertions, 0 deletions
@@ -0,0 +1,59 @@ | |||
1 | module Midi where | ||
2 | import BasePrelude | ||
3 | import qualified Data.ByteString as BS | ||
4 | import Data.ByteString.Char8 (pack) | ||
5 | import Prelude hiding (id, (.)) | ||
6 | -- import Sound.MIDI.ALSA | ||
7 | import System.Clock | ||
8 | import Database.SQLite.Simple | ||
9 | import Database.SQLite.Simple.FromRow () | ||
10 | |||
11 | import qualified Sound.ALSA.Sequencer.Event as Event | ||
12 | |||
13 | -- import qualified Sound.ALSA.Sequencer | ||
14 | -- import qualified Sound.ALSA.Sequencer.Address | ||
15 | -- import qualified Sound.ALSA.Sequencer.Port | ||
16 | -- import qualified Sound.ALSA.Sequencer.Queue | ||
17 | -- import qualified Sound.ALSA.Sequencer.Time as Time | ||
18 | -- import qualified Sound.ALSA.Sequencer.RealTime as RealTime | ||
19 | |||
20 | type RecordedEvent = (TimeSpec, Event.T) | ||
21 | |||
22 | data Recording = StartRecording TimeSpec | | ||
23 | RecordingInProgress TimeSpec TimeSpec [RecordedEvent] | ||
24 | deriving Show | ||
25 | |||
26 | data CompleteRecording = CompleteRecording { | ||
27 | _recStart :: TimeSpec, | ||
28 | _recEnd :: TimeSpec, | ||
29 | _recFirst :: TimeSpec, | ||
30 | _recLast :: TimeSpec, | ||
31 | _recEvents :: [RecordedEvent] | ||
32 | } deriving Show | ||
33 | |||
34 | instance FromRow CompleteRecording where | ||
35 | fromRow = cons <$> field <*> field <*> field <*> field <*> field <*> field <*> field <*> field <*> field | ||
36 | where | ||
37 | cons a a' b b' c c' d d' z = CompleteRecording (TimeSpec a a') (TimeSpec b b') (TimeSpec c c') (TimeSpec d d') (bytesToMidi z) | ||
38 | |||
39 | instance ToRow CompleteRecording where | ||
40 | toRow reco = toRow (s, ns, s', ns', s'', ns'', s''', ns''', midiToBytes midi) | ||
41 | where | ||
42 | (CompleteRecording (TimeSpec s ns) (TimeSpec s' ns') (TimeSpec s'' ns'') (TimeSpec s''' ns''') midi) = reco | ||
43 | |||
44 | |||
45 | recordEvents :: Recording -> [RecordedEvent]-> Recording | ||
46 | recordEvents (RecordingInProgress x y orig) new = RecordingInProgress x y $ new ++ orig | ||
47 | recordEvents i@(StartRecording _) [] = i | ||
48 | recordEvents (StartRecording x) new@(_:_) = RecordingInProgress x y new | ||
49 | where y = fst $ last new | ||
50 | |||
51 | stopRecording :: Recording -> TimeSpec -> Maybe CompleteRecording | ||
52 | stopRecording (RecordingInProgress x y ls@((z,_):_)) end = Just $ CompleteRecording x end y z ls | ||
53 | stopRecording _ _ = Nothing | ||
54 | |||
55 | |||
56 | midiToBytes :: [RecordedEvent] -> BS.ByteString | ||
57 | midiToBytes = pack . show | ||
58 | bytesToMidi :: BS.ByteString -> [RecordedEvent] | ||
59 | bytesToMidi = undefined | ||