• Login

Mustamakkara

Blutwurst der Verdammnis

  • "Mustamakkara" started this thread

Motto: Zuhause ist da, wo du deine Schuhe ausziehen kannst.

  • Send private message

1

Sunday, February 9th 2020, 2:46pm

[RMXP] "Fun-Tasten" - Klavierscript von Mustamakkara

Hey Guest!

Hat es dich auch immer gestört, dass in vielen RPG-Maker-Spielen in so ziemlich jedem Haus ein Klavier steht, man es aber nicht spielen kann? Damit ist jetzt Schluss!

"Fun-Tasten" ermöglicht das Spielen von Klavieren, Cembali und Kirchenorgeln! Navigiere mit den Pfeiltasten auf der Klaviatur und drücke Enter, um einen Ton zu erzeugen!
Attachment 24197


Features:
  • Spielbare Klaviere, Cembali und Kirchenorgeln. Zudem lassen sich sehr einfach andere Instrumente hinzufügen. Warum nicht einen Synthesizer für moderne oder Sci-Fi-Settings?
  • Es lassen sich Tonfolgen definieren. Werden diese gespielt, aktiviert sich ein Schalter. Möchtest du einen Geheimgang hinter dem Klavier, der sich nur beim Rondo alla Turca öffnet? Kein Problem! (Eignet sich auch hervorragend für Easter Eggs oder versteckte Achievements.)
  • Halte beim Klavier die Shift-Taste gedrückt, um das Sustain-Pedal zu benutzen.
  • Optional lässt sich auf dem Notenhalter des Klaviers ein Picture anzeigen. Das können beispielsweise Noten sein, aber Leute lassen alles Mögliche auf Klavieren stehen. Warum nicht ein Liebesbrief, adressiert an die Dame des Hauses?

Nicht-Features:
  • Das System erkennt Melodien, aber keinen Rhythmus.

Hier eine spielbare Testversion: Mustamakkaras Fun-Tasten v1.0.exe (zum Übertragen ins eigene Projekt werden alle Sounds aus dem SE-Ordner sowie das Picture Klaviatur.png benötigt).

Und hier der Quellcode:
Spoiler: Quellcode

Ruby Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
#-------------------------------------------------------------------------------
#-------------------------Fun-Tasten v1.0 by Mustamakkara-----------------------
#
# Darf unter Angabe von Credits sowohl in kommerziellen als auch nichtkommerziellen
# Projekten verwendet werden.
# Das Script befindet sich zum Download auf www.rpg-studio.org. Darf nicht auf
# anderen Seiten hochgeladen werden, sondern es darf ausschließlich auf den 
# Original-Thread verwiesen werden.
#-------------------------------------------------------------------------------
 
class Scene_Piano
 
# Ermöglicht es, ein beliebiges Tasteninstrument zu spielen. Dies gelingt über
# ein Call Script:
#     $scene = Scene_Piano.new(instrument, noten, vergleich)
# Die Parameter sind nicht notwendig. 
#
# Beispiele:
#
#     $scene = Scene_Piano.new 
#
# =>  Öffnet ein Klavier ohne Noten, bei dem die gespielten Noten mit vorher 
#     angegebenen Melodien verglichen werden.
#
#
#     $scene = Scene_Piano.new(2, "Fuer Elise", false) 
#
# =>  Öffnet eine Orgel mit dem Notenblatt zu "Für Elise", bei dem nichts
#     verglichen wird.
#
#
# Soll das Gespielte mit hinterlegten Tonfolgen verglichen werden, so lassen sich
# diese hier festlegen:
 
SONG1 = [13, 15, 17, 18, 20, 20, 22, 22, 22, 22, 20, 18, 18, 18, 18, 17, 17, 15, 15, 15, 15, 13]
#AlleMeineEntchen
SONG2 = [13, 20, 18, 20, 23, 20]
#X-Files
 
# SONG3 = [1, 3, 5, 6, 8, 10, 12, 13, 15, 17, 18, 20, 22, 24, 25]
# Alle weißen Tasten.
# usw...
 
