Class: Miyako::Audio::BGM

Inherits:
Object show all
Defined in:
lib/Miyako/API/audio.rb

Overview

BGM管理クラス

再生できるBGMは1曲だけ。2つ以上のBGMの同時演奏は不可

Constant Summary collapse

@@playing_bgm =
nil

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(fname, loops = -1)) ⇒ BGM

インスタンスを生成する

fname

演奏するBGMファイル名。対応ファイルはwav,mp3,ogg,mid等。

loops

演奏の繰り返し回数を指定する。-1を渡すと無限に繰り返す。省略時は-1を渡す。

返却値

生成したインスタンス



104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/Miyako/API/audio.rb', line 104

def initialize(fname, loops = -1)
  return if $not_use_audio
  raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
  raise MiyakoIOError.no_file(fname) unless File.exist?(fname)
  @bgm = SDL::Mixer::Music.load(fname)
  @loops = loops
  @now_loops = loops
  @loop_cnt = 1
  @cnt_up_flag = false
  @offset_ticks = 0
  reset_ticks
end

Class Method Details

.updateObject

BGMの再生情報を更新する



58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/Miyako/API/audio.rb', line 58

def BGM.update
  return if $not_use_audio
  return unless @@playing_bgm
  if !@@playing_bgm.playing_without_loop? && @@playing_bgm.in_the_loop?
    @@playing_bgm.loop_count_up
    @@playing_bgm = nil if !@@playing_bgm.in_the_loop?
  elsif !@@playing_bgm.playing? && !@@playing_bgm.fade_out?
    @@playing_bgm = nil
  elsif !@@playing_bgm.allow_loop_count_up?
    @@playing_bgm.allow_loop_count_up
  end
end

Instance Method Details

#allow_loop_count_upObject

:nodoc:



92
93
94
# File 'lib/Miyako/API/audio.rb', line 92

def allow_loop_count_up #:nodoc:
  @cnt_up_flag = true
end

#allow_loop_count_up?Boolean

:nodoc:

Returns:

  • (Boolean)


96
97
98
# File 'lib/Miyako/API/audio.rb', line 96

def allow_loop_count_up? #:nodoc:
  @cnt_up_flag
end

#disposeObject

演奏情報を解放する

レシーバをdup/deep_dupなどのメソッドで複製したことがある場合、 内部データを共有しているため、呼び出すときには注意すること



296
297
298
299
300
# File 'lib/Miyako/API/audio.rb', line 296

def dispose
  @@playing_bgm = nil if @@playing_bgm == self
  @bgm.destroy
  @bgm = nil
end

#fade_in(msec = 5000, vol = nil, loops = nil) ⇒ Object Also known as: fadeIn

フェードインしながら演奏する

msec

フェードインの時間。ミリ秒単位。デフォルトは5000ミリ秒(5秒)

vol

音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。

loops

演奏の繰り返し回数を指定する。-1のときは無限に繰り返す。nilを渡すと元の設定を使う。省略時はnilを渡す。

返却値

演奏に成功したときはtrue、失敗した問いはfalseを返す



182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
# File 'lib/Miyako/API/audio.rb', line 182

def fade_in(msec=5000, vol = nil, loops = nil)
  return false if $not_use_audio
  return false if @@playing_bgm && @@playing_bgm != self
  raise MiyakoValueError.over_range(msec, 1, nil) unless msec > 0
  if vol
    raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
    set_volume(vol)
  end
  if loops
    raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
  end
  @now_loops = loops ? loops : @loops
  SDL::Mixer.fade_in_music(@bgm, @now_loops)
  setup_ticks
  @@playing_bgm = self
  @loop_cnt = 1
  return true
end

#fade_in?Boolean

フェードイン中を示すフラグ

返却値

フェードイン中はtrue、そのほかの時はfalseを返す

Returns:

  • (Boolean)


236
237
238
239
240
241
242
# File 'lib/Miyako/API/audio.rb', line 236

def fade_in?
  return false if $not_use_audio
#        return SDL::Mixer.fading_music == SDL::Mixer::FADING_IN
  # なぜかSDL::Mixer::FADING_INが見つからないため、即値で
  # from SDL_Mixer.h
  return SDL::Mixer.fading_music == 2
end

#fade_out(msec = 5000, wmode = false) ⇒ Object Also known as: fadeOut

演奏をフェードアウトする

