[JAVA] Der Weg zur Erstellung eines Soundspiels 1

Erstellen eines Metronoms und seiner groben Struktur

Seit dem anderen Tag habe ich ein Metronom erstellt, um ein Soundspiel auf Android zu erstellen. Die grobe Zusammensetzung des Metronoms ・ Sie können den BPM selbst einstellen ・ Die Bewegung ist auf 4 Schläge festgelegt ・ Die dem Ton entsprechende Lampe leuchtet jeweils einen Schlag auf. Und so weiter.

Programm erstellen

Ich habe eine App-GUI basierend auf der obigen Konfiguration erstellt. rhythm.PNG

mainactivity.xml


     <ImageView
        android:id="@+id/image1"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginStart="67dp"
        android:layout_marginLeft="67dp"
        android:layout_marginTop="200dp"
        android:layout_marginEnd="24dp"
        android:layout_marginRight="24dp"
        app:layout_constraintEnd_toStartOf="@+id/image2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/en" />

    <ImageView
        android:id="@+id/image2"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginStart="24dp"
        android:layout_marginLeft="24dp"
        android:layout_marginTop="200dp"
        android:layout_marginEnd="24dp"
        android:layout_marginRight="24dp"
        app:layout_constraintEnd_toStartOf="@+id/image3"
        app:layout_constraintStart_toEndOf="@+id/image1"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/en" />

    <ImageView
        android:id="@+id/image3"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginStart="24dp"
        android:layout_marginLeft="24dp"
        android:layout_marginTop="200dp"
        android:layout_marginEnd="24dp"
        android:layout_marginRight="24dp"
        app:layout_constraintEnd_toStartOf="@+id/image4"
        app:layout_constraintStart_toEndOf="@+id/image2"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/en" />

    <ImageView
        android:id="@+id/image4"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginStart="24dp"
        android:layout_marginLeft="24dp"
        android:layout_marginTop="200dp"
        android:layout_marginEnd="67dp"
        android:layout_marginRight="67dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/image3"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/en" />

    <EditText
        android:id="@+id/BpM"
        android:layout_width="192dp"
        android:layout_height="50dp"
        android:layout_marginTop="95dp"
        android:layout_marginEnd="54dp"
        android:layout_marginRight="54dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="120"
        android:textSize="24sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:text="BPM:"
        android:textSize="26sp"
        app:layout_constraintEnd_toStartOf="@+id/BpM"
        app:layout_constraintTop_toTopOf="parent" />


    <Button
        android:id="@+id/strat"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="67dp"
        android:layout_marginLeft="67dp"
        android:layout_marginBottom="102dp"
        android:text="Start"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/End"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="68dp"
        android:layout_marginRight="68dp"
        android:layout_marginBottom="102dp"
        android:text="END"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

Das als nächstes erstellte Programm wird unten beschrieben.

MainActivity.java



import androidx.appcompat.app.AppCompatActivity;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorManager;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.text.InputType;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {
    ImageView Image1,Image2,Image3,Image4;
    int i,Delay;
    float X_Data,Y_Data,Z_Data;
    TextView text1;
    private Timer timer;
    private CountUpTimerTask timerTask;
    private Handler handler = new Handler();
    
    SoundPool soundPool;
    int mp3;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);

        Image1 = findViewById(R.id.image1);
        Image2 = findViewById(R.id.image2);
        Image3 = findViewById(R.id.image3);
        Image4 = findViewById(R.id.image4);
        Button startButton = findViewById(R.id.strat);
        Button endButton = findViewById(R.id.End);
        EditText et = findViewById(R.id.BpM);

        Image1.setImageResource(R.drawable.en);
        Image2.setImageResource(R.drawable.en);
        Image3.setImageResource(R.drawable.en);
        Image4.setImageResource(R.drawable.en);

        //In EditText dürfen nur Zahlen eingegeben werden
        et.setInputType(InputType.TYPE_CLASS_NUMBER);

        //Konvertieren Sie den eingegebenen Wert in den Typ int
        String bpm = ((EditText)findViewById(R.id.BpM)).getText().toString();
        int BPM = Integer.parseInt((bpm));

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        } else {
            AudioAttributes attr = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build();
            soundPool = new SoundPool.Builder()
                    .setAudioAttributes(attr)
                    .setMaxStreams(5)
                    .build();
        }


        mp3 = soundPool.load(this,R.raw.pop,1);

        //STARTButton
        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                i=0;

                String bpm = ((EditText)findViewById(R.id.BpM)).getText().toString();
                int BPM = Integer.parseInt((bpm));
                Delay = 60000/BPM;
                Image1.setImageResource(R.drawable.en);
                Image2.setImageResource(R.drawable.en);
                Image3.setImageResource(R.drawable.en);
                Image4.setImageResource(R.drawable.en);

               if(null != timer){
                   timer.cancel();
                   timer = null;
               }

               timer = new Timer();

               timerTask = new CountUpTimerTask();

               timer.schedule(timerTask,0,Delay);
            }

        });

        //ENDButton
        endButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(null != timer){
                    timer.cancel();
                    timer=null;
                }


                Image1.setImageResource(R.drawable.en);
                Image2.setImageResource(R.drawable.en);
                Image3.setImageResource(R.drawable.en);
                Image4.setImageResource(R.drawable.en);
            }
        });
    }

    class CountUpTimerTask extends TimerTask{
        @Override
        public void run(){
            handler.post(new Runnable() {
                @Override
                public void run() {
                    if (i == 0) {
                        Image1.setImageResource(R.drawable.eng);
                        Image4.setImageResource(R.drawable.en);
                        soundPool.play(mp3,2 , 2, 0, 0, 1f);
                        i++;
                    }
                    else if (i == 1) {
                        Image1.setImageResource(R.drawable.en);
                        Image2.setImageResource(R.drawable.eng);
                        soundPool.play(mp3,2 , 2, 0, 0, 1f);
                        i++;
                    }
                    else if (i == 2) {
                        Image2.setImageResource(R.drawable.en);
                        Image3.setImageResource(R.drawable.eng);
                        soundPool.play(mp3,2 , 2, 0, 0, 1f);
                        i++;
                    }
                    else {
                        Image3.setImageResource(R.drawable.en);
                        Image4.setImageResource(R.drawable.eng);
                        soundPool.play(mp3,2 , 2, 0, 0, 1f);
                        i = 0;
                    }
                }
            });
        }
    }
}