# Dabei stehen die Zahlen für die Tasten im Klavier von links nach rechts.
# 1 => Tiefes C
# 2 => Tiefes C#
# 3 => Tiefes D
# ...
# 25 => Hohes C
 
# # Die Sounddateien müssen von 1-25 benannt sein und sich im Ordner 
# Audio/SE/"Name des Instruments" befinden.
# Hält man die SHIFT-Taste gedrückt, wird das Sustain-Pedal aktiviert (das ist
# das rechte Pedal am Klavier). Dies ist nur in der Klavier-Einstellung möglich
# (Cembali und Orgeln haben kein Sustain-Pedal).
# Die Notenblätter müssen sich im Pictures-Ordner befinden und 320x220 px groß 
# sein. Andere Größen sind prinzipiell möglich, dann muss aber die Position des
# Notenblattes in der Methode load_noten angepasst werden.
 
  def initialize(instrument = 0, noten = nil, vergleich = true)
    case instrument
    when 1
      @instrument = "Harpsichord"
    when 2
      @instrument = "Church Organ"
# Hier können beliebig viele Instrumente angegeben werden. 
# Vielleicht ein Akkordeon?      
    else
      @instrument = "Piano"
    end
    @noten = noten
    @compare = vergleich
  end
 
#-------------------------------------------------------------------------------
#---------------------------Hier fängt das Script an----------------------------
#-------------------------------------------------------------------------------
 
  def main
 
#-------------------------------------------------------------------------------
#-------------------- Hier könnt ihr Einstellungen anpassen --------------------
#-------------------------------------------------------------------------------
 
    @songs = { SONG1 => 2 , SONG2 => 3 } # Welcher gespielte Song aktiviert welchen Switch?
    @cursor = 13 # Startpunkt der Auswahl (Mittleres C)
    @chosencolor = Color.new(255, 255, 50) # Farbe der ausgewählten Taste
    @braun = Color.new(139, 69, 19) # Farbe des Klaviers
    @dunkelbraun = Color.new(120, 50, 0) # Farbe des Notenständers
 
#-------------------------------------------------------------------------------
#-------------------- Ab hier bitte nichts mehr ändern -------------------------
#-------------------------------------------------------------------------------
 
    @white_keys = [1, 3, 5, 6, 8, 10, 12, 13, 15, 17, 18, 20, 22, 24, 25]
    @black_keys = [2, 4, 0 , 7, 9, 11, 0, 14, 16, 0, 19, 21, 23, 0]
    @played_notes = []
    @sprite_black = Sprite.new
    @sprite_black.bitmap = Bitmap.new(1, 1)
    @sprite_white = Sprite.new
    @sprite_white.bitmap = Bitmap.new(1, 1)
    @sprite_black_top = Sprite.new
    @sprite_black_top.bitmap = Bitmap.new(1, 1)
    load_background
    auswahl
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    $game_map.need_refresh=true
    Graphics.freeze
    loesche_grafiken
  end
#-------------------------------------------------------------------------------
#--------------------------- Alle benötigten Methoden --------------------------
#-------------------------------------------------------------------------------
  def update
    @old_cursor =  @cursor
    sustain_pedal?
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
    end
    if Input.repeat?(Input::RIGHT)
      @cursor += 1 unless @cursor == 25
    end
    if Input.repeat?(Input::LEFT)
      @cursor -= 1 unless @cursor == 1
    end
    if Input.trigger?(Input::C)
      if sustain_pedal?
      play_note
      else
      Audio.se_stop
      play_note
      end
    end
    refresh
  end
 
  def sustain_pedal? 
    if @instrument == "Piano"
       if Input.press?(Input::SHIFT)
        return true
        else
        return false
      end
    end
  end
 
  def compare_songs
    @songs.each {|key, value|
    next if $game_switches[value] == true
    if @played_notes.compare?(key)
      $game_switches[value] = true
    end }
  end
 