msec

フェードアウトする時間。ミリ秒単位。デフォルトは5000ミリ秒

wmode

フェードアウトする間、処理を停止するかどうかを示すフラグ。デフォルトはfalse(すぐに次の処理を開始)

返却値

自分自身を返す



283
284
285
286
287
288
289
290
291
# File 'lib/Miyako/API/audio.rb', line 283

def fade_out(msec = 5000, wmode = false)
  return self if $not_use_audio
  raise MiyakoValueError.over_range(msec, 1, nil) unless msec > 0
  if SDL::Mixer.play_music?
    SDL::Mixer.fade_out_music(msec)
    SDL::delay(msec) if wmode
  end
  return self
end

#fade_out?Boolean

フェードアウト中を示すフラグ

返却値

フェードアウト中はtrue、そのほかの時はfalseを返す

Returns:

  • (Boolean)


246
247
248
249
250
251
252
# File 'lib/Miyako/API/audio.rb', line 246

def fade_out?
  return false if $not_use_audio
#        return SDL::Mixer.fading_music == SDL::Mixer::FADING_OUT
  # なぜかSDL::Mixer::FADING_OUTが見つからないため、即値で
  # from SDL_Mixer.h
  return SDL::Mixer.fading_music == 1
end

#in_the_loop?Boolean

現在、繰り返し演奏中かどうかを問い合わせる

現在、繰り返し回数が指定の回数の範囲内かどうかをtrue・falseで返す。 無限に繰り返しているときは常にtrue

返却値

現在繰り返し演奏中のときはtrue

Returns:

  • (Boolean)


83
84
85
# File 'lib/Miyako/API/audio.rb', line 83

def in_the_loop?
  @now_loops == -1 ? true : @loop_cnt <= @now_loops
end

#initialize_copy(obj) ⇒ Object

インスタンスの複写

複写すると不都合が多いため、MiyakoCopyException例外が発生する



119
120
121
# File 'lib/Miyako/API/audio.rb', line 119

def initialize_copy(obj)
  raise MiyakoCopyError.not_copy("BGM")
end

#loop_countObject

現在の繰り返し回数を取得する

繰り返し回数を限定して演奏しているとき、何回目の演奏家を示す。 無限に繰り返しているときは常に-1を返す

返却値

ループ回数



75
76
77
# File 'lib/Miyako/API/audio.rb', line 75

def loop_count
  @loop_cnt
end

#loop_count_upObject

:nodoc:



87
88
89
90
# File 'lib/Miyako/API/audio.rb', line 87

def loop_count_up #:nodoc:
  @loop_cnt = @loop_cnt + 1 if (@now_loops != -1 && @cnt_up_flag)
  @cnt_up_flag = false
end

#offsetObject



307
308
309
# File 'lib/Miyako/API/audio.rb', line 307

def offset
  @offset_ticks
end

#offset=(val) ⇒ Object



315
316
317
# File 'lib/Miyako/API/audio.rb', line 315

def offset=(val)
  @offset_ticks = val
end

#pauseObject

演奏を一時停止する

resumeメソッドで一時停止を解除する

返却値

自分自身を返す



225
226
227
228
229
230
231
232
# File 'lib/Miyako/API/audio.rb', line 225

def pause
  return self if $not_use_audio
  if SDL::Mixer.play_music?
    SDL::Mixer.pause_music
    @pos_ticks += SDL.get_ticks-@start_tick
  end
  return self
end

#pausing?Boolean

演奏停止中を示すフラグ

返却値

演奏停止中はtrue、演奏中はfalseを返す

Returns:

  • (Boolean)


217
218
219
220
# File 'lib/Miyako/API/audio.rb', line 217

def pausing?
  return false if $not_use_audio
  return SDL::Mixer.pause_music?
end

#play(vol = nil, loops = nil) ⇒ Object

BGMを演奏する。ブロックが渡されている場合、ブロックの評価中のみ演奏する。

音の大きさ・繰り返し回数を指定可能

vol

音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。

loops

演奏の繰り返し回数を指定する。-1のときは無限に繰り返す。nilを渡すと元の設定を使う。省略時はnilを渡す。

返却値

演奏に成功したときはtrue、失敗した問いはfalseを返す



155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# File 'lib/Miyako/API/audio.rb', line 155

