• Login

Playm

RPG Studio Webmaster

  • "Playm" started this thread
  • Send private message

1

Saturday, March 14th 2020, 12:45am

[RMXP] Scriptbarer MIDI Output: Selbst Töne erzeugen im Maker

Hallo, heute bringe ich euch ein Script was an sich erst mal ein Werkzeug für andere Scripter ist und so direkt kein Gameplay-Element mit sich bringt.


Bei diesem Script handelt es sich um einen per Ruby steuerbaren Zugriff auf den MidiOutput des Computers. Den gleichen den Audio.me_play und Audio.bgm_play verwenden, um MIDI-Soundfiles abzuspielen. Das Besondere ist, das ihr beliebige Noten auf einem beliebigen Midi-Instrument abspielen könnt. Ihr habt also Lust plötzlich das hohe C auf einer Tuba erklingen zu lassen? Oder doch lieber Cello oder Pan Flöte? Kein Problem mehr.

Das Script findet ihr hier:

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
#==============================================================================
# ** MIDI Output im RPG Maker
#------------------------------------------------------------------------------
# Dieses Script ist ein Tool, um damit Spielmechaniken oder weitere Scripts
# zu erstellen. Es ist für sich alleine noch kein Beitrag zum Spiel.
# 
# Dieses Script erlaubt einen scriptbaren MIDI-Output zu erstellen und über 
# diese MIDI-Noten auszugeben. Es werden keine weiteren Dateien im  Spiel-
# ordner benötigt.
# 
# Erzeugt euch einen neues Objekt bei Spielstart:
#   $playms_cello = MIDI_OUTPUT.new
# 
# Euch stehen alle im MIDI-SoundFont verfügbaren Musikinstrumente zur Verfügung, 
# wir wollen hier ein Cello imitieren, also wählen wir Voice#43:
#   $playms_cello.set_instrument( 43 )
# 
# Und jetzt können wir ein paar Noten erklingen lassen:
#   $playms_cello.play_note(48)
#   sleep(0.5)
#   $playms_cello.play_note(49)
#   sleep(0.5)
#   $playms_cello.play_note(50)
#   sleep(0.5)
#   $playms_cello.play_note(51)
#   sleep(2)
# 
# Wenn wir den MIDI Output nicht mehr benötigen, schließen wir ihn:
#   $playms_cello.close()
# 
# Wie Audio.me_stop() kann auch unser MIDI Output gestoppt werden:
#   $playms_cello.stop()
#------------------------------------------------------------------------------
#  Autor: Playm
#  Maker: RPG Maker XP
#  Einfache Nutzung in nicht-kommerziellen  RMXP  Projekten ist gestattet.
#  Für die Erlaubnis zur  kommerziellen Nutzung bitte an den Autor wenden.
#  Keine Weiterverbreitung in originaler oder abgeänderter Form gestattet.
#==============================================================================
# * MIDI OUTPUT
#==============================================================================
class MIDI_OUTPUT
  attr_reader :handle
  def initialize
    handle      = [0].pack('i')
    midiOutOpen = Win32API.new('winmm.dll', 'midiOutOpen', 'plpii', 'i')
    # Open Output
    result  = midiOutOpen.call( handle, 0, nil, 0, 0 )
    @handle = handle.unpack('i').first
    # API
    @midiOutShortMsg = Win32API.new('winmm.dll', 'midiOutShortMsg', 'il', 'i')
    @midiOutReset = Win32API.new('winmm.dll', 'midiOutReset', 'i', 'i')
  end
  def close
    return nil if closed?
    Win32API.new('winmm.dll', 'midiOutClose', 'i', 'i').call(@handle)
    @handle = nil
  end
  def closed?
    @handle.nil?
  end
  def set_instrument( voice_number )
    return nil if closed?
    msg = (256 * voice_number) + 192
    @midiOutShortMsg.call(@handle, msg)
  end
  def play_note( midi_note, volume=127 )
    return nil if closed?
    msg = [144, midi_note, volume, 0].pack('cccc').unpack('V').first
    @midiOutShortMsg.call(@handle, msg)
  end
  def stop()
    @midiOutReset.call(@handle) if not closed?
  end
