bangkok 0.1.0 → 0.1.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/ChangeLog CHANGED
@@ -1,3 +1,18 @@
1
+ 2005-03-25 Jim Menard <jimm@io.com>
2
+
3
+ * lib/bangkok/chessgame.rb: removed shebang line.
4
+
5
+ * lib/bangkok/gamelistener.rb (GameListener::initialize): added
6
+ config file path argument.
7
+ (GameListener::read_config): created.
8
+ (GameListener::end_game): io is an instance var, not a local var.
9
+ Restructured code around filling in config information.
10
+
11
+ * bin/bangkok: fixed really stupid syntax errors. Added -c command
12
+ line argument. Pass config file path to GameListener.
13
+
14
+ * Version 0.1.0 released.
15
+
1
16
  2005-03-24 Jim Menard <jimm@io.com>
2
17
 
3
18
  * Initial project creation.
data/README CHANGED
@@ -10,12 +10,21 @@ Bangkok originated as the code for an art project by Tom Peak
10
10
 
11
11
  The Web site of Bangkok is (http://bangkok.rubyforge.org). The RubyForge
12
12
  project page is http://rubyforge.org/projects/bangkok, where the latest
13
- version of bangkok may be downloaded. bangkok is also available as a RubyGem.
13
+ version of bangkok may be downloaded. Bangkok is also available as a RubyGem.
14
14
 
15
15
 
16
16
  === Recent Changes
17
17
 
18
- Since this is the first release, there's nothing to say.
18
+ ==== 0.1.1
19
+
20
+ * Fixed bugs in the bin/bangkok script.
21
+
22
+ * Implemented the -c command line argument.
23
+
24
+ * Fixed a bug in the GameListener that prevented the MIDI file from being
25
+ output.
26
+
27
+ * Added parsing of the config file to GameListener.
19
28
 
20
29
 
21
30
  == Dependencies
@@ -8,9 +8,10 @@ end
8
8
 
9
9
  def usage
10
10
  $stderr.puts <<EOS
11
- usage: bangkok [-v] chessgame.pgn ...
12
- -v Verbose (prints each move)
13
- -h This message
11
+ usage: bangkok [-c config_file] [-v] chessgame.pgn ...
12
+ -c file Passes config_file to the GameListener
13
+ -v Verbose (prints each move)
14
+ -h This message
14
15
 
15
16
  Using the default GameListener, creates chessgame.mid for every chessgame.pgn.
16
17
  To use your own GameListener, see the Bangkok README file.
@@ -20,10 +21,13 @@ EOS
20
21
  end
21
22
 
22
23
  $verbose = false
23
- g = GetoptLong.new(['-v', '--verbose', GetoptLong::NO_ARGUMENT],
24
+ g = GetoptLong.new(['-c', '--config-file', GetoptLong::REQUIRED_ARGUMENT],
25
+ ['-v', '--verbose', GetoptLong::NO_ARGUMENT],
24
26
  ['-h', '--help', GetoptLong::NO_ARGUMENT])
27
+ config_file_path = nil
25
28
  g.each { | opt, arg |
26
29
  case opt
30
+ when '-c'
27
31
  when '-v'
28
32
  $verbose = true
29
33
  else
@@ -33,8 +37,8 @@ g.each { | opt, arg |
33
37
  usage if ARGV.length == 0
34
38
 
35
39
  ARGV.each { | fname |
36
- game = ChessGame.new
40
+ game = ChessGame.new(GameListener.new(config_file_path))
37
41
  File.open(fname, 'r') { | f | game.read_moves(f) }
38
- midi_file_name = File.basename(fname).sub(/(\..+)?$/
39
- File.open(midi_file_name, '.mid'), 'wb') { | f | game.play(f) }
42
+ midi_file_name = File.basename(fname).sub(/(\..+)?$/, '.mid')
43
+ File.open(midi_file_name, 'wb') { | f | game.play(f) }
40
44
  }
@@ -1,11 +1,10 @@
1
- #! /usr/bin/env ruby
2
-
3
1
  require 'bangkok/gamelistener'
4
2
  require 'bangkok/board'
5
3
  require 'bangkok/move'
6
4
 
7
- # A ChessGame can read a chess play file and write a MIDI file created from
8
- # the moves in the file.
5
+ # ChessGame takes a listener in its constructor and creates a Board. The
6
+ # method ChessGame#read_moves reads game data. Calling ChessGame#play moves
7
+ # the pieces, which in turn sends messages to the listener so it can react.
9
8
  class ChessGame
10
9
 
11
10
  def initialize(listener = GameListener.new)
@@ -9,42 +9,6 @@ include MIDI
9
9
  # The pieces and board call methods on an instance of GameListener, which
10
10
  # turns those events into MIDI events.
11
11
  class GameListener
12
- PIECE_MIDI_INFO = {}
13
- PIECE_MIDI_INFO[:white] = {}
14
- PIECE_MIDI_INFO[:black] = {}
15
- end
16
-
17
- def white(piece_sym, program_change)
18
- GameListener::PIECE_MIDI_INFO[:white][piece_sym] = program_change
19
- end
20
- def black(piece_sym, program_change)
21
- GameListener::PIECE_MIDI_INFO[:black][piece_sym] = program_change
22
- end
23
-
24
-
25
- # Fill in some default values, in case the user does not specify any new ones.
26
- black :K, 0
27
- black :Q, 8
28
- black :R, 16
29
- black :B, 24
30
- black :N, 32
31
- black :P, 4
32
- white :K, 4
33
- white :Q, 12
34
- white :R, 20
35
- white :B, 28
36
- white :N, 36
37
- white :P, 44
38
-
39
- class GameListener
40
-
41
- attr_reader :seq # MIDI::Sequence
42
-
43
- # TODO remove this and specify it some other way
44
- begin
45
- require 'chess_config' # Fills in PIECE_MIDI_INFO
46
- rescue LoadError
47
- end
48
12
 
49
13
  PIECE_NAMES = {
50
14
  :P => "Pawn",
@@ -69,6 +33,48 @@ class GameListener
69
33
  4.times { | i | RANK_TO_VOL << 10 + ((117.0 / 3.0) * i).to_i }
70
34
  4.times { | i | RANK_TO_VOL << 127 - (((117.0 / 3.0) * i).to_i) }
71
35
 
36
+ PIECE_MIDI_INFO = {}
37
+ PIECE_MIDI_INFO[:white] = {}
38
+ PIECE_MIDI_INFO[:black] = {}
39
+
40
+ # Used by config files to set the program change value for a piece.
41
+ def GameListener.white(piece_sym, program_change)
42
+ PIECE_MIDI_INFO[:white][piece_sym] = program_change
43
+ end
44
+
45
+ # Used by config files to set the program change value for a piece.
46
+ def GameListener.black(piece_sym, program_change)
47
+ GameListener::PIECE_MIDI_INFO[:black][piece_sym] = program_change
48
+ end
49
+
50
+ # Fill in some default values, in case the user does not specify any new
51
+ # ones.
52
+ black :K, 0
53
+ black :Q, 8
54
+ black :R, 16
55
+ black :B, 24
56
+ black :N, 32
57
+ black :P, 4
58
+ white :K, 4
59
+ white :Q, 12
60
+ white :R, 20
61
+ white :B, 28
62
+ white :N, 36
63
+ white :P, 44
64
+
65
+ attr_reader :seq # MIDI::Sequence
66
+
67
+ def initialize(config_file_path=nil)
68
+ read_config(config_file_path) if config_file_path
69
+ end
70
+
71
+ def read_config(config_file_path)
72
+ IO.readlines(config_file_path).each { | line |
73
+ line.chomp!
74
+ class_eval(line)
75
+ }
76
+ end
77
+
72
78
  def track_of(piece)
73
79
  i = [:white, :black].index(piece.color) * 6 +
74
80
  [:P, :R, :N, :B, :Q, :K].index(piece.piece)
@@ -103,7 +109,7 @@ class GameListener
103
109
  # When we created events, we set their start times, not their delta times.
104
110
  # Now is the time to fix that.
105
111
  @seq.tracks.each { | t | t.recalc_delta_from_times }
106
- @seq.write(io)
112
+ @seq.write(@io)
107
113
  end
108
114
 
109
115
  def move(piece, from, to)
@@ -1,6 +1,6 @@
1
1
  VERSION_MAJOR = 0
2
2
  VERSION_MINOR = 1
3
- VERSION_TWEAK = 0
3
+ VERSION_TWEAK = 1
4
4
 
5
5
  Version = "#{VERSION_MAJOR}.#{VERSION_MINOR}.#{VERSION_TWEAK}"
6
6
  Copyright = 'Copyright (c) 2005 by Jim Menard <jimm@io.com>'
metadata CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.8.8
3
3
  specification_version: 1
4
4
  name: bangkok
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.0
6
+ version: 0.1.1
7
7
  date: 2005-03-25
8
8
  summary: Chess game file reader and player; can turn games into MIDI files
9
9
  require_paths: