ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 튜너 UI 구현
    JDTuner/개발기록 2026. 3. 8. 19:26

    디자인은 AI에게 맡겼다.

    그냥 만들어 달라고 했는데 내 스타일대로 심플하게 잘 나왔다.

     

    튜너 뷰 UI

     

     

    주요 코드

                // 움직이는 바늘
                VStack(spacing: 0) {
                  Triangle()
                    .fill(isMatched ? Color.green : Color.blue)
                    .frame(width: 12, height: 12)
                  Rectangle()
                    .fill(isMatched ? Color.green : Color.blue)
                    .frame(width: 2, height: 20)
                }
                .offset(x: CGFloat(cents) * 3) // 1센트당 3포인트 이동
                .animation(.interactiveSpring(response: 0.3, dampingFraction: 0.6), value: cents)

     

    cents 값이 필요했던 이유다.

    offset을 사용해서 cents값에 따라 튜너 바늘이 움직이게 해놨다.

     

    BAD ACCESS 에러

    간헐적으로 발생하는 BAD

    BAD EXCESS인줄 알았는데 BAD ACCESS였다.

    접근이 불가능하다는 에러인데 왜 EXCESS라고 생각했지??

    암튼 가끔 이 에러가 발생하면서 크래시가 나왔는데 원인은 튜너쪽 TunerResult의 noteName이

    char* 여서 그랬다. Objective-C에서 c++의 주소값을 가져오려다 실패한것.

    그래서 값복사를 사용하는 std:string으로 변경했다.

    struct TunerResult {
      float frequency;
      std::string noteName;
      float cents;
    };

     

     

    juce_Audio_ios Assertion

    또 assert가 발생

    튜너 뷰를 만들면서 마이크 권한 코드를 빼서 나왔던 assert 였다.

    info.plist에는 마이크 관련 내용이 있는데 코드에는 없으니 나오는거였다.

    앱에서의 문제 같은데 이걸 JUCE에서 assert 처리 한게 신기했다.

     

    다음 작업

    결과 영상을 보면 튜너가 정확한건지 의심이 든다.

    0.0값도 너무 자주 나오고 값이 너무 튀는 느낌이 든다.

    다음 작업은 튜너 성능을 테스트하면서 안정적으로 개선하는 것이다.

    어려운 작업이 될거 같은데 이 과정에서 배우는거도 많을거 같다.

    UI가 나온걸 보니 거의 다온거 같고 얼른 끝내고 싶다.

    'JDTuner > 개발기록' 카테고리의 다른 글

    구조 개선 2 - 비동기스트림  (0) 2026.03.10
    구조 개선 1 - 데이터 관리 + 테스트 영상  (0) 2026.03.09
    Cents 계산  (0) 2026.03.04
    Assert 없애기  (0) 2026.03.03
    주파수 검출 구현하기 2.  (1) 2026.02.24
Designed by Tistory.