end


  • :light-bulb: Ideen

    Hier findet ihr Ideen, was man mit dem Script machen könnte. :gamer:
    Weitere Ideen folgen, wenn sie mir einfallen. Oder postet einfach gute Ideen hier in den Thread. :-)
  • :music: Anwendungsbeispiel: Fun-Tasten

    Die originale Idee für das Script hatte ich, als ich Mustas "Fun-Tasten" - Klavierscript von Mustamakkara gesehen habe. Musta hatte sich für sein Script entschieden, dafür vorgefertigte Sound-Files im Spielordner abzulegen. Wenn man das Script hier im Thread mit seinem kombiniert, kann man aber auf die Dateien verzichten und die einzelnen Töne live vom eigenen Computer erzeugen lassen. Ich habe mit Musta abgesprochen, dass ich euch eine Anleitung posten darf, wie ihr die beiden Scripte kombiniert. Dafür müsst ihr beide Scripte im Sciprteditor eingefügt haben und dann in seinem Script an ein paar Stellen Anpassungen vornehmen.

    Ab Zeile 60 in der initialize-Methode müsst ihr vier Zeilen einfügen. Einmal direkt am Anfang, um den MIDI-Output zu öffnen und dann bei der Auswahl der Instrumente:

    Ruby Source code

    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    
      def initialize(instrument = 0, noten = nil, vergleich = true)
        @midi_output = MIDI_OUTPUT.new # Neu
        case instrument
        when 1
          @instrument = "Harpsichord"
          @midi_output.set_instrument(7) # Neu
        when 2
          @instrument = "Church Organ"
          @midi_output.set_instrument(20) # Neu
    # Hier können beliebig viele Instrumente angegeben werden. 
    # Vielleicht ein Akkordeon?      
        else
          @instrument = "Piano"
          @midi_output.set_instrument(1) # Neu
        end
        @noten = noten
        @compare = vergleich
      end

    Die Kirchenorgel war bei mir irgendwie ein bisschen buggy. Aber das ignoriere ich mal.

    Den Output müssen wir am Ende der Main-Methode, wenn wir auch die Grafiken entfernen, wieder schließen:

    Ruby Source code

    120
    121
    122
    
        Graphics.freeze
        loesche_grafiken
        @midi_output.close # Neu


    Anschließend in der Update-Methode noch das Audio.se_stop durch unseren eigenen Stop-Ersetzen:

    Ruby Source code

    144
    145
    
          #Audio.se_stop
          @midi_output.stop()


    Und schließlich bei play_note noch das Abspielen der Sounddateien ersetzen:

    Ruby Source code

    247
    248
    249
    
      def play_note
        #Audio.se_play("Audio/SE/#{@instrument}/" + @cursor.to_s)
        @midi_output.play_note( 47 + @cursor )


    Zack, fertig ist es und das Script funktioniert auch ohne extra Dateien im Audio-Ordner.


Das Script erlaubt ja ein Instrument zu wählen. Die Nummern (1-128) könnt ihr in der Liste auf Wikipedia nachgucken: General MIDI#Programm wechsel

Josey

Storyteller

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Send private message

2

Monday, March 30th 2020, 8:50pm

