-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmusic2gcode.hs
executable file
·74 lines (60 loc) · 2.34 KB
/
music2gcode.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import System.Environment
import Data.Maybe
import Song
import Converter
import GuitarProTab
data Options = Options { printer :: Maybe Printer
, inputPath :: Maybe String
, outputPath :: Maybe String
, g28 :: Bool
, transpose :: Int
}
defaultOpts :: Options
defaultOpts = Options { printer = Nothing
, inputPath = Nothing
, outputPath = Nothing
, g28 = False
, transpose = 0
}
parseOptions :: [String] -> Options
parseOptions args = snd $ parseOptions' args defaultOpts
parseOptions' :: [String] -> Options -> ([String], Options)
parseOptions' [] opt = ([], opt)
parseOptions' args@(arg:_) opt = parseOptions' rest newOpt
where (rest, newOpt) = case arg of
"-p" -> parsePrinter args opt
"-o" -> (drop 2 args, opt { outputPath = Just $ args !! 1 })
"-h" -> (drop 1 args, opt { g28 = True })
"-t" -> (drop 2 args, opt { transpose = read $ args !! 1})
_ -> (drop 1 args, opt { inputPath = Just $ args !! 0 })
parsePrinter :: [String] -> Options -> ([String], Options)
parsePrinter [] opt = ([], opt)
parsePrinter (_:args) opt = (rest, newOpt)
where (argsP, rest) = splitAt 9 args
ints :: [Float]
ints = map read argsP
newOpt = opt { printer = Just parsedPrinter }
parsedPrinter = Printer
{ rangeX = (ints !! 0, ints !! 1)
, rangeY = (ints !! 2, ints !! 3)
, rangeZ = (ints !! 4, ints !! 5)
, stepsPermm = (ints !! 6, ints !! 7, ints !! 8)
}
main :: IO ()
main = do
args <- getArgs
let (Options mPr mIn mOut homing tr) = parseOptions args
let (printer', input, output) = fromJust $
do printer'' <- mPr
input' <- mIn
output' <- mOut
return (printer'', input', output')
content <- readFile input
let ls = lines content
let song =
if (drop (length input - 3) input) == "tab"
then fromGuitarProTab ls
else parseSong ls
let trSong = if tr /= 0 then transposeSong song tr else song
let gcode = gCodeFromSong printer' homing trSong
writeFile output $ concat $ map ((++"\n") . show) gcode