#-------------------------------------------------------------------------------
#------------------ Hier werden Grafiken erstellt und geladen ------------------
#-------------------------------------------------------------------------------
 
  def load_background
    @sprite_bg = Sprite.new
    @sprite_bg.bitmap = Bitmap.new(640, 480)
    rechteck = @sprite_bg.bitmap.rect
    @sprite_bg.bitmap.fill_rect(rechteck, @braun)
    rechteck.x = 145 
    rechteck.y = 220
    rechteck.width = 350
    rechteck.height = 12
    @sprite_bg.bitmap.fill_rect(rechteck, Color.new(0, 0, 0))
    rechteck.x += 1
    rechteck.y += 1
    rechteck.width -= 2
    rechteck.height -= 2
    @sprite_bg.bitmap.fill_rect(rechteck, @dunkelbraun)
    @sprite_klaviatur = Sprite.new
    @sprite_klaviatur.bitmap = RPG::Cache.picture("Klaviatur")
    if @noten != nil
      load_noten
    end
  end
 
  def load_noten
    @sprite_noten = Sprite.new
    @sprite_noten.bitmap = Bitmap.new(640, 480)
    notenblatt = RPG::Cache.picture(@noten)
    @sprite_noten.bitmap.blt(160, 20, notenblatt, notenblatt.rect)
  end
 
  def load_white_keys_bottom(index)
    @sprite_white = Sprite.new
    @sprite_white.bitmap = Bitmap.new(38, 228)
    @sprite_white.x = 21 + index * 40
    @sprite_white.y = 241
    rechteck = @sprite_white.bitmap.rect
    @sprite_white.bitmap.fill_rect(rechteck, @chosencolor)
  end
 
  def load_black_keys(index)
    @sprite_black = Sprite.new
    @sprite_black.bitmap = Bitmap.new (32, 150)
    @sprite_black.x = 44 + index * 40
    @sprite_black.y = 240
    rechteck = @sprite_black.bitmap.rect
    @sprite_black.bitmap.fill_rect(rechteck, @chosencolor)
  end  
 
  def load_black_keys_top(index)
    @sprite_black_top = Sprite.new
    @sprite_black_top.bitmap = Bitmap.new (32, 150)
    @sprite_black_top.x = 44 + index * 40
    @sprite_black_top.y = 240
    rechteck = @sprite_black_top.bitmap.rect
    @sprite_black_top.bitmap.fill_rect(rechteck, Color.new(0, 0, 0))
  end  
 
  def auswahl
    @white_keys.each do |element|
    next if element != @cursor  
    load_white_keys_bottom(@white_keys.index(element))
    end
    @black_keys.each do |element|
    next if element != @cursor
    load_black_keys(@black_keys.index(element)) unless element == 0
    end
    a = @cursor + 1
    b = @cursor - 1
    @black_keys.each do |element|
    load_black_keys_top(@black_keys.index(element)) if element == a and element != 0
    load_black_keys_top(@black_keys.index(element)) if element == b and element != 0
    end
  end
 
  def play_note
    Audio.se_play("Audio/SE/#{@instrument}/" + @cursor.to_s)
    @played_notes.push(@cursor)
    compare_songs if @compare == true
  end
 
  def loesche_auswahl
    if @sprite_black.disposed? == false
    @sprite_black.dispose
    @sprite_black.bitmap.dispose
    end
    if @sprite_white.disposed? == false
    @sprite_white.dispose
    @sprite_white.bitmap.dispose
    end
    if @sprite_black_top.disposed? == false
    @sprite_black_top.dispose
    @sprite_black_top.bitmap.dispose
    end
  end
 
  def loesche_noten
    @sprite_noten.bitmap.clear
  end
 
  def loesche_grafiken
    loesche_auswahl
    loesche_noten if @noten != nil
    @sprite_klaviatur.dispose
    @sprite_klaviatur.bitmap.dispose
    @sprite_bg.bitmap.clear
  end
 
  def refresh
   if @cursor != @old_cursor 
    loesche_auswahl
    auswahl
  end
end
end
 
