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

[QT] QT creator - 간단 작곡 코드 생성 프로그램 만들기(C++) - 1

by 라이티아 2024. 5. 19.

현재 듣고있는곡 - 메스머라이저

 

가사가 정신없는 멋진 곡이다

 

 

 

 

간단한 작곡 프로그램을 만들어보려 한다

사용 프로그램은 QT, 언어는 C++를 사용한다

근데 사실상 문법만 같은 다른 언어를 사용하는 감각이니 주의하자

 

알고리즘은 이미 C++로 작성해 두었으니 이것을 QT에 맞추에 적용하는 것이 문제이다

 

Side_projects/easy_composition at master · NoNamed02/Side_projects

Personal - Strange Things. Contribute to NoNamed02/Side_projects development by creating an account on GitHub.

github.com

(시간이 날때 작성해둔 작곡 알고리즘이다)

 

일단 해보자

qt에서 새 프로젝트를 만든다

 

빌드는 qmake를 사용한다 cmake는 이제 qt측에서 구형이라고 하기도 했고, QML을 주력으로 사용하는 것 같아 나의 영역 밖의 이야기인 것 같다

 

새로운 프로젝트가 완성되었다

 

이제 이 UI창에서 원하는 기능을 드래그 - 드롭해서 구성을 만들어야 한다

 

일단 코드를 8개 생성해야 하니 빈칸 8개와 버튼 1개를 만들어 준다

 

이제 테스트로 버튼을 누르면 text에 1부터 6까지의 난수를 담아볼 것 이다

 

버튼에 cliked()를 추가한다

 

그럼 버튼을 누르면 일어날 이벤트를 정의할 수 있다

 

이제 난수를 만들어야 하는데, c++은 그냥 rand함수를 대충 넣으면 되지만, QT는 다른 함수를 사용해야 한다

int randomNumber = QRandomGenerator::global()->bounded(6);


이렇게 듣도못한 QRandomGenerator을 사용한다

(안써도 된다)

 

그리고 이를 텍스트에 넣기 위해서
ui->textEdit->setText(QString::number(randomNumber));

이런 방식을 취해야 한다

 

결과적으로 이런 코드가 나온다

void MainWindow::on_pushButton_clicked()
{
    int randomNumber = QRandomGenerator::global()->bounded(6) + 1;

    ui->textEdit->setText(QString::number(randomNumber));
}

테스트 해보자

 

첫번째 텍스트창에 난수가 들어간 것을 알수 있다

 

이제 이것을 사용해서 랜덤 음악코드 생성을 해보자

 

기본 골자가 되는 3도 화음 코드중 고정되어 있는 화음은 미리 설정해 준다

 

그후 

 

int code_rule(int code){
    if(code == 1) // 1
        return rand() % 6 + 1;
    else if(code == 2){ // 2
        int sub = rand() % 2;
        if(sub == 0)
            return 4;
        else
            return 5;
    }
    else if(code == 3) // 3
        return 2;
    else if(code == 4){ // 4
        int sub = rand() % 2;
        if(sub == 0)
            return 2;
        else
            return 5;
    }
    else if(code == 5){
        int sub = rand() % 2;
        if(sub == 0)
            return 1;
        else
            return 2;
    }
    else if(code == 6){
        int sub = rand() % 3;
        if(sub == 0)
            return 2;
        else if(sub == 1)
            return 4;
        else if(sub == 2)
            return 5;
    }
    return 0;
}
int extra_rule(int code){ // 3번 마디 특수 코드
    if(code == 1){
        int sub = rand() % 3;
        if(sub == 0)
            return 2;
        else if(sub == 1)
            return 4;
        else if(sub == 2)
            return 6;
    }
    else if(code == 2)
        return 4;
    else if(code == 3)
        return 2;
    else if(code == 4)
        return 2;
    else if(code == 5){
        int sub = rand() % 2;
        if(sub == 0)
            return 1;
        else
            return 2;
    }
    else if(code == 6){
        int sub = rand() % 2;
        if(sub == 0)
            return 2;
        else
            return 4;
    }
    return 0;
}

 

미리 작성해둔 작곡 코드 설정 함수를 가져온다

 

 

 

.........................

............

......

.

 

???

 

왜 rand()가 되는거지???

 

일단 되니까 사용하도록 하자

 

이제 cout같이 qt에서 사용되지 않는 부분들을 qt에 맞게 수정해준다

 

 

for을 사용할 방법이 없어서 그냥 노가다 해야한다

이제 테스트해보자

 

난수에 맞게 출력되는 것을 확인할 수 있다

 

이제 사용자에게 각 n도 화음에 맞는 코드를 랜덤하게 설정할 수 있게 해주자

텍스트 창과 버튼을 추가한다

 

이제 코드를 추가해야 한다

 

우선 코드 설정 버튼은 화음 버튼 뒤에 생성되어야 하기에, 기본적으로 false되어야 한다

 

이를 위해서 이런 코드가 사용된다

ui->pushButton->setVisible(bool);

이렇게 되면 bool에 따라 보이고 안보이고를 설정할 수 있다

 

이를 코드에 반영하면

이러한 형태를 가지게 된다

 

버튼 활성 비활성을 만들어 보자


ui->pushButton->setEnabled(false);

이런 형태의 코드를 사용한다

 

그리고 오류

 

문제는 ui->setupUi(this);를 뒤에서 한것이다

ui->setupUi(this);는 UI를 초기화 하는 역할을 한다는 것 같다

 

이제 이렇게 해주면 화음 코드 생성 버튼을 눌러야 코드 생성 버튼이 활성화 된다

 

이제 코드 생성 버튼을 누르면 코드가 생성되도록 하자

 

코드 생성 함수는 없어서 지금 정의해야 한다

 

만약 코드가 

1도 C - E - G 일시

C, E, G 3개의 코드중 하나를 사용자에게 보여줘야 한다

 

이를 코드로 작성하자

1도 화음을 우선 만들어 보았다

 

화음 값을 int로 받으면 이에 맞추에 char값으로 코드를 반환해준다

이를 7도 화음까지 만들어 준다

hard-cording

 

이제 코드 생성 버튼을 누르면 코드가 생성되도록 이벤트를 짜준다

 

항상있는 버그 시간이다

 

setText가 char을 받지 못하고 있다

 

다른 방법이 필요한 것 같다

 

QString()으로 감싸버리면 되는 것 같다

 

이제 나머지도 셋팅해주자

 

하아아도 코딩 해준다

 

이제 테스트해보자

화음에 맞추에 코드를 던져준다

 

이제 멜로디를 똑같이 추가해주면 된다

 

멜로디가 들어갈 텍스트 박스를 넣어준다

 

함수는 make_chord와 매커니즘이 똑같기에 무시해도 된다

버튼 이벤트에 하드 코딩으로 넣어준다

 

잘나온다

 

이 틀을 기반으로 효과음, UI를 추가해주면 될 것 같다