ramekin 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +4 -6
- data/gembin/ramekin +5 -0
- data/lib/ramekin/amk_runner.rb +6 -4
- data/lib/ramekin/channel_separator.rb +5 -4
- data/lib/ramekin/cli.rb +8 -7
- data/lib/ramekin/legato.rb +9 -3
- data/lib/ramekin/meta.rb +4 -2
- data/lib/ramekin/note_aggregator.rb +7 -3
- data/lib/ramekin/renderer.rb +4 -8
- data/lib/ramekin/sample_pack.rb +1 -0
- data/lib/ramekin/tokenizer.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71e89ff9027d3342649de107de02ed46c622a95a9940fe94bb0ece781ac18790
|
4
|
+
data.tar.gz: 1d3b3a89ab873ab15e55a000912791ee7c232a53d462377803fdd8f9ef80e4e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e716543bbac8f7ae0fa72e5504fd3fad883b283b4adc3085f0de7bb5220bf1533dac433af06527d949a8acdb46a25beffa20334cf72bbb208ff2d2408a225fd1
|
7
|
+
data.tar.gz: 1cc81d357db65d9be8e5f54677ff3117c336656e1ee40ee53183b49f7ceee9c483d05cafdd190bc783dcc65d687af098f80ee7e54378c6c48eb2d62ebbbc64b7
|
data/README.md
CHANGED
@@ -53,9 +53,7 @@ ramekin compile -i filename.rmk [flags]
|
|
53
53
|
output amk txt to this file.
|
54
54
|
use a single dash (-) to print txt to stdout.
|
55
55
|
--spc filename.spc
|
56
|
-
attempt to invoke AddmusicK to output an SPC
|
57
|
-
requires ADDMUSICK_DIR and ASAR_COMMAND
|
58
|
-
to be set.
|
56
|
+
attempt to invoke AddmusicK to output an SPC.
|
59
57
|
--play
|
60
58
|
play the generated SPC file. will automatically
|
61
59
|
set up an SPC player if none is detected.
|
@@ -67,14 +65,14 @@ ramekin compile -i filename.rmk [flags]
|
|
67
65
|
(non-windows only)
|
68
66
|
render N seconds of the file to WAV.
|
69
67
|
|
70
|
-
ramekin
|
68
|
+
ramekin pack [flags]
|
71
69
|
flags:
|
72
70
|
--update
|
73
|
-
download BRR
|
71
|
+
download BRR packs from SMW Central.
|
74
72
|
--search [text]
|
75
73
|
search for BRR filenames.
|
76
74
|
--list [text]
|
77
|
-
list all samples in
|
75
|
+
list all samples in packs matching [text].
|
78
76
|
|
79
77
|
ramekin setup [flags]
|
80
78
|
flags:
|
data/gembin/ramekin
CHANGED
@@ -10,6 +10,11 @@ RAMEKIN_ASAR_DIR = './asar'
|
|
10
10
|
RAMEKIN_SPC_PLAYER = '__auto__'
|
11
11
|
RAMEKIN_VERSION = Gem.loaded_specs['ramekin'].version.to_s
|
12
12
|
|
13
|
+
if ENV['RAMEKIN_DEBUG'] == '1'
|
14
|
+
require 'pry'
|
15
|
+
require 'pry-stack_explorer'
|
16
|
+
end
|
17
|
+
|
13
18
|
require_relative '../lib/ramekin'
|
14
19
|
require_relative '../lib/ramekin/cli'
|
15
20
|
|
data/lib/ramekin/amk_runner.rb
CHANGED
@@ -49,7 +49,7 @@ module Ramekin
|
|
49
49
|
ln("#@amk_path/samples/optimized", "#@workdir/samples/optimized")
|
50
50
|
ln("#@amk_path/samples/EMPTY.brr", "#@workdir/samples/EMPTY.brr")
|
51
51
|
if @meta.instruments.any?
|
52
|
-
sample_dir = "#@workdir/samples/#{basename}"
|
52
|
+
sample_dir = "#@workdir/samples/#{@meta.sample_path || basename}"
|
53
53
|
FileUtils.mkdir_p(sample_dir)
|
54
54
|
|
55
55
|
@meta.instruments.each do |inst|
|
@@ -80,9 +80,11 @@ module Ramekin
|
|
80
80
|
FileUtils.cp("#@workdir/Visualizations/#{basename}.png", "./#{basename}.png")
|
81
81
|
File.write("./#{basename}.txt", @txt)
|
82
82
|
|
83
|
-
|
84
|
-
|
85
|
-
|
83
|
+
if @meta.instruments.any?
|
84
|
+
FileUtils.mkdir_p("samples/#{basename}")
|
85
|
+
@meta.instruments.each do |inst|
|
86
|
+
FileUtils.cp(inst.sample_path, "./samples/#{basename}/#{inst.sample_name}")
|
87
|
+
end
|
86
88
|
end
|
87
89
|
|
88
90
|
packs = @meta.instruments.map(&:pack).uniq
|
@@ -1,11 +1,12 @@
|
|
1
1
|
module Ramekin
|
2
2
|
class ChannelSeparator
|
3
|
-
def self.parse(stream)
|
4
|
-
new.tap { |x| x.parse(stream) }
|
3
|
+
def self.parse(stream, *a)
|
4
|
+
new(*a).tap { |x| x.parse(stream) }
|
5
5
|
end
|
6
6
|
|
7
7
|
attr_reader :preamble, :channels, :meta
|
8
|
-
def initialize
|
8
|
+
def initialize(sample_path=nil)
|
9
|
+
@sample_path = sample_path
|
9
10
|
@preamble = []
|
10
11
|
@channels = []
|
11
12
|
|
@@ -19,7 +20,7 @@ module Ramekin
|
|
19
20
|
def parse(stream)
|
20
21
|
stream.each do |el|
|
21
22
|
if Token === el && el.type == :channel
|
22
|
-
@meta = Meta.new(@preamble.dup).tap(&:parse) if preamble?
|
23
|
+
@meta = Meta.new(@preamble.dup, @sample_path).tap(&:parse) if preamble?
|
23
24
|
@meta.parse
|
24
25
|
|
25
26
|
@current = (@channels[el.value.to_i] ||= [])
|
data/lib/ramekin/cli.rb
CHANGED
@@ -32,9 +32,7 @@ module Ramekin
|
|
32
32
|
$stderr.puts " output amk txt to this file."
|
33
33
|
$stderr.puts " use a single dash (-) to print txt to stdout."
|
34
34
|
$stderr.puts " --spc filename.spc"
|
35
|
-
$stderr.puts " attempt to invoke AddmusicK to output an SPC"
|
36
|
-
$stderr.puts " requires ADDMUSICK_DIR and ASAR_COMMAND"
|
37
|
-
$stderr.puts " to be set."
|
35
|
+
$stderr.puts " attempt to invoke AddmusicK to output an SPC."
|
38
36
|
$stderr.puts " --play"
|
39
37
|
$stderr.puts " play the generated SPC file. will automatically"
|
40
38
|
$stderr.puts " set up an SPC player if none is detected."
|
@@ -54,13 +52,14 @@ module Ramekin
|
|
54
52
|
end
|
55
53
|
$stderr.puts ""
|
56
54
|
$stderr.puts "ramekin package [flags]"
|
55
|
+
$stderr.puts "ramekin pack [flags]"
|
57
56
|
$stderr.puts " flags:"
|
58
57
|
$stderr.puts " --update"
|
59
|
-
$stderr.puts " download BRR
|
58
|
+
$stderr.puts " download BRR packs from SMW Central."
|
60
59
|
$stderr.puts " --search [text]"
|
61
60
|
$stderr.puts " search for BRR filenames."
|
62
61
|
$stderr.puts " --list [text]"
|
63
|
-
$stderr.puts " list all samples in
|
62
|
+
$stderr.puts " list all samples in packs matching [text]."
|
64
63
|
$stderr.puts ""
|
65
64
|
$stderr.puts "ramekin setup [flags]"
|
66
65
|
$stderr.puts " flags:"
|
@@ -107,6 +106,8 @@ module Ramekin
|
|
107
106
|
when '--help', '-help', '-h', '-?'
|
108
107
|
usage
|
109
108
|
return 0
|
109
|
+
when '--sample-path'
|
110
|
+
@sample_path = argv.shift or usage! 'missing path for --sample-path'
|
110
111
|
when '--txt'
|
111
112
|
@output_txt = argv.shift or usage! 'missing filename after --txt'
|
112
113
|
when '--spc'
|
@@ -170,7 +171,7 @@ module Ramekin
|
|
170
171
|
|
171
172
|
expanded = outer_chain.call(tokens)
|
172
173
|
|
173
|
-
channels = ChannelSeparator.parse(expanded)
|
174
|
+
channels = ChannelSeparator.parse(expanded, @sample_path)
|
174
175
|
|
175
176
|
inner_chain = Processor.compose(
|
176
177
|
NoteAggregator,
|
@@ -367,7 +368,7 @@ module Ramekin
|
|
367
368
|
case argv[0]
|
368
369
|
when 'compile'
|
369
370
|
compile(*argv[1..])
|
370
|
-
when 'package'
|
371
|
+
when 'package', 'pack'
|
371
372
|
package(*argv[1..])
|
372
373
|
when 'setup'
|
373
374
|
setup(*argv[1..])
|
data/lib/ramekin/legato.rb
CHANGED
@@ -29,13 +29,19 @@ module Ramekin
|
|
29
29
|
|
30
30
|
class LegatoLastNote < NoteWrapper
|
31
31
|
def ticks
|
32
|
-
@note.ticks
|
32
|
+
@note.ticks
|
33
33
|
end
|
34
34
|
|
35
35
|
def to_amk(current_octave=nil, divisor=1)
|
36
|
-
post_ticks = @note.ticks -
|
36
|
+
post_ticks = @note.ticks - divisor
|
37
|
+
if post_ticks <= 0 || post_ticks % divisor != 0
|
38
|
+
return error! "too fast for legato: must have at least #{divisor*2} ticks at this bpm.", el: self
|
39
|
+
end
|
40
|
+
|
41
|
+
post_ticks /= divisor
|
42
|
+
|
37
43
|
post_len = KNOWN_LENGTHS.fetch(post_ticks) { "=#{post_ticks}" }
|
38
|
-
"#{octave_amk(current_octave)}#{note_name}
|
44
|
+
"#{octave_amk(current_octave)}#{note_name}=1$f4$01^#{post_len}"
|
39
45
|
end
|
40
46
|
|
41
47
|
def inspect
|
data/lib/ramekin/meta.rb
CHANGED
@@ -14,10 +14,12 @@ module Ramekin
|
|
14
14
|
attr_reader :volume
|
15
15
|
attr_reader :tempo
|
16
16
|
attr_reader :echo
|
17
|
-
|
17
|
+
attr_reader :sample_path
|
18
|
+
def initialize(elements, sample_path=nil)
|
18
19
|
@elements = elements
|
19
20
|
@instruments = []
|
20
21
|
@sample_groups = []
|
22
|
+
@sample_path = sample_path
|
21
23
|
@options = {}
|
22
24
|
end
|
23
25
|
|
@@ -298,7 +300,7 @@ module Ramekin
|
|
298
300
|
|
299
301
|
def pack_hexes
|
300
302
|
# TODO: alts
|
301
|
-
@pack_hexes ||= @pack.tunings_for(
|
303
|
+
@pack_hexes ||= @pack.tunings_for(@path.value).first
|
302
304
|
end
|
303
305
|
|
304
306
|
def pack_gain
|
@@ -57,15 +57,19 @@ module Ramekin
|
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
-
def
|
61
|
-
if
|
60
|
+
def check_length!(t, div)
|
61
|
+
if t % div != 0
|
62
62
|
divisible = div == 2 ? 'even' : "divisible by #{div}"
|
63
63
|
error!("too fast! tick count must be #{divisible} at this tempo", el: self)
|
64
64
|
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def length_amk(div)
|
68
|
+
check_length!(ticks, div)
|
65
69
|
|
66
70
|
t = ticks / div
|
67
71
|
# we use l16
|
68
|
-
return '' if t == 12
|
72
|
+
# return '' if t == 12
|
69
73
|
KNOWN_LENGTHS.fetch(t) { "=#{t}" }
|
70
74
|
end
|
71
75
|
|
data/lib/ramekin/renderer.rb
CHANGED
@@ -77,7 +77,7 @@ module Ramekin
|
|
77
77
|
yield "#amk #{@track.meta.amk&.value || 2}\n\n"
|
78
78
|
|
79
79
|
if m.instruments.any?
|
80
|
-
yield "#path #{@filename.chomp('.rmk').inspect}\n"
|
80
|
+
yield "#path #{(m.sample_path || @filename.chomp('.rmk')).inspect}\n"
|
81
81
|
yield "#samples {\n"
|
82
82
|
if m.sample_groups.empty?
|
83
83
|
yield " #default"
|
@@ -239,6 +239,8 @@ module Ramekin
|
|
239
239
|
else
|
240
240
|
yield "p#{token.value} "
|
241
241
|
end
|
242
|
+
when :n
|
243
|
+
yield "n#{token.value}"
|
242
244
|
when :superloop
|
243
245
|
yield " [[ "
|
244
246
|
when :loop
|
@@ -295,13 +297,7 @@ module Ramekin
|
|
295
297
|
|
296
298
|
ticks = sprintf("%02x", note.ticks)
|
297
299
|
yield "$dd$#{ticks}$#{ticks}#{note.octave_amk}#{note.note.value}"
|
298
|
-
|
299
|
-
case peek
|
300
|
-
when NoteEvent
|
301
|
-
peek.extensions.concat(note.extensions)
|
302
|
-
else
|
303
|
-
yield "^=#{note.ticks}"
|
304
|
-
end
|
300
|
+
yield "^=#{note.ticks}"
|
305
301
|
|
306
302
|
@octave = note.octave
|
307
303
|
when 'legato'
|
data/lib/ramekin/sample_pack.rb
CHANGED
data/lib/ramekin/tokenizer.rb
CHANGED
@@ -258,7 +258,7 @@ module Ramekin
|
|
258
258
|
return [:l, m(1)] if match /l(\d+)/
|
259
259
|
return [:amp] if match /[&]/
|
260
260
|
return [:q, m(1)] if match /q(\d(?:,\h)?)/
|
261
|
-
return [:n, m(1)] if match /n(\h\h
|
261
|
+
return [:n, m(1)] if match /n(\h\h)/
|
262
262
|
|
263
263
|
error! "unknown token near: #{@scanner.peek(10)}", el: @last_token
|
264
264
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ramekin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jneen
|
8
8
|
autorequire:
|
9
9
|
bindir: gembin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-
|
11
|
+
date: 2025-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: strscan
|