#-------------------------------------------------------------------------------
#-------Methode zum Vergleich von Arrays von schM0ggi und Mustamakkara----------
#-------------------------------------------------------------------------------
 
class Array
 
  def compare?(array2)
    check = array2 & self
    return false unless check == array2&array2
    check = array2[0]
    self.each_with_index do |e, i|
      next unless check == e
      check2 = self.slice(i, array2.size)
      next unless check2 == array2
      return true
    end 
    return false
  end
 
end
highlight to read


Viel Spaß beim Klimpern :musta:

Anmerkung: Dies ist mein erstes Script, also würde ich mich besonders über Feedback freuen, vor allem zu schlechtem Stil, umständlichen Formulierungen und dergleichen.
Danke an schM0ggi für die Hilfe bei der compare?-Methode.



Edit:
  • Hier eine Variante, die auch mit der VXAce-Engine funktioniert:
    Spoiler: Quellcode

    Ruby Source code

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    
    #-------------------------------------------------------------------------------
    #-------------------------Fun-Tasten v1.0 by Mustamakkara-----------------------
    #
    # Darf unter Angabe von Credits sowohl in kommerziellen als auch nichtkommerziellen
    # Projekten verwendet werden.
    # Das Script befindet sich zum Download auf www.rpg-studio.org. Darf nicht auf
    # anderen Seiten hochgeladen werden, sondern es darf ausschließlich auf den 
    # Original-Thread verwiesen werden.
    #-------------------------------------------------------------------------------
     
    class Scene_Piano
     
    # Ermöglicht es, ein beliebiges Tasteninstrument zu spielen. Dies gelingt über
    # ein Call Script:
    #     $scene = Scene_Piano.new(instrument, noten, vergleich)
    # Die Parameter sind nicht notwendig. 
    #
    # Beispiele:
    #
    #     $scene = Scene_Piano.new 
    #
    # =>  Öffnet ein Klavier ohne Noten, bei dem die gespielten Noten mit vorher 
    #     angegebenen Melodien verglichen werden.
    #
    #
    #     $scene = Scene_Piano.new(2, "Fuer Elise", false) 
    #
    # =>  Öffnet eine Orgel mit dem Notenblatt zu "Für Elise", bei dem nichts
    #     verglichen wird.
    #
    #
    # Soll das Gespielte mit hinterlegten Tonfolgen verglichen werden, so lassen sich
    # diese hier festlegen:
     
    SONG1 = [13, 15, 17, 18, 20, 20, 22, 22, 22, 22, 20, 18, 18, 18, 18, 17, 17, 15, 15, 15, 15, 13]
    #AlleMeineEntchen
    SONG2 = [13, 20, 18, 20, 23, 20]
    #X-Files
     
    # SONG3 = [1, 3, 5, 6, 8, 10, 12, 13, 15, 17, 18, 20, 22, 24, 25]
    # Alle weißen Tasten.
    # usw...
     
    # Dabei stehen die Zahlen für die Tasten im Klavier von links nach rechts.
    # 1 => Tiefes C
    # 2 => Tiefes C#
    # 3 => Tiefes D
    # ...
    # 25 => Hohes C
     
    # # Die Sounddateien müssen von 1-25 benannt sein und sich im Ordner 
    # Audio/SE/"Name des Instruments" befinden.
    # Hält man die SHIFT-Taste gedrückt, wird das Sustain-Pedal aktiviert (das ist
    # das rechte Pedal am Klavier). Dies ist nur in der Klavier-Einstellung möglich
    # (Cembali und Orgeln haben kein Sustain-Pedal).
    # Die Notenblätter müssen sich im Pictures-Ordner befinden und 320x220 px groß 
    # sein. Andere Größen sind prinzipiell möglich, dann muss aber die Position des
    # Notenblattes in der Methode load_noten angepasst werden.
     
      def initialize(instrument = 0, noten = nil, vergleich = true)
        case instrument
        when 1
          @instrument = "Harpsichord"
        when 2
          @instrument = "Church Organ"
    # Hier können beliebig viele Instrumente angegeben werden. 
    # Vielleicht ein Akkordeon?      
        else
          @instrument = "Piano"
        end
        @noten = noten
        @compare = vergleich
      end
     
    #-------------------------------------------------------------------------------
    #---------------------------Hier fängt das Script an----------------------------
    #-------------------------------------------------------------------------------
     
      def main
     
    #-------------------------------------------------------------------------------
    #-------------------- Hier könnt ihr Einstellungen anpassen --------------------
    #-------------------------------------------------------------------------------
     
        @songs = { SONG1 => 2 , SONG2 => 3 } # Welcher gespielte Song aktiviert welchen Switch?
        @cursor = 13 # Startpunkt der Auswahl (Mittleres C)
        @chosencolor = Color.new(255, 255, 50) # Farbe der ausgewählten Taste
        @braun = Color.new(139, 69, 19) # Farbe des Klaviers
        @dunkelbraun = Color.new(120, 50, 0) # Farbe des Notenständers
     
    #-------------------------------------------------------------------------------
    #-------------------- Ab hier bitte nichts mehr ändern -------------------------
    #-------------------------------------------------------------------------------
     
        @white_keys = [1, 3, 5, 6, 8, 10, 12, 13, 15, 17, 18, 20, 22, 24, 25]
        @black_keys = [2, 4, 0 , 7, 9, 11, 0, 14, 16, 0, 19, 21, 23, 0]
        @played_notes = []
        @sprite_black = Sprite.new
        @sprite_black.bitmap = Bitmap.new(1, 1)
        @sprite_white = Sprite.new
        @sprite_white.bitmap = Bitmap.new(1, 1)
        @sprite_black_top_left = Sprite.new
        @sprite_black_top_left.bitmap = Bitmap.new(1, 1)
        @sprite_black_top_right = Sprite.new
        @sprite_black_top_right.bitmap = Bitmap.new(1, 1)
        load_background
        auswahl
        Graphics.transition
        loop do
          Graphics.update
          Input.update
          update
          if $scene != self
            break
          end
        end
        $game_map.need_refresh=true
        Graphics.freeze
        loesche_grafiken
      end
    #-------------------------------------------------------------------------------
    #--------------------------- Alle benötigten Methoden --------------------------
    #-------------------------------------------------------------------------------
      def update
        @old_cursor =  @cursor
        sustain_pedal?
        if Input.trigger?(Input::B)
          $game_system.se_play($data_system.cancel_se)
          $scene = Scene_Map.new
        end
        if Input.repeat?(Input::RIGHT)
          @cursor += 1 unless @cursor == 25
        end
        if Input.repeat?(Input::LEFT)
          @cursor -= 1 unless @cursor == 1
        end
        if Input.trigger?(Input::C)
          if sustain_pedal?
          play_note
          else
          Audio.se_stop
          play_note
          end
        end
        refresh
      end
     
      def sustain_pedal? 
        if @instrument == "Piano"
           if Input.press?(Input::SHIFT)
            return true
            else
            return false
          end
        end
      end
     
      def compare_songs
        @songs.each {|key, value|
        next if $game_switches[value] == true
        if @played_notes.compare?(key)
          $game_switches[value] = true
        end }
      end
     
    #-------------------------------------------------------------------------------
    #------------------ Hier werden Grafiken erstellt und geladen ------------------
    #-------------------------------------------------------------------------------
     
      def load_background
        @sprite_bg = Sprite.new
        @sprite_bg.bitmap = Bitmap.new(640, 480)
        rechteck = @sprite_bg.bitmap.rect
        @sprite_bg.bitmap.fill_rect(rechteck, @braun)
        rechteck.x = 145 
        rechteck.y = 220
        rechteck.width = 350
        rechteck.height = 12
        @sprite_bg.bitmap.fill_rect(rechteck, Color.new(0, 0, 0))
        rechteck.x += 1
        rechteck.y += 1
        rechteck.width -= 2
        rechteck.height -= 2
        @sprite_bg.bitmap.fill_rect(rechteck, @dunkelbraun)
        @sprite_klaviatur = Sprite.new
        @sprite_klaviatur.bitmap = RPG::Cache.picture("Klaviatur")
        if @noten != nil
          load_noten
        end
      end
     
      def load_noten
        @sprite_noten = Sprite.new
        @sprite_noten.bitmap = Bitmap.new(640, 480)
        notenblatt = RPG::Cache.picture(@noten)
        @sprite_noten.bitmap.blt(160, 20, notenblatt, notenblatt.rect)
      end
     
      def load_white_keys_bottom(index)
        @sprite_white = Sprite.new
        @sprite_white.bitmap = Bitmap.new(38, 228)
        @sprite_white.x = 21 + index * 40
        @sprite_white.y = 241
        rechteck = @sprite_white.bitmap.rect
        @sprite_white.bitmap.fill_rect(rechteck, @chosencolor)
      end
     
      def load_black_keys(index)
        @sprite_black = Sprite.new
        @sprite_black.bitmap = Bitmap.new(32, 150)
        @sprite_black.x = 44 + index * 40
        @sprite_black.y = 240
        rechteck = @sprite_black.bitmap.rect
        @sprite_black.bitmap.fill_rect(rechteck, @chosencolor)
      end  
     
      def load_black_keys_top_left(index)
        new_viewport = Viewport.new(0, 0, 640, 480)
        new_viewport.z = 10000
        @sprite_black_top_left = Sprite.new(new_viewport)
        @sprite_black_top_left.bitmap = Bitmap.new(32, 150)
        @sprite_black_top_left.x = 44 + index * 40
        @sprite_black_top_left.y = 240
        rechteck = @sprite_black_top_left.bitmap.rect
        @sprite_black_top_left.bitmap.fill_rect(rechteck, Color.new(0, 0, 0))
      end  
     
        def load_black_keys_top_right(index)
        new_viewport = Viewport.new(0, 0, 640, 480)
        new_viewport.z = 10000
        @sprite_black_top_right = Sprite.new(new_viewport)
        @sprite_black_top_right.bitmap = Bitmap.new(32, 150)
        @sprite_black_top_right.x = 44 + index * 40
        @sprite_black_top_right.y = 240
        rechteck = @sprite_black_top_right.bitmap.rect
        @sprite_black_top_right.bitmap.fill_rect(rechteck, Color.new(0, 0, 0))
      end  
     
      def auswahl
        @white_keys.each do |element|
        next if element != @cursor  
        load_white_keys_bottom(@white_keys.index(element))
        end
        @black_keys.each do |element|
        next if element != @cursor
        load_black_keys(@black_keys.index(element)) unless element == 0
        end
        a = @cursor + 1
        b = @cursor - 1
        @black_keys.each do |element|
        if element != 0 
        load_black_keys_top_right(@black_keys.index(element)) if element == a  
        load_black_keys_top_left(@black_keys.index(element)) if element == b
        end
        end
      end
     
      def play_note
        Audio.se_play("Audio/SE/#{@instrument}/" + @cursor.to_s)
        @played_notes.push(@cursor)
        compare_songs if @compare == true
      end
     
      def loesche_auswahl
        if @sprite_black_top_left.disposed? == false
        @sprite_black_top_left.dispose
        @sprite_black_top_left.bitmap.dispose
        end
        if @sprite_black_top_right.disposed? == false
        @sprite_black_top_right.dispose
        @sprite_black_top_right.bitmap.dispose
        end
        if @sprite_black.disposed? == false
        @sprite_black.dispose
        @sprite_black.bitmap.dispose
        end
        if @sprite_white.disposed? == false
        @sprite_white.dispose
        @sprite_white.bitmap.dispose
        end
      end
     
      def loesche_noten
        @sprite_noten.bitmap.clear
      end
     
      def loesche_grafiken
        loesche_auswahl
        loesche_noten if @noten != nil
        @sprite_klaviatur.dispose
        @sprite_klaviatur.bitmap.dispose
        @sprite_bg.bitmap.clear
      end
     
      def refresh
       if @cursor != @old_cursor 
        loesche_auswahl
        auswahl
      end
    end
    end
     
    #-------------------------------------------------------------------------------
    #-------Methode zum Vergleich von Arrays von schM0ggi und Mustamakkara----------
    #-------------------------------------------------------------------------------
     
    class Array
     
      def compare?(array2)
        check = array2 & self
        return false unless check == array2&array2
        check = array2[0]
        self.each_with_index do |e, i|
          next unless check == e
          check2 = self.slice(i, array2.size)
          next unless check2 == array2
          return true
        end 
        return false
      end
     
    end
    highlight to read

  • Die Klaviatur-Grafik in der Demo hat ein paar verrutschte schwarze Tasten. Hier eine begradigte Version: Attachment 24198
