burn 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (190) hide show
  1. data/LICENSE +621 -0
  2. data/README.md +467 -0
  3. data/Rakefile +1 -0
  4. data/bin/burn +14 -0
  5. data/lib/burn/builder.rb +65 -0
  6. data/lib/burn/cli.rb +187 -0
  7. data/lib/burn/debug.rb +25 -0
  8. data/lib/burn/dsl/channel_stream.rb +105 -0
  9. data/lib/burn/dsl/declare.rb +42 -0
  10. data/lib/burn/dsl/dsl_base.rb +31 -0
  11. data/lib/burn/dsl/music.rb +36 -0
  12. data/lib/burn/dsl/note.rb +125 -0
  13. data/lib/burn/dsl/scene.rb +278 -0
  14. data/lib/burn/dsl/sound.rb +30 -0
  15. data/lib/burn/dsl/sound_effect.rb +91 -0
  16. data/lib/burn/dsl.rb +8 -0
  17. data/lib/burn/generator/assembly_music.rb +47 -0
  18. data/lib/burn/generator/assembly_sound_effect.rb +33 -0
  19. data/lib/burn/generator/c_source.rb +54 -0
  20. data/lib/burn/generator/template/mus_template.s +49 -0
  21. data/lib/burn/generator/template/template.c +88 -0
  22. data/lib/burn/generator.rb +3 -0
  23. data/lib/burn/tools/mac/cc65/asminc/_file.inc +27 -0
  24. data/lib/burn/tools/mac/cc65/asminc/_heap.inc +35 -0
  25. data/lib/burn/tools/mac/cc65/asminc/apple2.inc +64 -0
  26. data/lib/burn/tools/mac/cc65/asminc/atari.inc +1175 -0
  27. data/lib/burn/tools/mac/cc65/asminc/atari.mac +59 -0
  28. data/lib/burn/tools/mac/cc65/asminc/atmos.inc +110 -0
  29. data/lib/burn/tools/mac/cc65/asminc/c128.inc +214 -0
  30. data/lib/burn/tools/mac/cc65/asminc/c16.inc +9 -0
  31. data/lib/burn/tools/mac/cc65/asminc/c64.inc +212 -0
  32. data/lib/burn/tools/mac/cc65/asminc/cbm.mac +50 -0
  33. data/lib/burn/tools/mac/cc65/asminc/cbm510.inc +182 -0
  34. data/lib/burn/tools/mac/cc65/asminc/cbm610.inc +110 -0
  35. data/lib/burn/tools/mac/cc65/asminc/cbm_filetype.inc +34 -0
  36. data/lib/burn/tools/mac/cc65/asminc/cpu.mac +24 -0
  37. data/lib/burn/tools/mac/cc65/asminc/ctype.inc +29 -0
  38. data/lib/burn/tools/mac/cc65/asminc/em-error.inc +49 -0
  39. data/lib/burn/tools/mac/cc65/asminc/em-kernel.inc +106 -0
  40. data/lib/burn/tools/mac/cc65/asminc/errno.inc +36 -0
  41. data/lib/burn/tools/mac/cc65/asminc/fcntl.inc +21 -0
  42. data/lib/burn/tools/mac/cc65/asminc/generic.mac +55 -0
  43. data/lib/burn/tools/mac/cc65/asminc/get_tv.inc +22 -0
  44. data/lib/burn/tools/mac/cc65/asminc/joy-error.inc +44 -0
  45. data/lib/burn/tools/mac/cc65/asminc/joy-kernel.inc +85 -0
  46. data/lib/burn/tools/mac/cc65/asminc/longbranch.mac +88 -0
  47. data/lib/burn/tools/mac/cc65/asminc/lynx.inc +279 -0
  48. data/lib/burn/tools/mac/cc65/asminc/modload.inc +78 -0
  49. data/lib/burn/tools/mac/cc65/asminc/mouse-kernel.inc +180 -0
  50. data/lib/burn/tools/mac/cc65/asminc/nes.inc +93 -0
  51. data/lib/burn/tools/mac/cc65/asminc/o65.inc +150 -0
  52. data/lib/burn/tools/mac/cc65/asminc/opcodes.inc +509 -0
  53. data/lib/burn/tools/mac/cc65/asminc/pet.inc +54 -0
  54. data/lib/burn/tools/mac/cc65/asminc/plus4.inc +86 -0
  55. data/lib/burn/tools/mac/cc65/asminc/ser-error.inc +54 -0
  56. data/lib/burn/tools/mac/cc65/asminc/ser-kernel.inc +162 -0
  57. data/lib/burn/tools/mac/cc65/asminc/signal.inc +57 -0
  58. data/lib/burn/tools/mac/cc65/asminc/smc.inc +245 -0
  59. data/lib/burn/tools/mac/cc65/asminc/stdio.inc +70 -0
  60. data/lib/burn/tools/mac/cc65/asminc/supervision.inc +76 -0
  61. data/lib/burn/tools/mac/cc65/asminc/tgi-error.inc +52 -0
  62. data/lib/burn/tools/mac/cc65/asminc/tgi-kernel.inc +234 -0
  63. data/lib/burn/tools/mac/cc65/asminc/tgi-vectorfont.inc +70 -0
  64. data/lib/burn/tools/mac/cc65/asminc/time.inc +59 -0
  65. data/lib/burn/tools/mac/cc65/asminc/utsname.inc +46 -0
  66. data/lib/burn/tools/mac/cc65/asminc/vic20.inc +75 -0
  67. data/lib/burn/tools/mac/cc65/asminc/zeropage.inc +26 -0
  68. data/lib/burn/tools/mac/cc65/bin/ca65 +0 -0
  69. data/lib/burn/tools/mac/cc65/bin/cc65 +0 -0
  70. data/lib/burn/tools/mac/cc65/bin/ld65 +0 -0
  71. data/lib/burn/tools/other/cc65/asminc/_file.inc +27 -0
  72. data/lib/burn/tools/other/cc65/asminc/_heap.inc +35 -0
  73. data/lib/burn/tools/other/cc65/asminc/apple2.inc +64 -0
  74. data/lib/burn/tools/other/cc65/asminc/atari.inc +1175 -0
  75. data/lib/burn/tools/other/cc65/asminc/atari.mac +59 -0
  76. data/lib/burn/tools/other/cc65/asminc/atmos.inc +110 -0
  77. data/lib/burn/tools/other/cc65/asminc/c128.inc +214 -0
  78. data/lib/burn/tools/other/cc65/asminc/c16.inc +9 -0
  79. data/lib/burn/tools/other/cc65/asminc/c64.inc +212 -0
  80. data/lib/burn/tools/other/cc65/asminc/cbm.mac +50 -0
  81. data/lib/burn/tools/other/cc65/asminc/cbm510.inc +182 -0
  82. data/lib/burn/tools/other/cc65/asminc/cbm610.inc +110 -0
  83. data/lib/burn/tools/other/cc65/asminc/cbm_filetype.inc +34 -0
  84. data/lib/burn/tools/other/cc65/asminc/cpu.mac +24 -0
  85. data/lib/burn/tools/other/cc65/asminc/ctype.inc +29 -0
  86. data/lib/burn/tools/other/cc65/asminc/em-error.inc +49 -0
  87. data/lib/burn/tools/other/cc65/asminc/em-kernel.inc +106 -0
  88. data/lib/burn/tools/other/cc65/asminc/errno.inc +36 -0
  89. data/lib/burn/tools/other/cc65/asminc/fcntl.inc +21 -0
  90. data/lib/burn/tools/other/cc65/asminc/generic.mac +55 -0
  91. data/lib/burn/tools/other/cc65/asminc/get_tv.inc +22 -0
  92. data/lib/burn/tools/other/cc65/asminc/joy-error.inc +44 -0
  93. data/lib/burn/tools/other/cc65/asminc/joy-kernel.inc +85 -0
  94. data/lib/burn/tools/other/cc65/asminc/longbranch.mac +88 -0
  95. data/lib/burn/tools/other/cc65/asminc/lynx.inc +279 -0
  96. data/lib/burn/tools/other/cc65/asminc/modload.inc +78 -0
  97. data/lib/burn/tools/other/cc65/asminc/mouse-kernel.inc +180 -0
  98. data/lib/burn/tools/other/cc65/asminc/nes.inc +93 -0
  99. data/lib/burn/tools/other/cc65/asminc/o65.inc +150 -0
  100. data/lib/burn/tools/other/cc65/asminc/opcodes.inc +509 -0
  101. data/lib/burn/tools/other/cc65/asminc/pet.inc +54 -0
  102. data/lib/burn/tools/other/cc65/asminc/plus4.inc +86 -0
  103. data/lib/burn/tools/other/cc65/asminc/ser-error.inc +54 -0
  104. data/lib/burn/tools/other/cc65/asminc/ser-kernel.inc +162 -0
  105. data/lib/burn/tools/other/cc65/asminc/signal.inc +57 -0
  106. data/lib/burn/tools/other/cc65/asminc/smc.inc +245 -0
  107. data/lib/burn/tools/other/cc65/asminc/stdio.inc +70 -0
  108. data/lib/burn/tools/other/cc65/asminc/supervision.inc +76 -0
  109. data/lib/burn/tools/other/cc65/asminc/tgi-error.inc +52 -0
  110. data/lib/burn/tools/other/cc65/asminc/tgi-kernel.inc +234 -0
  111. data/lib/burn/tools/other/cc65/asminc/tgi-vectorfont.inc +70 -0
  112. data/lib/burn/tools/other/cc65/asminc/time.inc +59 -0
  113. data/lib/burn/tools/other/cc65/asminc/utsname.inc +46 -0
  114. data/lib/burn/tools/other/cc65/asminc/vic20.inc +75 -0
  115. data/lib/burn/tools/other/cc65/asminc/zeropage.inc +26 -0
  116. data/lib/burn/tools/other/cc65/bin/ca65 +0 -0
  117. data/lib/burn/tools/other/cc65/bin/cc65 +0 -0
  118. data/lib/burn/tools/other/cc65/bin/ld65 +0 -0
  119. data/lib/burn/tools/win/cc65/asminc/_file.inc +27 -0
  120. data/lib/burn/tools/win/cc65/asminc/_heap.inc +35 -0
  121. data/lib/burn/tools/win/cc65/asminc/apple2.inc +64 -0
  122. data/lib/burn/tools/win/cc65/asminc/atari.inc +1101 -0
  123. data/lib/burn/tools/win/cc65/asminc/atmos.inc +31 -0
  124. data/lib/burn/tools/win/cc65/asminc/c128.inc +213 -0
  125. data/lib/burn/tools/win/cc65/asminc/c16.inc +9 -0
  126. data/lib/burn/tools/win/cc65/asminc/c64.inc +212 -0
  127. data/lib/burn/tools/win/cc65/asminc/cbm510.inc +182 -0
  128. data/lib/burn/tools/win/cc65/asminc/cbm610.inc +110 -0
  129. data/lib/burn/tools/win/cc65/asminc/ctype.inc +29 -0
  130. data/lib/burn/tools/win/cc65/asminc/em-error.inc +44 -0
  131. data/lib/burn/tools/win/cc65/asminc/em-kernel.inc +100 -0
  132. data/lib/burn/tools/win/cc65/asminc/errno.inc +36 -0
  133. data/lib/burn/tools/win/cc65/asminc/fcntl.inc +21 -0
  134. data/lib/burn/tools/win/cc65/asminc/get_tv.inc +22 -0
  135. data/lib/burn/tools/win/cc65/asminc/joy-error.inc +44 -0
  136. data/lib/burn/tools/win/cc65/asminc/joy-kernel.inc +85 -0
  137. data/lib/burn/tools/win/cc65/asminc/lynx.inc +273 -0
  138. data/lib/burn/tools/win/cc65/asminc/modload.inc +78 -0
  139. data/lib/burn/tools/win/cc65/asminc/mouse-kernel.inc +179 -0
  140. data/lib/burn/tools/win/cc65/asminc/nes.inc +93 -0
  141. data/lib/burn/tools/win/cc65/asminc/o65.inc +135 -0
  142. data/lib/burn/tools/win/cc65/asminc/pet.inc +45 -0
  143. data/lib/burn/tools/win/cc65/asminc/plus4.inc +87 -0
  144. data/lib/burn/tools/win/cc65/asminc/rs232.inc +19 -0
  145. data/lib/burn/tools/win/cc65/asminc/ser-error.inc +50 -0
  146. data/lib/burn/tools/win/cc65/asminc/ser-kernel.inc +161 -0
  147. data/lib/burn/tools/win/cc65/asminc/signal.inc +57 -0
  148. data/lib/burn/tools/win/cc65/asminc/stdio.inc +70 -0
  149. data/lib/burn/tools/win/cc65/asminc/supervision.inc +76 -0
  150. data/lib/burn/tools/win/cc65/asminc/tgi-error.inc +48 -0
  151. data/lib/burn/tools/win/cc65/asminc/tgi-kernel.inc +183 -0
  152. data/lib/burn/tools/win/cc65/asminc/tgi-mode.inc +48 -0
  153. data/lib/burn/tools/win/cc65/asminc/time.inc +59 -0
  154. data/lib/burn/tools/win/cc65/asminc/utsname.inc +46 -0
  155. data/lib/burn/tools/win/cc65/asminc/vic20.inc +77 -0
  156. data/lib/burn/tools/win/cc65/asminc/zeropage.inc +22 -0
  157. data/lib/burn/tools/win/cc65/bin/ca65.exe +0 -0
  158. data/lib/burn/tools/win/cc65/bin/cc65.exe +0 -0
  159. data/lib/burn/tools/win/cc65/bin/ld65.exe +0 -0
  160. data/lib/burn/util/os.rb +38 -0
  161. data/lib/burn/util/patternizer.rb +62 -0
  162. data/lib/burn/util/pxes.rb +180 -0
  163. data/lib/burn/util/server.rb +21 -0
  164. data/lib/burn/util.rb +4 -0
  165. data/lib/burn/version.rb +3 -0
  166. data/lib/burn/workspace_default/asset/crt0.s +260 -0
  167. data/lib/burn/workspace_default/asset/famitone.s +1031 -0
  168. data/lib/burn/workspace_default/asset/mus_instruments.s +50 -0
  169. data/lib/burn/workspace_default/asset/music.s +3 -0
  170. data/lib/burn/workspace_default/asset/nes.cfg +83 -0
  171. data/lib/burn/workspace_default/asset/neslib.h +213 -0
  172. data/lib/burn/workspace_default/asset/neslib.s +923 -0
  173. data/lib/burn/workspace_default/asset/runtime.lib +0 -0
  174. data/lib/burn/workspace_default/asset/sounds.s +143 -0
  175. data/lib/burn/workspace_default/asset/test.h +22 -0
  176. data/lib/burn/workspace_default/asset/tileset.chr +0 -0
  177. data/lib/burn/workspace_default/release/js/emulator.html +42 -0
  178. data/lib/burn/workspace_default/release/js/js/dynamicaudio-89ba58da476270a9b630.min.js +1 -0
  179. data/lib/burn/workspace_default/release/js/js/jquery-1.4.2.min.js +154 -0
  180. data/lib/burn/workspace_default/release/js/js/jsnes-4e7a7260aa.js +7149 -0
  181. data/lib/burn/workspace_default/release/js/swf/dynamicaudio.swf +0 -0
  182. data/lib/burn/workspace_default/scripts/compile.bat +30 -0
  183. data/lib/burn/workspace_default/scripts/compile.sh +30 -0
  184. data/lib/burn.rb +11 -0
  185. data/test/helper.rb +8 -0
  186. data/test/runner.rb +2 -0
  187. data/test/test_burn.rb +14 -0
  188. data/test/test_dsl.rb +22 -0
  189. data/test/test_pxes.rb +48 -0
  190. metadata +270 -0
