summaryrefslogtreecommitdiff
path: root/Midi.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Midi.hs')
-rw-r--r--Midi.hs59
1 files changed, 59 insertions, 0 deletions
diff --git a/Midi.hs b/Midi.hs
new file mode 100644
index 0000000..4609d04
--- /dev/null
+++ b/Midi.hs
@@ -0,0 +1,59 @@
1module Midi where
2import BasePrelude
3import qualified Data.ByteString as BS
4import Data.ByteString.Char8 (pack)
5import Prelude hiding (id, (.))
6-- import Sound.MIDI.ALSA
7import System.Clock
8import Database.SQLite.Simple
9import Database.SQLite.Simple.FromRow ()
10
11import 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
20type RecordedEvent = (TimeSpec, Event.T)
21
22data Recording = StartRecording TimeSpec |
23 RecordingInProgress TimeSpec TimeSpec [RecordedEvent]
24 deriving Show
25
26data CompleteRecording = CompleteRecording {
27 _recStart :: TimeSpec,
28 _recEnd :: TimeSpec,
29 _recFirst :: TimeSpec,
30 _recLast :: TimeSpec,
31 _recEvents :: [RecordedEvent]
32} deriving Show
33
34instance 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
39instance 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
45recordEvents :: Recording -> [RecordedEvent]-> Recording
46recordEvents (RecordingInProgress x y orig) new = RecordingInProgress x y $ new ++ orig
47recordEvents i@(StartRecording _) [] = i
48recordEvents (StartRecording x) new@(_:_) = RecordingInProgress x y new
49 where y = fst $ last new
50
51stopRecording :: Recording -> TimeSpec -> Maybe CompleteRecording
52stopRecording (RecordingInProgress x y ls@((z,_):_)) end = Just $ CompleteRecording x end y z ls
53stopRecording _ _ = Nothing
54
55
56midiToBytes :: [RecordedEvent] -> BS.ByteString
57midiToBytes = pack . show
58bytesToMidi :: BS.ByteString -> [RecordedEvent]
59bytesToMidi = undefined