:musta:

This post has been edited 1 times, last edit by "Mustamakkara" (Feb 9th 2020, 2:46pm) with the following reason: Version für XPAce hinzugefügt. Verbesserte Klaviatur-Grafik.


Playm

RPG Studio Webmaster

  • Send private message

2

Sunday, February 9th 2020, 7:42pm

Das ist cool. Das Script sieht schön aus. Für meinen Geschmack würde ich die Sprache der Methodennamen einheitlich halten und auf Englisch bleiben, aber das ist nur mein Geschmack.

Habe jetzt nur die normale Demo ausprobiert und nicht in das Ace-Script geguckt. Was mir bei der Demo aber aufgefallen ist: Kann man nicht nur die 13.ogg benutzen und dann den Pitch hoch und runter drehen, um auf die meisten anderen Tasten zu kommen?

Quoted from "RGSS Doku"

Audio.se_play(filename[, volume[, pitch]])
Starts SE playback. Sets the file name, volume, and pitch in turn.


Edit PS: Du kannst die 1x1 Bitmaps weglassen. Ist mir gerade aufgefallen, dass Du die warum auch immer drin hattest

Ruby Source code

98
99
100
101
102
    @sprite_black = Sprite.new
 
    @sprite_white = Sprite.new
 
    @sprite_black_top = Sprite.new