Programmmängel und was als nächstes hinzuzufügen ist

In diesem Programm weiß ich nicht, ob es an Android oder am Programm liegt, aber es gibt eine leichte Verzögerung während des Betriebs. Das möchte ich verbessern. Als nächstes möchte ich hinzufügen, dass ich jedes Mal ein Geräusch machen möchte, wenn ich den Android in verschiedene Richtungen schüttle, und ich versuche derzeit, Änderungen am Beschleunigungssensor in das Metronom zu integrieren.

Recommended Posts

Der Weg zur Erstellung eines Soundspiels 2
Der Weg zur Erstellung eines Soundspiels 3
Der Weg zur Erstellung eines Soundspiels 1
Der Weg zum Erstellen eines Webdienstes (Teil 1)
Der Weg von JavaScript nach Java
Ich habe versucht, den Weihnachtsbaum in einem Lebensspiel zu beleuchten
Der Weg zum Erstellen eines Webdienstes (Teil 2)
Java SE8 Silber ~ Der Weg zum Pass ~
Erstellen eines Servlets in der Liberty-Umgebung
Memorandum zum Bereinigen des Codes Ruby
Der Weg zur Japanisierung von Rails führt zu Fehlermeldungen
Machen Sie einen Rand links vom TextField
Stellen Sie die Zeit von LocalDateTime auf eine bestimmte Zeit ein
Führen Sie Docker in die Anwendung ein, die Sie erstellen
3. Erstellen Sie eine Datenbank für den Zugriff über das Webmodul
Eine kurze Einführung in terasoluna5 finden Sie im folgenden Text
So führen Sie die SpringBoot-App als Dienst aus
Erstellen eines Chinchiro-Spiels mit Ruby 4. Erstellen eines Spielfortschrittsprozesses
Wie erstelle ich einen MOD für Slay the Spire?
Ich möchte der Kommentarfunktion eine Löschfunktion hinzufügen
Erstellen eines lokalen Repositorys
Weg zur REPL (?) Schöpfung (3)
Testfall erstellen
[Java] Ich habe versucht, ein Janken-Spiel zu erstellen, das Anfänger auf der Konsole ausführen können
Weg zur REPL (?) Schöpfung (1)
Weg zur REPL (?) Schöpfung (2)
[Rails] Verarbeitung nach Hinzufügen einer Spalte zur Entwicklertabelle
So machen Sie einen Screenshot mit dem Android Studio-Emulator
SDWebImage: So löschen Sie den Cache für eine bestimmte UIImageView
[Anfänger] Versuchen Sie, mit Java ein einfaches RPG-Spiel zu erstellen ①
So erstellen Sie ein Formular zur Auswahl eines Datums aus dem Kalender
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
[IOS] Was Sie wissen müssen, bevor Sie ein Widget erstellen
Ich möchte eine Methode aufrufen und die Nummer zählen
Ich möchte ein Formular erstellen, um die Kategorie [Schienen] auszuwählen
Erstellen Sie eine Methode, um den Steuersatz in Java zurückzugeben
[Ruby] So rufen Sie den Inhalt des Doppel-Hash ab
So fügen Sie dieselben Indizes in ein verschachteltes Array ein
Ich möchte dem select-Attribut einen Klassennamen geben
Fügen Sie dem Swift-Button (und auch dem Kreis) einen Schatten hinzu.
Ein Memorandum, um den juckenden Ort für Java Gold zu erreichen
[ruby] Erstellen eines Programms, das nur auf bestimmte Bedingungen reagiert
[jsoup] So erhalten Sie die gesamte Dokumentation