interval-quiz 0.0.1

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.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 YOUR NAME
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,4 @@
1
+ interval-quiz
2
+ =============
3
+
4
+ A gem that provides a quiz on musical intervals.
@@ -0,0 +1,55 @@
1
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
2
+ require 'rake/gempackagetask'
3
+ require 'rubygems/specification'
4
+ require 'date'
5
+ require 'spec/rake/spectask'
6
+
7
+ GEM = "interval-quiz"
8
+ GEM_VERSION = "0.0.1"
9
+
10
+ spec = Gem::Specification.new do |s|
11
+ s.name = GEM
12
+ s.version = GEM_VERSION
13
+ s.author = "Nate Murray"
14
+ s.email = "nate@natemurray.com"
15
+ s.homepage = "http://www.xcombinator.com"
16
+ s.description = s.summary = "A gem that provides a quiz on musical intervals"
17
+
18
+ s.platform = Gem::Platform::RUBY
19
+ s.has_rdoc = true
20
+ s.extra_rdoc_files = ["README.mkd", "LICENSE"]
21
+ s.summary = "a quiz for musical intervals"
22
+ s.bindir = "bin"
23
+ s.executables = ['interval-quiz']
24
+
25
+ # Uncomment this to add a dependency
26
+ s.add_dependency "interval"
27
+
28
+ s.require_path = 'lib'
29
+ s.files = %w(LICENSE README.mkd Rakefile) + Dir.glob("{lib,spec,bin}/**/*")
30
+ end
31
+
32
+ task :default => :spec
33
+
34
+ desc "Run specs"
35
+ Spec::Rake::SpecTask.new do |t|
36
+ t.spec_files = FileList['spec/**/*_spec.rb']
37
+ t.spec_opts = %w(-fs --color)
38
+ end
39
+
40
+
41
+ Rake::GemPackageTask.new(spec) do |pkg|
42
+ pkg.gem_spec = spec
43
+ end
44
+
45
+ desc "install the gem locally"
46
+ task :install => [:package] do
47
+ sh %{sudo gem install pkg/#{GEM}-#{GEM_VERSION}}
48
+ end
49
+
50
+ desc "create a gemspec file"
51
+ task :make_spec do
52
+ File.open("#{GEM}.gemspec", "w") do |file|
53
+ file.puts spec.to_ruby
54
+ end
55
+ end
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ # load development libs if they exist
3
+ [File.dirname(__FILE__) + "/../../interval/lib", File.dirname(__FILE__) + "/../lib"].each do |path|
4
+ $:.unshift(path) if File.exists?(path)
5
+ end
6
+ require "rubygems"
7
+ require "interval"
8
+ require "interval-quiz"
9
+
10
+ quiz = IntervalQuiz.new
11
+ quiz.run!
@@ -0,0 +1,113 @@
1
+ $:.unshift(File.dirname(__FILE__) + "/../../interval/lib")
2
+ require "rubygems"
3
+ require "interval"
4
+ require "highline/import"
5
+ require "madeleine"
6
+ require "pp"
7
+
8
+ class Quiz
9
+ # Here is the list of intervals by semitone. This is just here for reference:
10
+ #
11
+ # 0 Perfect Unison (P1) Diminished second (dim2)
12
+ # 1 Minor second (m2) Augmented unison (aug1)
13
+ # 2 Major second (M2) Diminished third (dim3)
14
+ # 3 Minor third (m3) Augmented second (aug2)
15
+ # 4 Major third (M3) Diminished fourth (dim4)
16
+ # 5 Perfect fourth (P4) Augmented third (aug3)
17
+ # 6 Tritone Augmented fourth (aug4) Diminished fifth (dim5)
18
+ # 7 Perfect fifth (P5) Diminished sixth (dim6)
19
+ # 8 Minor sixth (m6) Augmented fifth (aug5)
20
+ # 9 Major sixth (M6) Diminished seventh (dim7)
21
+ # 10 Minor seventh (m7) Augmented sixth (aug6)
22
+ # 11 Major seventh (M7) Diminished octave (dim8)
23
+ # 12 Perfect octave (P8) Augmented seventh (aug7)
24
+
25
+ attr_accessor :intervals # which intervals we will quiz on
26
+ attr_accessor :abovebelow # array of ["", "-"] if "-" is present, then we are quizzing on intervals below
27
+ attr_accessor :asked
28
+ attr_accessor :correct
29
+ attr_accessor :natural
30
+
31
+ def initialize
32
+ self.asked = 0
33
+ self.correct = 0
34
+ self.natural = true
35
+ end
36
+
37
+ def run!
38
+ loop do
39
+
40
+ pitch = Interval::Pitch.random(self.natural)
41
+ ab = self.abovebelow.rand
42
+ ab_eng = ab == "-" ? "below" : "above"
43
+ interval = Interval::Interval.from_string(ab + self.intervals.rand)
44
+
45
+ begin
46
+ answer = ask("what is a #{interval.to_long_name.downcase} #{ab_eng} #{pitch.to_s} #{score_str}? ")
47
+ self.asked = self.asked + 1
48
+ rescue EOFError
49
+ puts "goodbye"
50
+ exit
51
+ end
52
+
53
+ real_answer = pitch + interval
54
+
55
+ if answer.downcase == real_answer.to_short_name.downcase
56
+ say "<%= color('correct!', :green) %>"
57
+ self.correct = correct + 1
58
+ else
59
+ say "<%= color('wrong', :red) %>. the answer is #{real_answer.to_short_name}"
60
+ end
61
+ end
62
+ end
63
+
64
+ def score_str
65
+ return "" unless asked && asked > 0
66
+ "#{correct}/#{asked} (%d%%)" % [(correct.to_f / asked.to_f) * 100]
67
+ end
68
+
69
+ end
70
+
71
+ class IntervalQuiz
72
+
73
+ def run!
74
+ say("Here are the intervals:")
75
+ intervals =<<-EOF
76
+ unison p1 a1
77
+ second m2 M2 d2 a2
78
+ third m3 M3 d3 a3
79
+ fourth p4 d4 a4
80
+ fifth d5 p5 d5 a5
81
+ sixth m6 M6 d6 a6
82
+ seventh m7 M7 d7 a7
83
+ octave p8 d8
84
+ EOF
85
+ say(intervals)
86
+
87
+ picked = ask("enter the intervals you want (or a blank line to quit):", lambda { |ans| ans} ) do |q|
88
+ q.gather = ""
89
+ end
90
+
91
+ pp picked
92
+
93
+ abovebelow = []
94
+ choose do |menu|
95
+ menu.prompt = "do you want to be quizzed on intervals above, below, or both? "
96
+ menu.choice(:above) { abovebelow = [""] }
97
+ menu.choice(:below) { abovebelow = ["-"] }
98
+ menu.choice(:both) { abovebelow = ["", "-"] }
99
+ end
100
+
101
+ q = Quiz.new
102
+ q.abovebelow = abovebelow
103
+ q.intervals = picked
104
+
105
+ q.run!
106
+ end
107
+
108
+ end
109
+
110
+ if $0 == __FILE__
111
+ quiz = IntervalQuiz.new
112
+ quiz.run!
113
+ end
@@ -0,0 +1,7 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "interval-quiz" do
4
+ it "should do nothing" do
5
+ true.should == true
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ $TESTING=true
2
+ $:.push File.join(File.dirname(__FILE__), '..', 'lib')
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: interval-quiz
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Nate Murray
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-17 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: interval
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: A gem that provides a quiz on musical intervals
26
+ email: nate@natemurray.com
27
+ executables:
28
+ - interval-quiz
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README.mkd
33
+ - LICENSE
34
+ files:
35
+ - LICENSE
36
+ - README.mkd
37
+ - Rakefile
38
+ - lib/interval-quiz.rb
39
+ - spec/interval-quiz_spec.rb
40
+ - spec/spec_helper.rb
41
+ - bin/interval-quiz
42
+ has_rdoc: true
43
+ homepage: http://www.xcombinator.com
44
+ licenses: []
45
+
46
+ post_install_message:
47
+ rdoc_options: []
48
+
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
56
+ version:
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: "0"
62
+ version:
63
+ requirements: []
64
+
65
+ rubyforge_project:
66
+ rubygems_version: 1.3.2
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: a quiz for musical intervals
70
+ test_files: []
71
+