Mustamakkara

Blutwurst der Verdammnis

  • "Mustamakkara" started this thread

Motto: Zuhause ist da, wo du deine Schuhe ausziehen kannst.

  • Send private message

3

Sunday, February 9th 2020, 8:32pm

Quoted

Das ist cool. Das Script sieht schön aus.

Danke :D

Quoted

Kann man nicht nur die 13.ogg benutzen und dann den Pitch hoch und runter drehen, um auf die meisten anderen Tasten zu kommen?

Das war auch mein erster Gedanke. Dagegen sprechen aber einige Dinge:
  • Die Pitch-Änderung des Makers ist nicht musikalisch. Vielmehr wird die betreffende Wellenform einfach nur gestaucht oder gestreckt, wodurch sich nicht nur die Tonhöhe, sondern auch die Geschwindigkeit ändert. Somit würde die 25 als verdoppelte 13 viermal so schnell verklingen wie die 1 als halbierte 13.
  • Man findet eben nur die meisten anderen Tasten sauber. Die ersten paar Obertöne (also 25, 20 und 18 ) kriegt man noch recht zuverlässig, aber die anderen Töne klingen schon leicht schief.
  • Die Nutzerfreundlichkeit fürs Einfügen von Melodien leidet ebenfalls. Es ist schon abstrakt genug, die Zahlen von 1 bis 25 zu verwenden. Stattdessen Werte von 50 bis 200 zu benutzen, ist noch weniger intuitiv.


Quoted

Du kannst die 1x1 Bitmaps weglassen. Ist mir gerade aufgefallen, dass Du die warum auch immer drin hattest

In irgendeinem Entwicklungsstand des Scripts habe ich Fehlermeldungen bekommen, weil ich Bitmaps disposed habe, die noch nicht initialisiert wurden. Stimmt aber, jetzt können sie auch weg :)
:musta:

Similar threads

Social bookmarks