본문 바로가기
개발일지/기타

[QT] QT creator - 간단 작곡 코드 생성 프로그램 만들기(C++) - 5 종료 버튼, 멜로디 듣기 버튼

by 라이티아 2024. 5. 20.

현재 듣고있는곡

ドーピングダンス / miku

 

 

 

 

종료버튼을 만들어보자

 

버튼을 하나 만들어 준 뒤,

 

버튼을 누르면 프로그램이 종료된다

 

여기에 사운드를 붙여보자


void MainWindow::on_out_btn_clicked()
{
    out->play();
    //QApplication::quit();
}

 

이렇게 해주면 소리는 나지만, 문제는 소리가 나기 전에 종료가 되버린다

 

그렇다면, 소리가 끝난 뒤, 프로그램이 꺼지도록 해보자

 

out->play();

    QTimer *timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, [=]() {
        if (out->mediaStatus() == QMediaPlayer::EndOfMedia) {
            QApplication::quit();
        }
    });
    timer->start(100);

 

time을 사용한 방법이다

 

 

 

이제 멜로디를 들을 수 있도록 만들어 보자

 

QT에 Vocaloid 4 miku의 소리를 각 음계별로 담아두었다

 

이 소리들을 이용해서 멜로디를 들을 수 있도록 해보려 한다

 

소리를 들을 수 있는 버튼을 만든다

이제 버튼을 누르면 소리가 나오게 세팅해보자

 

 

문제가 생겼다

 

높은 도부터는 make_chord 함수로 만들어도 랜덤으로 들어가게 만들어 놔서 이렇게 하면 음계가 맞지 않다

 

해결할려면 make_chord함수를 수정해야 한다

 

 

높은음도 생성하도록 찢어주자

 

그저 노가다....

전부 찢어주었다

void MainWindow::on_voice_clicked()
{
    disconnect(p_voice, &QMediaPlayer::mediaStatusChanged, this, &MainWindow::handleMediaStatusChanged);
    //connect(p_voice, &QMediaPlayer::mediaStatusChanged, this, &MainWindow::handleMediaStatusChanged);
    connect(p_voice, &QMediaPlayer::mediaStatusChanged, this, &MainWindow::handleMediaStatusChanged);


    currentMelodyIndex = 0;
    playNextMelody();
}

void MainWindow::handleMediaStatusChanged(QMediaPlayer::MediaStatus status)
{
    if (status == QMediaPlayer::EndOfMedia)
    {
        currentMelodyIndex++;
        if (currentMelodyIndex < 32)
        {
            playNextMelody();
            qDebug() << currentMelodyIndex;
        }
        else
        {
            qDebug() << "Melody playback completed.";
        }
    }
}

void MainWindow::playNextMelody()
{
    switch (melody[currentMelodyIndex])
    {
    case 'C':
        p_voice->setSource(QUrl("qrc:/sounds/voice/C.wav"));
        break;
    case 'D':
        p_voice->setSource(QUrl("qrc:/sounds/voice/D.wav"));
        break;
    case 'E':
        p_voice->setSource(QUrl("qrc:/sounds/voice/E.wav"));
        break;
    case 'F':
        p_voice->setSource(QUrl("qrc:/sounds/voice/F.wav"));
        break;
    case 'G':
        p_voice->setSource(QUrl("qrc:/sounds/voice/G.wav"));
        break;
    case 'A':
        p_voice->setSource(QUrl("qrc:/sounds/voice/A.wav"));
        break;
    case 'B':
        p_voice->setSource(QUrl("qrc:/sounds/voice/B.mp3"));
        break;
    case 'c':
        p_voice->setSource(QUrl("qrc:/sounds/voice/CH.mp3"));
        break;
    case 'd':
        p_voice->setSource(QUrl("qrc:/sounds/voice/DH.mp3"));
        break;
    case 'e':
        p_voice->setSource(QUrl("qrc:/sounds/voice/EH.mp3"));
        break;
    case 'f':
        p_voice->setSource(QUrl("qrc:/sounds/voice/FH.mp3"));
        break;
    case 'g':
        p_voice->setSource(QUrl("qrc:/sounds/voice/GH.mp3"));
        break;
    default:
        return;
    }
    p_voice->play();
}

그후 버튼을 누르면 차례대로 멜로디가 나오도록 만들어준다