data/lib/burn/cli.rb ADDED
@@ -0,0 +1,187 @@
1
+ module Burn
2
+ class BurnTasks < Thor
3
+ include Thor::Actions
4
+
5
+ def initialize(*args)
6
+ super
7
+ @workspace_root = Dir.getwd
8
+ end
9
+
10
+ def self.source_root
11
+ File.dirname(__FILE__) + "/.."
12
+ end
13
+
14
+ default_task :make
15
+
16
+ desc "make <filename>", "Compile and build application binary from Burn DSL file"
17
+ option :preview, :type => :boolean, :aliases => '-p', :desc => "Preview .out application right after compilation"
18
+ option :debug, :type => :string, :aliases => '-d', :desc => "Debug mode"
19
+ option :verbose, :type => :boolean, :desc => "Print logs as much as possible", :default => false
20
+ option :chrome, :type => :boolean, :aliases => '-c', :desc => "Run emulator on chrome instead of firefox", :default => false
21
+ def make(mainfile=nil)
22
+ mainfile="main.rb" if mainfile.nil?
23
+
24
+ if !File.exist?(mainfile) then
25
+ help
26
+
27
+ else
28
+
29
+ # used a icon from noun project. Thanks Jenny!
30
+ # http://thenounproject.com/term/fire/24187/
31
+ say <<-EOS
32
+
33
+ `.::-`
34
+ :hNMMNNds/.
35
+ :dMMMMMMNdo.
36
+ `oNMMMMMMMNh:
37
+ /NMMMMMMMMNy.
38
+ +MMMMMMMMMMm/
39
+ dMMMMMMMMMMNo
40
+ oMMMMMMMMMMMM+
41
+ +MMMMMMMMMMMMN/
42
+ sMMMMMMMMMMMMMm.
43
+ `mMMMMMMMMMMMMMMs ::`
44
+ /MMMMMMMMMMMMMMMN. `hh/`
45
+ `dMMMMMMMMMMMMMMMMo -NMd/`
46
+ sMMMMMMMMMMMMMMMMMd yMMMh-
47
+ /MMMMMMMMMMMMMMMMMMN. /MMMMN+
48
+ :NMMMMMMMMMMMMMMMMMMM- :MMMMMMo`
49
+ -mMMMMMMMMMMMMMMMMMMMM/ oMMMMMMMo
50
+ .dMMMMMMMMMMMMMMMMMMMMMo .mMMMMMMMN:
51
+ .dMMMMMMMMMMMMMMMMMMMMMMm` .dMMMMMMMMMm`
52
+ `dMMMMMMMMMMMMMMMMMMMMMMMMy.```/mMMMMMMMMMMMo
53
+ `hMMMMMMMMMMMMMMMNNNMMMMMMMMNhhmMMMMMMMMMMMMMm`
54
+ `hMMMMMMMMMMMMMMMN/`-/yNMMMMMMMMMMMMMMMMMMMMMMM:
55
+ `yMMMMMMMMMMMMMMMMMN- .hMMMMMMMMMMMMMMMMMMMMMMy
56
+ sMMMMMMMMMMMMMMMMMMMy sMMMMMMMMMMMMMMMMMMMMMd
57
+ +MMMMMMMMMMMMMMMMMMMMd `hMMMMMMMMMMMMMMMMMMMMN`
58
+ -NMMMMMMMMMMMMMMMMMMMMs .NMMMMMMMMMMMMMMMMMMMM-
59
+ `dMMMMMMMMMMMMMMMMMMMMm. sMMMMMMMMMMMMMMMMMMMM:
60
+ +MMMMMMMMMMMMMMMMMMMMN- -MMMMMMMMMMMMMMMMMMMM.
61
+ `mMMMMMMMMMMMMMMMMMMMm- NMMMN+NMMMMMMMMMMMMN
62
+ /MMMMMMMMMMMMMMMMMMMh. NMMMM--mMMMMMMMMMMMh
63
+ yMMMMMMMMMMMMMMMMMN+` .MMMMM+ -mMMMMMMMMMM+
64
+ `mMMMMMMMMMMMMMMMMh- +MMMMM: /MMMMMMMMMN.
65
+ -MMMMMMMMMMMMMMMN+` yMMMMs hMMMMMMMMy
66
+ :MMMMMMMMMMMMMMd- :hhy:` /MMMMMMMN.
67
+ .NMMMMMMMMMMMMy. `` -MMMMMMMo
68
+ dMMMMMMMMMMMs` .MMMMMMd`
69
+ +MMMMMMMMMMy` :MMMMMN-
70
+ `dMMMMMMMMN. sMMMMN/
71
+ :NMMMMMMMh `mMMMN+
72
+ +MMMMMMMs burn oMMMN+
73
+ +NMMMMMh -NMMm:
74
+ /mMMMMN- v#{VERSION} .dMNy.
75
+ .hNMMMh` .dNh:
76
+ `/mMMMh. -hy:`
77
+ `+mMMm/` `:+.
78
+ `/hNMd+. ``
79
+ .+hNNy/.
80
+ `-/oo:
81
+
82
+
83
+ EOS
84
+ # init
85
+ say "."
86
+ remove_dir "#{@workspace_root}/tmp/burn", :verbose => options[:verbose]
87
+ empty_directory "#{@workspace_root}/tmp/burn", :verbose => options[:verbose]
88
+ directory File.dirname(__FILE__) + "/workspace_default", "#{@workspace_root}/tmp/burn", :verbose => options[:verbose]
89
+
90
+ # compile and build .out
91
+ say ".."
92
+ builder = Builder.new(@workspace_root)
93
+ builder.verbose options[:verbose]
94
+ builder.load File.read("#{@workspace_root}/#{mainfile}")
95
+ builder.generate
96
+
97
+ # Prepare compilers
98
+ say "..."
99
+ env = Burn::Util::Os.new
100
+ directory File.dirname(__FILE__) + "/tools/#{env.os_name}", "#{@workspace_root}/tmp/burn", :verbose => options[:verbose]
101
+
102
+ # Finally compile
103
+ say "...."
104
+ redirect = ""
105
+ if env.is_win? then
106
+ command = ""
107
+ ext = "bat"
108
+ redirect = " > nul" if !options[:verbose]
109
+
110
+ else
111
+ command = "/bin/bash "
112
+ ext = "sh"
113
+ redirect = " > /dev/null" if !options[:verbose]
114
+
115
+ # Set permissions to execute compilers
116
+ Dir::glob("#{@workspace_root}/tmp/burn/cc65/bin/*65").each do |f|
117
+ File.chmod(0777, f)
118
+ end
119
+
120
+ end
121
+ run "#{command}#{@workspace_root}/tmp/burn/scripts/compile.#{ext} #{@workspace_root}/tmp/burn #{redirect}", :verbose => options[:verbose]
122
+
123
+ # prepare customized emulator
124
+ say "....."
125
+ require 'base64'
126
+ File.write(
127
+ "#{@workspace_root}/tmp/burn/release/js/emulator.html",
128
+ File.read(File.dirname(__FILE__)+"/workspace_default/release/js/emulator.html")
129
+ .gsub(/__@__TITLE__@__/, mainfile)
130
+ .gsub(/__@__ROMDATA__@__/,
131
+ Base64::strict_encode64(
132
+ File.binread("#{@workspace_root}/tmp/burn/main.out")
133
+ )
134
+ )
135
+ )
136
+ copy_file "#{@workspace_root}/tmp/burn/main.out", "#{@workspace_root}/tmp/burn/release/js/main.out", :verbose => options[:verbose]
137
+
138
+ say "Burned."
139
+
140
+ # run simulator
141
+ play if options[:preview]
142
+ end
143
+ end
144
+
145
+ desc "server <document_root>", "Run simple http server for emulator. This is mainly used by burn rubygem itself, not by user."
146
+ option :debug, :type => :string, :aliases => '-d', :desc => "Debug mode"
147
+ def server(document_root=nil)
148
+ raise Exception.new("document_root must be specified when you would like to run http server") if document_root.nil?
149
+ server = Burn::Util::Server.new(document_root)
150
+ server.start
151
+ end
152
+
153
+ desc "play <file>", "Invoke application simulator."
154
+ def play(mainfile=nil)
155
+ mainfile="main.out" if mainfile.nil?
156
+ env = Burn::Util::Os.new
157
+
158
+ # boot up webrick httpserver to download emulator script
159
+ command = "ruby " + File.dirname(__FILE__) + "/../../bin/burn server #{@workspace_root}/tmp/burn/release/js/ " + (options[:debug] ? "-d" : "")
160
+ if env.is_win? then
161
+ run "start #{command}", :verbose => options[:verbose]
162
+ else
163
+ run "#{command} &", :verbose => options[:verbose]
164
+ end
165
+
166
+ # open up browser
167
+ uri = "http://127.0.0.1:17890/emulator.html"
168
+ browser = options[:chrome] ? "chrome" : "firefox"
169
+ if env.is_win? then
170
+ run "start #{browser} #{uri}", :verbose => options[:verbose]
171
+ elsif env.is_mac? then
172
+ run "open -a #{browser} #{uri}", :verbose => options[:verbose]
173
+ else
174
+ run "/usr/bin/#{browser} #{uri}", :verbose => options[:verbose]
175
+ end
176
+ end
177
+
178
+ desc "version", "Print version"
179
+ map %w(-v --version) => :version
180
+ def version
181
+ say "burn #{Burn::VERSION}"
182
+ end
183
+
184
+ # desc "release", "To be designed"
185
+
186
+ end
187
+ end
data/lib/burn/debug.rb ADDED
@@ -0,0 +1,25 @@
1
+ module Burn
2
+ module Debug
3
+ class Logger
4
+ @@enabled = false
5
+
6
+ def enabled(flag)
7
+ @@enabled = flag
8
+ end
9
+
10
+ def enabled?
11
+ @@enabled
12
+ end
13
+
14
+ def log(message)
15
+ puts message if @@enabled
16
+ end
17
+ end
18
+
19
+ def log(*messages)
20
+ messages.each do |message|
21
+ Debug::Logger.new.log message
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,105 @@
1
+ module Burn
2
+ module Dsl
3
+ class ChannelStream
4
+ # tempo 193 ~ 211 (18 levels, 202 is median)
5
+ # see: http://ja.wikipedia.org/wiki/%E6%BC%94%E5%A5%8F%E8%A8%98%E5%8F%B7
6
+ TEMPO_BASE = 192
7
+ PRESTO = 1 + TEMPO_BASE
8
+ ALLEGRO = 2 + TEMPO_BASE
9
+ MODERATO = 3 + TEMPO_BASE
10
+ ANDANTE = 4 + TEMPO_BASE
11
+ ADAGIO = 5 + TEMPO_BASE
12
+ LARGO = 6 + TEMPO_BASE
13
+
14
+ # instrument number 64~126 (62steps) *note* no sound for 64, 65~72 seems working right now
15
+ BASS = 65
16
+ PIANO = 66
17
+ STRING = 67
18
+ ARPEGGIO = 68
19
+ STEP = 69
20
+ BELL = 70
21
+ ACOUSTIC = 71
22
+ GUITAR = 72
23
+ THEREMIN = 73
24
+
25
+ def initialize(index, instrument, tempo)
26
+ @index = index
27
+
28
+ @duration_list = [:half, :quarter, :eighth, :sixteenth]
29
+ @duration_numeric_list = {2=>:half, 4=>:quarter, 8=>:eighth, 16=>:sixteenth}
30
+ @duration_symbol_list = [:dotted, :triplet]
31
+ @articulation_list = [:tenuto, :staccato, :accent]
32
+ @instrument_list = [:piano, :bass]
33
+
34
+ @notes = Array.new
35
+ @notes << ChannelStream.const_get(tempo.upcase)
36
+ @notes << ChannelStream.const_get(instrument.upcase)
37
+
38
+ @default_duration = :quarter
39
+ @default_articulation = nil
40
+ @default_pitch = :c0
41
+
42
+ @output_buffer = Array.new
43
+ end
44
+
45
+ def default(*args)
46
+ args.each{ |option|
47
+ if @duration_numeric_list.include?(option) then
48
+ @default_duration = @duration_numeric_list[option]
49
+ elsif @duration_list.include?(option) then
50
+ @default_duration = option
51
+ elsif @articulation_list.include?(option) then
52
+ @default_articulation = option
53
+ end
54
+ }
55
+ end
56
+
57
+ def method_missing(method_symbol, *args, &block)
58
+ case method_symbol
59
+ when :segno then
60
+ @output_buffer << __translate
61
+ @output_buffer << "@chn#{@index.to_s}_segno:"
62
+ @notes = Array.new
63
+ when :dal_segno then
64
+ @output_buffer << __translate
65
+ @output_buffer << " .byte $fe" # end of stream
66
+ @output_buffer << " .word @chn#{@index.to_s}_segno"
67
+ @notes = Array.new
68
+ else
69
+ note = Note.new(@default_duration, method_symbol, @default_articulation)
70
+ args.each{ |option|
71
+ if @duration_numeric_list.include?(option) then
72
+ note.duration = @duration_numeric_list[option]
73
+ elsif @duration_list.include?(option) then
74
+ note.duration = option
75
+ elsif @articulation_list.include?(option) then
76
+ note.articulation = option
77
+ elsif @duration_symbol_list.include?(option) then
78
+ note.duration_symbol = option
79
+ end
80
+ }
81
+ @notes.concat note.generate
82
+ end
83
+ end
84
+
85
+ def load(&block)
86
+ self.instance_eval &block
87
+ end
88
+
89
+ def generate
90
+ if @notes.count>0 then
91
+ @output_buffer << __translate
92
+ end
93
+ @output_buffer.join("\n")
94
+ # " .byte " + @notes.map{|p| "$%02x" % p}.join(",")
95
+ # " .byte $c1,$43,$1d,$80,$1f,$80,$21,$82,$1d,$80,$1d,$80,$1f,$92"
96
+ end
97
+
98
+ private
99
+ def __translate
100
+ " .byte " + @notes.map{|p| "$%02x" % p}.join(",")
101
+ end
102
+
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,42 @@
1
+ module Burn
2
+ module Dsl
3
+ class Declare < DslBase
4
+
5
+ def initialize(resource_name, context)
6
+ super(resource_name, context)
7
+ end
8
+
9
+ def method_missing(method_symbol, *args, &block)
10
+ log :method_symbol=>method_symbol, :args=>args, block=>block
11
+
12
+ proc = Proc.new{|args|
13
+ key=args.shift
14
+ value=args.shift
15
+ if value.is_a?(String) then
16
+ patternizer = Burn::Util::Patternizer.new(value)
17
+
18
+ struct_var = "static sprite_schema #{key}={0, 0, {"
19
+ @pattern_table_index[key.to_sym] = @pattern_table_pointer
20
+ patternizer.patterns.each_with_index do |p, i|
21
+ log p, i, patternizer.height, "aaaaaaaaaaaaaaaaaaa"
22
+ struct_var += sprintf("%d, %d, %#x, 0,", (i % patternizer.width)*8 , (i / (patternizer.patterns.size / patternizer.height) )*8 , @pattern_table_pointer)
23
+ @pattern_tables << p
24
+ @pattern_table_pointer+=1
25
+ end
26
+ struct_var += "128}};"
27
+
28
+ @global.push sprintf(struct_var, "")
29
+
30
+ else
31
+ @global.push "static unsigned char #{key};"
32
+ @code_blocks.push "#{key}="+sprintf("%#x", value)+";"
33
+ log :key=>key, :value=>value.to_s(16), :value_class=>value.class
34
+ end
35
+ }
36
+
37
+ @context.instance_exec [method_symbol.to_s, args[0]], &proc
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,31 @@
1
+ module Burn
2
+ module Dsl
3
+ class DslBase
4
+ # blankslate
5
+ instance_methods.each do |m|
6
+ undef_method m unless m.to_s =~ /object_id|__|method|instance_eval?/
7
+ end
8
+
9
+ include Debug
10
+
11
+ def initialize(resource_name, context)
12
+ @resource_name = resource_name
13
+ @context = context
14
+ end
15
+
16
+ def method_missing(method_symbol, *args, &block)
17
+ log :method_symbol=>method_symbol, :args=>args, :block=>block
18
+ raise Exception.new "Unknown DSL '#{method_symbol}' is used."
19
+
20
+ # # First argument will be block as always
21
+ # args.unshift block
22
+ # if @procs.key? method_symbol then
23
+ # @context.instance_exec args, &@procs[method_symbol]
24
+ # else
25
+ # raise Exception.new "Unknown DSL '#{method_symbol}' is used."
26
+ # end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,36 @@
1
+ module Burn
2
+ module Dsl
3
+ class Music < DslBase
4
+ def initialize(resource_name, context)
5
+ super(resource_name, context)
6
+
7
+ @default_tempo = :allegro
8
+
9
+ if resource_name.nil? then
10
+ raise Exception.new "Resource name for Music class must be provided."
11
+ else
12
+ @resource_name = resource_name
13
+ end
14
+
15
+ @context.instance_exec resource_name, &lambda{|resource_name|
16
+ @resources["#{resource_name}"] = Array.new
17
+ }
18
+
19
+ end
20
+
21
+ def channel(instrument, &block)
22
+ @context.instance_exec(@resource_name,@default_tempo) do |resource_name, default_tempo|
23
+ stream = ChannelStream.new(@resources["#{resource_name}"].count, instrument, default_tempo)
24
+ stream.load(&block)
25
+ @resources["#{resource_name}"] << stream.generate
26
+ #@resources["#{resource_name}"] << " .byte $43,$1d,$80,$1f,$80,$21,$82,$1d,$80,$1d,$80,$1f,$92"
27
+ end
28
+ end
29
+
30
+ def tempo(speed)
31
+ @default_tempo = speed
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,125 @@
1
+ module Burn
2
+ module Dsl
3
+ class Note
4
+ # For music
5
+ # (0..59 are octaves 1-5, 63 note stop)
6
+ C = 0
7
+ D = 2
8
+ E = 4
9
+ F = 5
10
+ G = 7
11
+ A = 9
12
+ B = 11
13
+
14
+ CS = 11
15
+ DS = 1
16
+ ES = 3
17
+ FS = 4
18
+ GS = 6
19
+ AS = 8
20
+ BS = 10
21
+
22
+ REST = -1
23
+
24
+
25
+ # Empty Rows 128~191 (63steps)
26
+ DURATION_BASE = 127
27
+ SIXTEENTH = 4 + DURATION_BASE
28
+ EIGHTH = 10 + DURATION_BASE
29
+ QUARTER = 22 + DURATION_BASE
30
+ HALF = 46 + DURATION_BASE
31
+ DOTTED_SIXTEENTH = 7 + DURATION_BASE
32
+ DOTTED_EIGHTH = 16 + DURATION_BASE
33
+ DOTTED_QUARTER = 34 + DURATION_BASE
34
+ DOTTED_HALF = 70 + DURATION_BASE
35
+ TRIPLET_SIXTEENTH = 1 + DURATION_BASE
36
+ TRIPLET_EIGHTH = 4 + DURATION_BASE
37
+ TRIPLET_QUARTER = 10 + DURATION_BASE
38
+ TRIPLET_HALF = 22 + DURATION_BASE
39
+
40
+ TENUTO = 1.0
41
+ ACCENT = 0.7
42
+ STACCATO = 0.2
43
+
44
+ attr_accessor :duration, :articulation, :duration_symbol
45
+
46
+ def initialize(duration=:quarter, pitch=:c0, articulation=nil, duration_symbol=nil)
47
+ @pitch_list = {c:C, bsharp:C,
48
+ ds:DS, dflat:DS, csharp:DS,
49
+ d:D,
50
+ es:ES, eflat:ES, dsharp:DS,
51
+ e:E, fs:FS, fflat:FS,
52
+ f:F, esharp:F,
53
+ gs:GS, gflat:GS, fsharp:GS,
54
+ g:G,
55
+ as:AS, aflat:AS, gsharp:AS,
56
+ a:A,
57
+ bs:BS, bflat:BS, asharp:BS,
58
+ b:B, cs:CS, cflat:CS,
59
+ rest:REST,
60
+ }
61
+
62
+ # Fix pitch first at this early timing
63
+ if !pitch.to_s.match(/(.+)(\d)/).nil? then
64
+ raise Exception.new "pitch #{pitch.to_s} is not defined." if !@pitch_list.keys.include?(Regexp.last_match(1).to_sym)
65
+ @pitch = @pitch_list[Regexp.last_match(1).to_sym]
66
+ if Regexp.last_match(2).to_i <= 4 then
67
+ @octave = Regexp.last_match(2).to_i
68
+ else
69
+ raise Exception.new "Sorry only 0-4 octave range is supported."
70
+ end
71
+ else
72
+ raise Exception.new "pitch #{pitch.to_s} is not defined." if !@pitch_list.keys.include?(pitch)
73
+ @pitch = @pitch_list[pitch]
74
+ @octave = 0
75
+ end
76
+
77
+ @duration = duration
78
+ @articulation = articulation
79
+ @duration_symbol = duration_symbol
80
+ end
81
+
82
+ def generate
83
+ duration = get_actual_duration
84
+
85
+ result = Array.new
86
+ if @pitch==REST then
87
+ @articuulation = 0
88
+ else
89
+ result << @pitch + 12 * @octave
90
+ end
91
+
92
+ articulation = Note.const_get(@articulation.upcase) if !@articulation.nil?
93
+ if articulation.nil? then
94
+ result << duration
95
+ result << 63 # note stop
96
+ elsif articulation == TENUTO then
97
+ result << duration + 1
98
+ else
99
+ if (len(duration)*articulation).ceil > 0 then
100
+ result << DURATION_BASE + (len(duration)*articulation).ceil
101
+ result << 63 # note stop
102
+ end
103
+ if (len(duration)*(1.0 - articulation)).floor > 0 then
104
+ result << DURATION_BASE + (len(duration)*(1.0-articulation)).floor
105
+ end
106
+ end
107
+ result
108
+ end
109
+
110
+ private
111
+ def len(duration)
112
+ duration - DURATION_BASE
113
+ end
114
+
115
+ def get_actual_duration
116
+ if !@duration_symbol.nil? then
117
+ Note.const_get(@duration_symbol.upcase.to_s + "_" + @duration.upcase.to_s)
118
+ else
119
+ Note.const_get(@duration.upcase.to_s)
120
+ end
121
+ end
122
+
123
+ end
124
+ end
125
+ end