guitar_pro_parser 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +72 -0
- data/Rakefile +7 -0
- data/guitar_pro_parser.gemspec +25 -0
- data/lib/guitar_pro_parser/bar.rb +29 -0
- data/lib/guitar_pro_parser/bar_settings.rb +74 -0
- data/lib/guitar_pro_parser/beat.rb +42 -0
- data/lib/guitar_pro_parser/channel.rb +25 -0
- data/lib/guitar_pro_parser/chord_diagram.rb +14 -0
- data/lib/guitar_pro_parser/guitar_pro_helper.rb +73 -0
- data/lib/guitar_pro_parser/io/input_stream.rb +110 -0
- data/lib/guitar_pro_parser/io/reader.rb +759 -0
- data/lib/guitar_pro_parser/note.rb +71 -0
- data/lib/guitar_pro_parser/page_setup.rb +34 -0
- data/lib/guitar_pro_parser/song.rb +113 -0
- data/lib/guitar_pro_parser/track.rb +125 -0
- data/lib/guitar_pro_parser/version.rb +3 -0
- data/lib/guitar_pro_parser.rb +25 -0
- data/spec/lib/guitar_pro_parser/bar_settings_spec.rb +176 -0
- data/spec/lib/guitar_pro_parser/beat_spec.rb +79 -0
- data/spec/lib/guitar_pro_parser/channel_spec.rb +44 -0
- data/spec/lib/guitar_pro_parser/guitar_pro_helper_spec.rb +11 -0
- data/spec/lib/guitar_pro_parser/io/input_stream_spec.rb +101 -0
- data/spec/lib/guitar_pro_parser/note_spec.rb +55 -0
- data/spec/lib/guitar_pro_parser/page_setup_spec.rb +26 -0
- data/spec/lib/guitar_pro_parser/song_spec.rb +121 -0
- data/spec/lib/guitar_pro_parser/track_spec.rb +211 -0
- data/spec/lib/guitar_pro_parser_spec.rb +51 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/tabs/tab.gp4 +0 -0
- data/spec/tabs/tab.gp5 +0 -0
- data/spec/tabs/test_musical_directions.gp5 +0 -0
- metadata +144 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
module GuitarProParser
|
2
|
+
|
3
|
+
class Note
|
4
|
+
|
5
|
+
attr_accessor :type,
|
6
|
+
:time_independent_duration,
|
7
|
+
:accentuated,
|
8
|
+
:ghost,
|
9
|
+
:dynamic,
|
10
|
+
:fret,
|
11
|
+
:fingers,
|
12
|
+
:vibrato,
|
13
|
+
:grace,
|
14
|
+
:let_ring,
|
15
|
+
:hammer_or_pull,
|
16
|
+
:trill,
|
17
|
+
:bend,
|
18
|
+
:staccato,
|
19
|
+
:palm_mute,
|
20
|
+
:harmonic,
|
21
|
+
:tremolo,
|
22
|
+
:slide
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
@type = :normal
|
26
|
+
@time_independent_duration = false
|
27
|
+
@accentuated = false
|
28
|
+
@ghost = false
|
29
|
+
@dynamic = 'f'
|
30
|
+
@fret = 0
|
31
|
+
@fingers = { left: nil, right: nil }
|
32
|
+
|
33
|
+
@vibrato = false
|
34
|
+
@grace = nil
|
35
|
+
@let_ring = false
|
36
|
+
@hammer_or_pull = false
|
37
|
+
@trill = nil
|
38
|
+
@bend = nil
|
39
|
+
@staccato = false
|
40
|
+
@palm_mute = false
|
41
|
+
@harmonic = nil
|
42
|
+
@tremolo = nil
|
43
|
+
@slide = nil
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_left_hand_finger(finger)
|
47
|
+
@fingers[:left] = finger
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_right_hand_finger(finger)
|
51
|
+
@fingers[:right] = finger
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_grace(fret, dynamic, transition, duration, dead, position)
|
55
|
+
@grace = { fret: fret, dynamic: dynamic, transition: transition, duration: duration, dead: dead, position: position }
|
56
|
+
end
|
57
|
+
|
58
|
+
def add_tremolo(speed)
|
59
|
+
@tremolo = { speed: speed }
|
60
|
+
end
|
61
|
+
|
62
|
+
def add_harmonic(type)
|
63
|
+
@harmonic = { type: type }
|
64
|
+
end
|
65
|
+
|
66
|
+
def add_trill(fret, period)
|
67
|
+
@trill = { fret: fret, period: period }
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module GuitarProParser
|
2
|
+
|
3
|
+
class PageSetup
|
4
|
+
|
5
|
+
attr_accessor :page_format_length, :page_format_width, :left_margin, :right_margin, :top_margin, :bottom_margin, :score_size,
|
6
|
+
:title, :subtitle, :artist, :album, :lyrics_author, :music_author, :lyrics_and_music_author,
|
7
|
+
:copyright_line_1, :copyright_line_2, :page_number, :displayed_fields
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@page_format_length = 0
|
11
|
+
@page_format_width = 0
|
12
|
+
@left_margin = 0
|
13
|
+
@right_margin = 0
|
14
|
+
@top_margin = 0
|
15
|
+
@bottom_margin = 0
|
16
|
+
@score_size = 0
|
17
|
+
|
18
|
+
@title = ''
|
19
|
+
@subtitle = ''
|
20
|
+
@artist = ''
|
21
|
+
@album = ''
|
22
|
+
@lyrics_author = ''
|
23
|
+
@music_author = ''
|
24
|
+
@lyrics_and_music_author = ''
|
25
|
+
@copyright_line_1 = ''
|
26
|
+
@copyright_line_2 = ''
|
27
|
+
@page_number = ''
|
28
|
+
|
29
|
+
@displayed_fields = []
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'guitar_pro_parser/io/reader'
|
2
|
+
|
3
|
+
module GuitarProParser
|
4
|
+
|
5
|
+
# This class represents the content of Guitar Pro file.
|
6
|
+
# It can be initialized by path to .gp[3,4,5] file. The it will automatically parse its data.
|
7
|
+
# Or it can be just instantiated with default values of the attributes.
|
8
|
+
#
|
9
|
+
# == Attributes
|
10
|
+
#
|
11
|
+
#
|
12
|
+
# * +version+ (float) Version of Guitar Pro
|
13
|
+
# * +title+ (string)
|
14
|
+
# * +subtitle+ (string)
|
15
|
+
# * +artist+ (string)
|
16
|
+
# * +album+ (string)
|
17
|
+
# * +lyricist+ (string) Author of lyrics (>= 5.0 only)
|
18
|
+
# * +composer+ (string) Author of music
|
19
|
+
# * +copyright+ (string)
|
20
|
+
# * +transcriber+ (string) Author of tabulature
|
21
|
+
# * +instructions+ (string)
|
22
|
+
# * +notices+ (array) Array of notices (each notice is a string)
|
23
|
+
# * +triplet_feel+ (boolean) Shuffle rhythm feel (< 5.0 only)
|
24
|
+
# * +lyrics_track+ (integer) Associated track for the lyrics (>= 4.0 only)
|
25
|
+
# * +lyrics+ (array) Lyrics data represented as array of hashes with 5 elements
|
26
|
+
# (for lyrics lines from 1 to 5). Each line has lyrics' text
|
27
|
+
# and number of bar where it starts: {text: "Some text", bar: 1}
|
28
|
+
# (>= 4.0 only)
|
29
|
+
# * +master_volume+ (integer) Master volume (value from 0 - 200, default is 100) (>= 5.0 only)
|
30
|
+
# * +equalizer+ (array) Array of equalizer settings.
|
31
|
+
# Each one is represented as number of increments of .1dB the volume for
|
32
|
+
# 32Hz band is lowered
|
33
|
+
# 60Hz band is lowered
|
34
|
+
# 125Hz band is lowered
|
35
|
+
# 250Hz band is lowered
|
36
|
+
# 500Hz band is lowered
|
37
|
+
# 1KHz band is lowered
|
38
|
+
# 2KHz band is lowered
|
39
|
+
# 4KHz band is lowered
|
40
|
+
# 8KHz band is lowered
|
41
|
+
# 16KHz band is lowered
|
42
|
+
# overall volume is lowered (gain)
|
43
|
+
# * +page_setup+ (object) Object of PageSetup class that contains data about page setup (>= 5.0 only)
|
44
|
+
# * +tempo+ (string) Tempo as string
|
45
|
+
# * +bpm+ (integer) Tempo as beats per minute
|
46
|
+
# * +key+ (integer) #TODO: convert digit to something readable (has different format for GP3 and GP4/5)
|
47
|
+
# * +octave+ (integer) (>= 4.0 only)
|
48
|
+
# * +channels+ (array) Table of midi channels. There are 4 ports and 16 channels, the channels are stored in this order:
|
49
|
+
# port1/channel1 - port1/channel2 ... port1/channel16 - port2/channel1 ...
|
50
|
+
# * +musical_directions+ (hash) Hash of musical directions definitions.
|
51
|
+
# Each symbol is represented as the bar number at which it is placed.
|
52
|
+
# If the symbol is not presented its value is nil.
|
53
|
+
# There is full list of supported symbols in GuitarProHelper::MUSICAL_DIRECTIONS array (>= 5.0 only)
|
54
|
+
# * +master_reverb+ (integer) Selected master reverb setting (in Score information, value from 0 to 60) (>= 5.0 only) #TODO represent as names
|
55
|
+
# * +bars_settings+ (array) Array of settings of bars. Doesn't represent bars as containers for notes (look at Bar class for it)
|
56
|
+
# * +tracks+ (array) Array of tracks
|
57
|
+
#
|
58
|
+
class Song
|
59
|
+
|
60
|
+
include GuitarProHelper
|
61
|
+
|
62
|
+
attr_accessor :version, :title, :subtitle, :artist, :album, :lyricist, :composer, :copyright,
|
63
|
+
:transcriber, :instructions, :notices, :triplet_feel, :lyrics_track, :lyrics,
|
64
|
+
:master_volume, :equalizer, :page_setup, :tempo, :bpm, :key, :octave, :channels,
|
65
|
+
:musical_directions, :master_reverb, :bars_settings, :tracks
|
66
|
+
|
67
|
+
def initialize(file_path = nil, headers_only = false)
|
68
|
+
# Initialize variables by default values
|
69
|
+
@title = ''
|
70
|
+
@title = ''
|
71
|
+
@subtitle = ''
|
72
|
+
@artist = ''
|
73
|
+
@album = ''
|
74
|
+
@lyricist = ''
|
75
|
+
@composer = ''
|
76
|
+
@copyright = ''
|
77
|
+
@transcriber = ''
|
78
|
+
@instructions = ''
|
79
|
+
@notices = ''
|
80
|
+
@triplet_feel = :no_triplet_feel
|
81
|
+
@lyrics_track = 0
|
82
|
+
@lyrics = []
|
83
|
+
@master_volume = 100
|
84
|
+
@equalizer = Array.new(11, 0)
|
85
|
+
@page_setup = PageSetup.new
|
86
|
+
@tempo = 'Moderate'
|
87
|
+
@bpm = 120
|
88
|
+
@key = 1
|
89
|
+
@octave = 0
|
90
|
+
@channels = []
|
91
|
+
@musical_directions = Hash[GuitarProHelper::MUSICAL_DIRECTIONS.collect { |elem| [elem, nil] }]
|
92
|
+
@master_reverb = 0
|
93
|
+
|
94
|
+
@bars_settings = []
|
95
|
+
@tracks = []
|
96
|
+
|
97
|
+
# Read data from file
|
98
|
+
Reader.new(self, file_path, headers_only) unless file_path.nil?
|
99
|
+
end
|
100
|
+
|
101
|
+
def add_bar_settings
|
102
|
+
@bars_settings << BarSettings.new
|
103
|
+
@bars_settings.last
|
104
|
+
end
|
105
|
+
|
106
|
+
def add_track
|
107
|
+
@tracks << Track.new
|
108
|
+
@tracks.last
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
module GuitarProParser
|
2
|
+
|
3
|
+
# This class represents tracks.
|
4
|
+
# Beside track's settings (see attributes) it contain bars (@bars attribute) that contain beats and notes.
|
5
|
+
#
|
6
|
+
# == Attributes
|
7
|
+
#
|
8
|
+
# * +drums+ (boolean) Drums track
|
9
|
+
# * +twelve_stringed_guitar+ (boolean) 12 stringed guitar track
|
10
|
+
# * +banjo+ (boolean) Banjo track
|
11
|
+
# * +solo_playback+ (boolean) Marked for solo playback (> 5.0 only)
|
12
|
+
# * +mute_playback+ (boolean) Marked for mute playback (> 5.0 only)
|
13
|
+
# * +rse_playback+ (boolean) Use RSE playback (track instrument option) (> 5.0 only)
|
14
|
+
# * +indicate_tuning+ (boolean) Indicate tuning on the score (track properties) (> 5.0 only)
|
15
|
+
# * +name+ (string) Track name
|
16
|
+
# * +strings+ (array) Array of MIDI notes each string plays open. E.g. [E5, B4, G4, D4, A3, E3] for standart tuning
|
17
|
+
# * +midi_port+ (integer) MIDI port used
|
18
|
+
# * +midi_channel+ (integer) MIDI channel used (must be 10 if this is a drum track)
|
19
|
+
# * +midi_channel_for_effects+ (integer) MIDI channel used for effects
|
20
|
+
# * +frets_count+ (integer) Number of frets used for this instrument
|
21
|
+
# * +capo+ (integer) The fret number at which a capo is placed (0 for no capo)
|
22
|
+
# * +color+ (array) Track color (RGB intensities). E.g. [255, 0, 0] for red.
|
23
|
+
# * +diagrams_below_the_standard_notation+ (boolean) Diagrams/chords below the standard notation (> 5.0 only)
|
24
|
+
# * +show_rythm_with_tab+ (boolean) Show rhythm with tab (> 5.0 only)
|
25
|
+
# * +force_horizontal_beams+ (boolean) Force horizontal beams (> 5.0 only)
|
26
|
+
# * +force_channels_11_to_16+ (boolean) Force channels 11 to 16 (> 5.0 only)
|
27
|
+
# * +diagrams_list_on_top_of_score+ (boolean) Diagrams list on top of the score (> 5.0 only)
|
28
|
+
# * +diagrams_in_the_score+ (boolean) Diagrams in the score (> 5.0 only)
|
29
|
+
# * +auto_let_ring+ (boolean) Auto-Let Ring (> 5.0 only)
|
30
|
+
# * +auto_brush+ (boolean) Auto Brush (> 5.0 only)
|
31
|
+
# * +extend_rhytmic_inside_the_tab+ (boolean) Extend rhythmic inside the tab (> 5.0 only)
|
32
|
+
# * +midi_bank+ (integer) MIDI bank (> 5.0 only)
|
33
|
+
# * +human_playing+ (integer) Human playing in percents (track instrument options) (> 5.0 only)
|
34
|
+
# * +auto_accentuation+ (integer) Auto-Accentuation on the Beat (track instrument options) (> 5.0 only) # TODO Not sure that it works
|
35
|
+
# * +sound_bank+ (integer) Selected sound bank (track instrument options) (> 5.0 only)
|
36
|
+
# * +equalizer+ (array) Equalizer setup. Represented as array with this values:
|
37
|
+
# number of increments of .1dB the volume for the low frequency band is lowered
|
38
|
+
# number of increments of .1dB the volume for the mid frequency band is lowered
|
39
|
+
# number of increments of .1dB the volume for the high frequency band is lowered
|
40
|
+
# number of increments of .1dB the volume for all frequencies is lowered (gain)
|
41
|
+
# (> 5.0 only)
|
42
|
+
# * +instrument_effect_1+ (string) Track instrument effect 1 (> 5.0 only)
|
43
|
+
# * +instrument_effect_2+ (string) Track instrument effect 2 (> 5.0 only)
|
44
|
+
# * +bars+ (array) Bars of this track
|
45
|
+
#
|
46
|
+
class Track
|
47
|
+
|
48
|
+
attr_accessor :drums,
|
49
|
+
:twelve_stringed_guitar,
|
50
|
+
:banjo,
|
51
|
+
:solo_playback,
|
52
|
+
:mute_playback,
|
53
|
+
:rse_playback,
|
54
|
+
:indicate_tuning,
|
55
|
+
:name,
|
56
|
+
:strings,
|
57
|
+
:midi_port,
|
58
|
+
:midi_channel,
|
59
|
+
:midi_channel_for_effects,
|
60
|
+
:frets_count,
|
61
|
+
:capo,
|
62
|
+
:color,
|
63
|
+
:diagrams_below_the_standard_notation,
|
64
|
+
:show_rythm_with_tab,
|
65
|
+
:force_horizontal_beams,
|
66
|
+
:force_channels_11_to_16,
|
67
|
+
:diagrams_list_on_top_of_score,
|
68
|
+
:diagrams_in_the_score,
|
69
|
+
:auto_let_ring,
|
70
|
+
:auto_brush,
|
71
|
+
:extend_rhytmic_inside_the_tab,
|
72
|
+
:midi_bank,
|
73
|
+
:human_playing,
|
74
|
+
:auto_accentuation,
|
75
|
+
:sound_bank,
|
76
|
+
:equalizer,
|
77
|
+
:instrument_effect_1,
|
78
|
+
:instrument_effect_2,
|
79
|
+
:bars
|
80
|
+
|
81
|
+
def initialize
|
82
|
+
# Initialize attributes by default values
|
83
|
+
@drums = false
|
84
|
+
@twelve_stringed_guitar = false
|
85
|
+
@banjo = false
|
86
|
+
@solo_playback = false
|
87
|
+
@mute_playback = false
|
88
|
+
@rse_playback = false
|
89
|
+
@indicate_tuning = false
|
90
|
+
@name = 'Track'
|
91
|
+
@strings = %w(E5 B4 G4 D4 A3 E3)
|
92
|
+
@midi_port = 1
|
93
|
+
@midi_channel = 16
|
94
|
+
@midi_channel_for_effects = 16
|
95
|
+
@frets_count = 24
|
96
|
+
@capo = 0
|
97
|
+
@color = [255, 0, 0]
|
98
|
+
|
99
|
+
@diagrams_below_the_standard_notation = false
|
100
|
+
@show_rythm_with_tab = false
|
101
|
+
@force_horizontal_beams = false
|
102
|
+
@force_channels_11_to_16 = false
|
103
|
+
@diagrams_list_on_top_of_score = false
|
104
|
+
@diagrams_in_the_score = false
|
105
|
+
|
106
|
+
@auto_let_ring = false
|
107
|
+
@auto_brush = false
|
108
|
+
@extend_rhytmic_inside_the_tab = false
|
109
|
+
|
110
|
+
@midi_bank = 0
|
111
|
+
@human_playing = 0
|
112
|
+
@auto_accentuation = 0
|
113
|
+
@sound_bank = 0
|
114
|
+
|
115
|
+
@equalizer = Array.new(4, 0)
|
116
|
+
|
117
|
+
@instrument_effect_1 = ''
|
118
|
+
@instrument_effect_2 = ''
|
119
|
+
|
120
|
+
@bars = []
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'guitar_pro_parser/version'
|
2
|
+
require 'guitar_pro_parser/song'
|
3
|
+
require 'guitar_pro_parser/page_setup'
|
4
|
+
require 'guitar_pro_parser/channel'
|
5
|
+
require "guitar_pro_parser/track"
|
6
|
+
require "guitar_pro_parser/bar_settings"
|
7
|
+
require "guitar_pro_parser/bar"
|
8
|
+
require 'guitar_pro_parser/beat'
|
9
|
+
require 'guitar_pro_parser/chord_diagram'
|
10
|
+
require 'guitar_pro_parser/note'
|
11
|
+
|
12
|
+
module GuitarProParser
|
13
|
+
|
14
|
+
# Reads the whole Guitar Pro file and returns song object
|
15
|
+
def self.read_file(filename)
|
16
|
+
Song.new(filename)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Read only header information (such as title, artist, etc.)
|
20
|
+
# from Guitar Pro file
|
21
|
+
def self.read_headers(filename)
|
22
|
+
Song.new(filename, true)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,176 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GuitarProParser::BarSettings do
|
4
|
+
|
5
|
+
shared_context 'shared bar 1' do
|
6
|
+
subject { song.bars_settings[0] }
|
7
|
+
end
|
8
|
+
|
9
|
+
shared_context 'shared bar 2' do
|
10
|
+
subject { song.bars_settings[1] }
|
11
|
+
end
|
12
|
+
|
13
|
+
shared_context 'shared bar 3' do
|
14
|
+
subject { song.bars_settings[2] }
|
15
|
+
end
|
16
|
+
|
17
|
+
shared_context 'shared 3/4 bar' do
|
18
|
+
subject { song.bars_settings[6] }
|
19
|
+
end
|
20
|
+
|
21
|
+
shared_context 'shared 5/8 bar' do
|
22
|
+
subject { song.bars_settings[7] }
|
23
|
+
end
|
24
|
+
|
25
|
+
shared_context 'shared has start of repeat' do
|
26
|
+
subject { song.bars_settings[8] }
|
27
|
+
end
|
28
|
+
|
29
|
+
shared_context 'shared has end of repeat' do
|
30
|
+
subject { song.bars_settings[9] }
|
31
|
+
end
|
32
|
+
|
33
|
+
shared_context 'shared has number of alternate ending' do
|
34
|
+
subject { song.bars_settings[12] }
|
35
|
+
end
|
36
|
+
|
37
|
+
shared_examples 'Any Guitar Pro version' do
|
38
|
+
context 'bar 1' do
|
39
|
+
include_context 'shared bar 1'
|
40
|
+
|
41
|
+
its(:new_time_signature) { should include(:numerator => 4, :denominator => 4) }
|
42
|
+
its(:has_start_of_repeat) { should == false }
|
43
|
+
its(:has_end_of_repeat) { should == false }
|
44
|
+
its(:repeats_count) { should == 0 }
|
45
|
+
its(:alternate_endings) { should == [] }
|
46
|
+
its(:marker) { should == {name: 'Pt. 1', color: [255, 0, 0]} }
|
47
|
+
its(:new_key_signature) { should == {key: 1, scale: :major} }
|
48
|
+
its(:double_bar) { should == true }
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'bar 2' do
|
52
|
+
include_context 'shared bar 2'
|
53
|
+
its(:marker) { should == {name: 'Second bar', color: [0, 255, 0] } }
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'bar 3' do
|
57
|
+
include_context 'shared bar 3'
|
58
|
+
its(:marker) { should == {name: 'Pt. 2', color: [255, 0, 0] } }
|
59
|
+
end
|
60
|
+
|
61
|
+
context '3/4 bar' do
|
62
|
+
include_context 'shared 3/4 bar'
|
63
|
+
its(:new_time_signature) { should include(:numerator => 3, :denominator => nil) }
|
64
|
+
end
|
65
|
+
|
66
|
+
context '5/8 bar' do
|
67
|
+
include_context 'shared 5/8 bar'
|
68
|
+
its(:new_time_signature) { should include(:numerator => 5, :denominator => 8) }
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'has start of repeat' do
|
72
|
+
include_context 'shared has start of repeat'
|
73
|
+
its(:has_start_of_repeat) { should == true }
|
74
|
+
its(:has_end_of_repeat) { should == false }
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'has end of repeat' do
|
78
|
+
include_context 'shared has end of repeat'
|
79
|
+
its(:has_start_of_repeat) { should == false }
|
80
|
+
its(:has_end_of_repeat) { should == true }
|
81
|
+
its(:repeats_count) { should == 1 }
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'has number of alternate ending' do
|
85
|
+
include_context 'shared has number of alternate ending'
|
86
|
+
its(:alternate_endings) { should_not be_empty }
|
87
|
+
|
88
|
+
# There is also end of repeat in this bar
|
89
|
+
its(:has_end_of_repeat) { should == true }
|
90
|
+
its(:repeats_count) { should == 2 }
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
describe 'Guitar Pro 5' do
|
96
|
+
subject(:song) { GuitarProParser::Song.new test_tab_path 5 }
|
97
|
+
|
98
|
+
it_behaves_like 'Any Guitar Pro version'
|
99
|
+
|
100
|
+
context 'bar 1' do
|
101
|
+
include_context 'shared bar 1'
|
102
|
+
its(:new_time_signature) { should include(:beam_eight_notes_by_values => [2, 2, 2, 2]) }
|
103
|
+
its(:triplet_feel) { should == :triplet_8th }
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'bar 2' do
|
107
|
+
include_context 'shared bar 2'
|
108
|
+
its(:triplet_feel) { should == :no_triplet_feel }
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'bar 3' do
|
112
|
+
include_context 'shared bar 3'
|
113
|
+
its(:triplet_feel) { should == :triplet_16th }
|
114
|
+
end
|
115
|
+
|
116
|
+
context '3/4 bar' do
|
117
|
+
include_context 'shared 3/4 bar'
|
118
|
+
its(:new_time_signature) { should include(:beam_eight_notes_by_values => [2, 2, 2, 0]) }
|
119
|
+
end
|
120
|
+
|
121
|
+
context '5/8 bar' do
|
122
|
+
include_context 'shared 5/8 bar'
|
123
|
+
its(:new_time_signature) { should include(:beam_eight_notes_by_values => [3, 2, 0, 0]) }
|
124
|
+
end
|
125
|
+
|
126
|
+
context 'has number of alternate ending' do
|
127
|
+
include_context 'shared has number of alternate ending'
|
128
|
+
its(:alternate_endings) { should == [1, 2] }
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
shared_examples 'any bar in Guitar Pro < 5' do
|
134
|
+
its(:triplet_feel) { should == :no_triplet_feel }
|
135
|
+
end
|
136
|
+
|
137
|
+
describe 'Guitar Pro 4' do
|
138
|
+
subject(:song) { GuitarProParser::Song.new test_tab_path 4 }
|
139
|
+
|
140
|
+
it_behaves_like 'Any Guitar Pro version'
|
141
|
+
|
142
|
+
context 'bar 1' do
|
143
|
+
include_context 'shared bar 1'
|
144
|
+
it_behaves_like 'any bar in Guitar Pro < 5'
|
145
|
+
its(:new_time_signature) { should include(:beam_eight_notes_by_values => []) }
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'bar 2' do
|
149
|
+
include_context 'shared bar 2'
|
150
|
+
it_behaves_like 'any bar in Guitar Pro < 5'
|
151
|
+
end
|
152
|
+
|
153
|
+
context 'bar 3' do
|
154
|
+
include_context 'shared bar 3'
|
155
|
+
it_behaves_like 'any bar in Guitar Pro < 5'
|
156
|
+
end
|
157
|
+
|
158
|
+
context '3/4 bar' do
|
159
|
+
include_context 'shared 3/4 bar'
|
160
|
+
it_behaves_like 'any bar in Guitar Pro < 5'
|
161
|
+
its(:new_time_signature) { should include(:beam_eight_notes_by_values => []) }
|
162
|
+
end
|
163
|
+
|
164
|
+
context '5/8 bar' do
|
165
|
+
include_context 'shared 5/8 bar'
|
166
|
+
it_behaves_like 'any bar in Guitar Pro < 5'
|
167
|
+
its(:new_time_signature) { should include(:beam_eight_notes_by_values => []) }
|
168
|
+
end
|
169
|
+
|
170
|
+
context 'has number of alternate ending' do
|
171
|
+
include_context 'shared has number of alternate ending'
|
172
|
+
its(:alternate_endings) { should == [2] }
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
def test_beat(type)
|
4
|
+
beats = {
|
5
|
+
first: [0, 0, 0],
|
6
|
+
second: [0, 0, 1],
|
7
|
+
third: [0, 0, 2],
|
8
|
+
mix_table: [1, 2, 0]
|
9
|
+
}
|
10
|
+
track = beats[type][0]
|
11
|
+
bar = beats[type][1]
|
12
|
+
beat = beats[type][2]
|
13
|
+
subject { song.tracks[track].bars[bar].get_beat(beat) }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe GuitarProParser::Beat do
|
17
|
+
|
18
|
+
shared_examples 'any Guitar Pro version' do
|
19
|
+
context '1 beat, 1 bar, 1 track' do
|
20
|
+
test_beat :first
|
21
|
+
|
22
|
+
its(:dotted) { should == false }
|
23
|
+
its(:chord_diagram) { should be_nil }
|
24
|
+
its(:tuplet) { should be_nil }
|
25
|
+
its(:rest) { should be_nil }
|
26
|
+
|
27
|
+
its(:duration) { should == :eighth }
|
28
|
+
its(:text) { should == 'First beat' }
|
29
|
+
its(:effects) { should == {} }
|
30
|
+
its(:mix_table) { should be_nil }
|
31
|
+
its('strings.count') { should == 1 }
|
32
|
+
its(:strings) { should include '5' }
|
33
|
+
its(:transpose) { should be_nil }
|
34
|
+
end
|
35
|
+
|
36
|
+
context '2 beat, 1 bar, 1 track' do
|
37
|
+
test_beat :second
|
38
|
+
its(:text) { should == 'Second beat' }
|
39
|
+
its('strings.count') { should == 1 }
|
40
|
+
its(:strings) { should include '5' }
|
41
|
+
end
|
42
|
+
|
43
|
+
context '3 beat, 1 bar, 1 track' do
|
44
|
+
test_beat :third
|
45
|
+
its(:text) { should == 'Third beat' }
|
46
|
+
its('strings.count') { should == 1 }
|
47
|
+
its(:strings) { should include '4' }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'Guitar Pro 5' do
|
52
|
+
subject(:song) { GuitarProParser::Song.new test_tab_path 5 }
|
53
|
+
it_behaves_like 'any Guitar Pro version'
|
54
|
+
|
55
|
+
context 'mix table' do
|
56
|
+
test_beat :mix_table
|
57
|
+
its(:mix_table) { should == {:instrument=>25,
|
58
|
+
:volume=>{:value=>14, :transition=>2, :apply_to=>:all},
|
59
|
+
:chorus=>{:value=>2, :transition=>0, :apply_to=>:current},
|
60
|
+
:phaser=>{:value=>3, :transition=>1, :apply_to=>:current},
|
61
|
+
:rse_effect_2=>"Acoustic - Default", :rse_effect_1=>"Acoustic Tones"} }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'Guitar Pro 4' do
|
66
|
+
subject(:song) { GuitarProParser::Song.new test_tab_path 4 }
|
67
|
+
it_behaves_like 'any Guitar Pro version'
|
68
|
+
|
69
|
+
context 'mix table' do
|
70
|
+
test_beat :mix_table
|
71
|
+
its(:mix_table) { should == {:instrument=>25,
|
72
|
+
:volume=>{:value=>14, :transition=>2, :apply_to=>:all},
|
73
|
+
:chorus=>{:value=>2, :transition=>0, :apply_to=>:current},
|
74
|
+
:phaser=>{:value=>3, :transition=>1, :apply_to=>:current}} }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GuitarProParser::Channel do
|
4
|
+
|
5
|
+
shared_examples 'any Guitar Pro version' do
|
6
|
+
context 'port 1, channel 1' do
|
7
|
+
subject { song.channels[0][0] }
|
8
|
+
|
9
|
+
its(:instrument) { should == 30 }
|
10
|
+
its(:volume) { should == 13 }
|
11
|
+
its(:pan) { should == 8 }
|
12
|
+
its(:chorus) { should == 0 }
|
13
|
+
its(:reverb) { should == 0 }
|
14
|
+
its(:phaser) { should == 0 }
|
15
|
+
its(:tremolo) { should == 0 }
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'port 1, channel 1' do
|
19
|
+
subject { song.channels[0][1] }
|
20
|
+
its(:instrument) { should == 30 }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'port 1, channel 3' do
|
24
|
+
subject { song.channels[0][2] }
|
25
|
+
its(:instrument) { should == 25 }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'port 1, channel 10 (drums)' do
|
29
|
+
subject { song.channels[0][9] }
|
30
|
+
its(:instrument) { should == 0 }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'Guitar Pro 5' do
|
35
|
+
subject(:song) { GuitarProParser::Song.new test_tab_path 5 }
|
36
|
+
it_behaves_like 'any Guitar Pro version'
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'Guitar Pro 4' do
|
40
|
+
subject(:song) { GuitarProParser::Song.new test_tab_path 4 }
|
41
|
+
it_behaves_like 'any Guitar Pro version'
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GuitarProHelper do
|
4
|
+
describe '.digit_to_note' do
|
5
|
+
it 'converts digit to correct note' do
|
6
|
+
digits = [0, 1, 2]
|
7
|
+
notes = ['C0', 'C#0', 'D0']
|
8
|
+
digits.count.times { |i| (GuitarProHelper.digit_to_note(digits.fetch(i))).should == notes.fetch(i) }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|