def play(vol = nil, loops = nil)
  return false if $not_use_audio
  return false if @@playing_bgm && @@playing_bgm != self
  if vol
    raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
    set_volume(vol)
  end
  if loops
    raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
  end
  @now_loops = loops ? loops : @loops
  SDL::Mixer.play_music(@bgm, @now_loops)
  setup_ticks
  @loop_cnt = 1
  if block_given?
    yield self
    SDL::Mixer.halt_music
  end
  @@playing_bgm = self
  return true
end

#playing?Boolean

演奏中を示すフラグ

返却値

演奏中はtrue、停止(一時停止)中はfalseを返す

Returns:

  • (Boolean)


205
206
207
208
# File 'lib/Miyako/API/audio.rb', line 205

def playing?
  return false if $not_use_audio
  return (SDL::Mixer.play_music? && self.in_the_loop?) || self.fade_out?
end

#playing_without_loop?Boolean

:nodoc:

Returns:

  • (Boolean)


210
211
212
213
# File 'lib/Miyako/API/audio.rb', line 210

def playing_without_loop? #:nodoc:
  return false if $not_use_audio
  return SDL::Mixer.play_music?
end

#posObject



302
303
304
305
# File 'lib/Miyako/API/audio.rb', line 302

def pos
  return 0 unless @start_tick
  SDL.get_ticks - @start_tick + @offset_ticks + @pos_ticks
end

#reset_ticksObject



325
326
327
328
329
# File 'lib/Miyako/API/audio.rb', line 325

def reset_ticks
  @start_tick = nil
  @pos_ticks = 0
  self.offset = @offset_ticks
end

#resumeObject

一時停止を解除する

返却値

自分自身を返す



256
257
258
259
260
261
262
263
# File 'lib/Miyako/API/audio.rb', line 256

def resume
  return self if $not_use_audio
  if SDL::Mixer.pause_music?
    SDL::Mixer.resume_music
    @start_tick = SDL.get_ticks
  end
  return self
end

#rewindObject



331
332
333
334
335
336
# File 'lib/Miyako/API/audio.rb', line 331

def rewind
  if SDL::Mixer.play_music?
    SDL::Mixer.rewind_music
    setup_ticks
  end
end

#set_volume(v) ⇒ Object Also known as: setVolume

音の大きさを設定する

v

音の大きさ。0〜255までの整数。255で最大。

返却値

自分自身を返す



126
127
128
129
130
131
# File 'lib/Miyako/API/audio.rb', line 126

def set_volume(v)
  return self if $not_use_audio
  raise MiyakoValueError.over_range(v, 0, 255) unless (0..255).cover?(v)
  SDL::Mixer.set_volume_music(v)
  return self
end

#setup_ticksObject



319
320
321
322
323
# File 'lib/Miyako/API/audio.rb', line 319

def setup_ticks
  @start_tick = SDL.get_ticks
  @pos_ticks = 0
  self.offset = @offset_ticks
end

#start(vol = nil, loops = nil) ⇒ Object

BGMを演奏する。ブロックが渡されている場合、ブロックの評価中のみ演奏する。

音の大きさ・繰り返し回数・演奏時間を指定可能

vol

音の大きさ(省略可能)。0〜255の整数を設定する。nilを渡したときは音の大きさを変更しない。

loops

演奏の繰り返し回数を指定する。-1のときは無限に繰り返す。nilを渡すと元の設定を使う。省略時はnilを渡す。

返却値

演奏に成功したときはtrue、失敗した問いはfalseを返す



140
141
142
143
144
145
146
147
148
# File 'lib/Miyako/API/audio.rb', line 140

def start(vol = nil, loops = nil)
  if vol
    raise MiyakoValueError.over_range(vol, 0, 255) unless (0..255).cover?(vol)
  end
  if loops
    raise MiyakoValueError.over_range(loops, -1, nil) unless loops >= -1
  end
  return self.play(vol, loops)
end

#stopObject

演奏を停止する

pauseメソッドとは違い、完全に停止するため、resumeメソッドは使えない

返却値

自分自身を返す



268
269
270
271
272
273
274
275
276
277
# File 'lib/Miyako/API/audio.rb', line 268

def stop
  return self if $not_use_audio
  if SDL::Mixer.play_music?
    SDL::Mixer.halt_music
    reset_ticks
  end
  @loop_cnt = @now_loops + 1
  @@playing_bgm = nil if @@playing_bgm == self
  return self
end