Das ist super genial! :D
Jetzt bitte noch ein Short-Output, ohne den Maker exta starten zu müssen, damit ich anhören kann, obs gut klingt! XD
So könnte man glatt ein ganzes Lied komponieren, ohne eine Datei im Ordner haben zu müssen! :D
Notfalldiscord: Hier klicken


  • Joseys Wuselei

    • Meine Story - Pausiert
      Lust auf Abenteuer?
      So richtig mit Selbstbestimmung?
      Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
      "Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
      Hier die Antwort:
      Bild
      Bild
      Hier könnt ihr euren Lieblingschar wählen ;D
      Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt.
    • Meine Arbeiten
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (Mein) Autismus
      Ich bin im autistischen Sprektrum-
      sollte ich mich komisch verhalten, oder unhöflich wirken
      (oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
      ist das nicht beabsichtigt.


      Josey. Epicgarantie.
      Nehmt das bloß nicht ernst! D:
    • Meine Welt
      Mein Ehemann Kain! :heart_full: :*
      Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
      Er verdient einfach einen Platz ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • Mein Support
      Der In-Game-Charset-Generator!
      Erstelle Random-NPCs mit Charsetteilen!

      Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
      Bastelt mal Banner! : D

    • Meine beendeten Contests
      [Pixelcontest] Rund um den Kürbis
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: Scripted Desaster
      ("nicht ganz so ernstes Projekt")

      Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
      Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
      Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.

      Das bedeutet doch Spaß...
    • Pokémon EV
      :rmxp: Pokemon EV
      ("Zeitvertreib nebenbei - Kreatief-Helfer")

      Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
      Ist inzwischen alles schonmal dagewesen. XD
    • Lost Island
      :rmxp: Harvest Moon - Lost Island
      (Arbeitstitel, "Eventtechnik-Projekt")

      Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
      Das Spiel ist ein Harvest Moon Abklatsch. XD
      Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
  • Joseys Fortschritt

    • Endless Ending
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 00%
      Das macht richtig Spaß XD
  • Huiii

    Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.

Playm

RPG Studio Webmaster

  • "Playm" started this thread
  • Send private message

3

Wednesday, April 1st 2020, 11:40am

Quoted

Jetzt bitte noch ein Short-Output
was meinst Du damit?

Ruby Source code

1
So könnte man glatt ein ganzes Lied komponieren, ohne eine Datei im Ordner haben zu müssen!
da müsste man jetzt Mustamakkara fragen, wo der Unterschied zwischen einer Ruby-Scriptdatei, die einzelne Miditöne abspielt und einer .midi-Datei ist. Ich glaube viel spart man da nicht, wenn man ganze Lieder so spielen möchte. Aber ich verstehe deine Idee total :D

Mustamakkara

Blutwurst der Verdammnis

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

  • Send private message

4

Wednesday, April 1st 2020, 11:49am

Quoted

da müsste man jetzt Mustamakkara fragen, wo der Unterschied zwischen einer Ruby-Scriptdatei, die einzelne Miditöne abspielt und einer .midi-Datei ist.

Im Endeffekt ist es das Gleiche. Spoileralarm:
Spoiler
Es gibt praktischere Midi-Editoren als den Scripteditor im Maker.
highlight to read

Zum Komponieren ist das Script also zwar nutzbar, aber doch auch echt umständlich :D

Ist aber ne coole Sache, wenn man nur ein paar einzelne Töne triggern möchte. Zum Beispiel Soundeffekte für irgendwelche Dinge, oder wenn man ein spielbares Klavier haben will, oder warum fällt mir jetzt der Singing Stone aus Stardew Valley ein? Oder lustige Fußmatten, die einzelne Drum-Sounds spielen.
:musta:

Playm

RPG Studio Webmaster

  • "Playm" started this thread
  • Send private message

5

Wednesday, April 1st 2020, 12:02pm

Ich muss eher an den Musikblock aus Minecraft denken, der einzelne Noten abspielt wenn man ihn mit Power versorgt.

Josey

Storyteller

Motto: "Was du nicht willst, das man dir tu', füge keinem And'ren zu!"

  • Send private message

6

Thursday, April 2nd 2020, 3:13pm

Quoted

Quoted

Jetzt bitte noch ein Short-Output


was meinst Du damit?

Momentan müsste man die Noten ins Script schreiben, dann den Maker öffnen und das Script triggern, um die Noten zu hören, korrekt?
Ich meinte, du könntest ein kleines Programm basteln, in dem man die Noten reinschreiben und per "Abspielen" einmal anhören kann. Wenn alles passt, kann man die Scriptzeilen, wie sie sind, aus dem Programm kopieren und in das Script im Maker reinpacken XD


Ich kann damit also auch mein Klavier bestücken?
Wo ist denn dann der Vorteil, zu vielen kleinen Mididateien als Note von c-c1? :(
Notfalldiscord: Hier klicken


  • Joseys Wuselei

    • Meine Story - Pausiert
      Lust auf Abenteuer?
      So richtig mit Selbstbestimmung?
      Und mit was Spannendem? Zum Spielen? Ohne Schokolade?
      "Eines, das mit dem leistungsstärksten Grafikchip der Welt läuft? Deiner Vorstellungskraft?"
      Hier die Antwort:
      Bild
      Bild
      Hier könnt ihr euren Lieblingschar wählen ;D
      Und hier findet ihr das Minigame, das ab und an den Würfel ersetzt.
    • Meine Arbeiten
      Einige Ressourcen, vor allem Baby-Tiere, aber auch alle Requests, die ich erfüllt habe.
      Bild

      Bild

      In unregelmäßigen Abständen fasse ich alles Neue, was so im Studio passiert ist, zusammen. -Pausiert-
      Bild
    • Meine Fähigkeiten
      Maker: :rmxp: XP
      :rainbow: Pixeln: :star: :star: :star: :star: :star-empty: :star-empty:
      :image: Mappen: :star: :star: :star: :star: :star: :star-empty:
      :wrench-screwdriver: Eventen: :star: :star: :star: :star: :star-empty: :star-empty:
      :puzzle: Scripten: :star: :star-half: :star-empty: :star-empty: :star-empty: :star-empty:
      :music: Komponieren: :star-half: :star-empty: :star-empty: :star-empty: :star-empty: :star-empty:
    • (Mein) Autismus
      Ich bin im autistischen Sprektrum-
      sollte ich mich komisch verhalten, oder unhöflich wirken
      (oder mich zu oft entschuldigen, unaufmerksam sein, unsicher wirken, zum zehnten Mal nachfragen, blablabla),
      ist das nicht beabsichtigt.


      Josey. Epicgarantie.
      Nehmt das bloß nicht ernst! D:
    • Meine Welt
      Mein Ehemann Kain! :heart_full: :*
      Freund und Helfer in der Not, immer da, steht er mir mit Rat und Tat zur Seite. Meine andere Hälfte! : D
      Er verdient einfach einen Platz ( :medal: ) in meiner Signatur! XD
      :heart-half:
    • Mein Support
      Der In-Game-Charset-Generator!
      Erstelle Random-NPCs mit Charsetteilen!

      Diese Spiele finde ich toll und brauchen viel mehr Aufmerksamkeit!
      Bastelt mal Banner! : D

    • Meine beendeten Contests
      [Pixelcontest] Rund um den Kürbis
      Bild
      Abstimmung
      Siegerehrung

      Das Wunder der Berge
      Bild
      Abstimmung
      Siegerehrung
    • Meine Contests
      Bild Ein Schreibcontest in Arbeit! : D Bild
  • Joseys Spiele

    • Endless Ending
      :rmxp: Endless Ending
      (Arbeitstitel, "ernstes Projekt")

      Bild

      Eine Reise durch die Wüste.
      Sieben mächtige Gegenstände.
      Unendlich viele Aufgaben.

      Und die Götter haben die Würfel.
    • Scripted Desaster
      :rmxp: Scripted Desaster
      ("nicht ganz so ernstes Projekt")

      Ein verfressener Idiot und ein sarkastischer Workaholic treffen in einem dunklen Wald auf einen weißes Kaninchen...
      Ein Auftragskiller jagt einem Meisterdieb hinterher, wobei nicht ersichtlich ist, wer eigentlich wen jagt...
      Und eine "Kristallhöhle", sowie einen "Wald ohne Wiederkehr" gibts auch.

      Das bedeutet doch Spaß...
    • Pokémon EV
      :rmxp: Pokemon EV
      ("Zeitvertreib nebenbei - Kreatief-Helfer")

      Ist nur ein Pokemonspiel mit üblicher Story und nicht so üblicher Story.
      Ist inzwischen alles schonmal dagewesen. XD
    • Lost Island
      :rmxp: Harvest Moon - Lost Island
      (Arbeitstitel, "Eventtechnik-Projekt")

      Ist momentan mein Hauptprojekt, weil bei EE die Scripts einfach fehlen :<
      Das Spiel ist ein Harvest Moon Abklatsch. XD
      Felder funktionieren, Tiere auch, Grafiken sehen schon gut aus, Maps sind fast fertig. Man kann in die Miene, man kann einkaufen. Auf dem Papier ist alles schon durchgeplant, einiges muss noch umgesetzt werden.
  • Joseys Fortschritt

    • Endless Ending
      :hourglass: Story: 60%
      :foaf: Charas: 20%
      :leaf: Maps: 01%
      :ruby: Zeichnungen: 05%
      :color: Grafiken: 30%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      ...ist nicht viel, huh? ^^°
    • Scripted Desaster
      :hourglass: Story: 10%
      :foaf: Charas: 60%
      :leaf: Maps: 30%
      :ruby: Zeichnungen: 01%
      :color: Grafiken: 60%
      :clipboard: Scripte: 70%
      :music-beam-16: Musik: 00%
      Gut Ding...
    • Pokemon EV
      :hourglass: Story: 60%
      :foaf: Charas: 10%
      :leaf: Maps: 00%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 80%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 70%
      Nicht ernstnehmen XD Das mache ich nur, wenn woanders nix mehr geht...
    • Lost Island
      :hourglass: Story: 100%
      :foaf: Charas: 10%
      :leaf: Maps: 90%
      :ruby: Zeichnungen: 00%
      :color: Grafiken: 60%
      :clipboard: Scripte: 90%
      :music-beam-16: Musik: 00%
      Das macht richtig Spaß XD
  • Huiii

    Bitte klicken Sie weiter. Hier gibt es nichts zu sehen. Nichts. Hören Sie? Nichts.

Similar threads

Social bookmarks