Repository files navigation

🎼 튜토리코더 - 원격 악기 교육 플랫폼

📆 프로젝트 진행 기간

2023.01.09(월) ~ 2023.02.17(금) (39일간 진행)
SSAFY 8기 2학기 공통프로젝트 - 튜토리코더

💻 서비스 화면

메인화면 / 닉네임 설정

모드 설정 화면 / 혼자하기 모드 화면

혼자하기 튜토리얼 / 혼자하기 소리내기

혼자하기 연주하기 / 같이하기 대기방

같이하기 카카오톡 공유 / 같이하기 방 설정

같이하기 소리내기 / 같이하기 연주하기



🎵 기획 배경

음악적 성장이 가장 급속하게 발달하는 시기는 초등학교 시기이며 이 시기의 음악적 경험은 아이들에게 많은 영향을 미친다.

  • 높은 학업 성취도와 자존감
  • 창의적인 사고
  • 의사를 표현하는 능력향상 하지만 현재 코로나로 인해 교실에서 마스크를 착용해야 하기 때문에 음악교육을 하는데 어려움이 있습니다.

이와 같은 어려움을 해소하기 위해서 탄생한 WebRTC기반의 원격 악기 교육 플랫폼 입니다

🎶 개요

원격 악기 교육 플랫폼 - 튜토리코더

  • 각자의 실력에 따른 연습 방법 제시

초등교육과정의 여러 동요들을 통해서 자신의 수준의 맞는 곡을 선택하여 연습할 수 있습니다.

  • 즉각적인 피드백

게임 결과를 분석한 결과를 보여줌으로써 자신의 부족한 부분을 바로 확인할 수 있습니다.

💻 스토리보드

스토리보드

📚 기술 스텍 및 주요 기능

🎥 OpenVidu

OpenVidu는 웹 또는 모바일 애플리케이션에 실시간 커뮤니케이션을 쉽고 빠르게 추가할 수 있는 플랫폼입니다.



👤 teachable machine

리코더의 각 음계를 학습시켜 소리 인식을 통해 유저가 연주하는 음계를 파악하고 요구하는 음계와 맞는지 틀린지를 구분하게 하였습니다.

학습시킨 모델에서 솔과 라를 각각 연주한 결과입니다. 튜토리코더에서는 음계별로 도출된 값을 이용하여 어떤 음계에 가장 가까운지 판단하였습니다.

소리내기

  • 사용자가 내는 소리가 학습된 데이터중 어느 것에 가장 가까운지 판정
  • 도부터 시까지 7개 음계 외에도 배경소음, 음이탈 등의 틀린 경우 3가지를 추가로 학습시켜 정확도 향상


연주하기

Canvas API

  • Canvas API를 이용하여 오선지 표시
  • 음 높이와 해당 음의 start / end 시간을 가진 Note라는 배열을 통해서 시간에 맞추어 화면에 표시

UserMedia API

  • 사용자의 마이크 권한 요청

Web Audio API

  • AnalyserNode를 사용하여 실시간으로 마이크로 들어오는 주파수 값을 받는다.
  • 푸리에 변환 소스를 통해서 입력받은 주파수 값을 음 높이로 변환

ResizeObserver API

  • 실시간으로 변환되는 음 높이를 받아서 큐 형태의 배열에 넣고 해당 배열을 화면 중앙에 표시


📋 개발환경

BackEnd

  • SpringBoot 2.5.5
  • Java 11

FrontEnd

  • Vue.js 3.0.0
  • node 16.18.0

AI

  • Teachable Machine
  • Tensorflow 1.3.1

CI / CD

  • AWS EC2
  • Docker
  • NGINX


📂 프로젝트 파일 구조


Back

backend
├── src
│ ├── auth
│ ├── filter
│ ├── interceptor
│ └── listener
├── Dockerfile
└── pom.xml

Front

frontend
├── node_modules
├── patches
│ ├── @tensorflow-models+speech-commands+0.4.2
├── public
└── src
├── assets
├── components
│ ├── multi
│ │ ├── MultiAnalizeMain
│ │ ├── MultiSoloAnalizeMain
│ │ ├── MultiSongMain
│ │ └── MultiSoundMain
│ ├── solo
│ │ ├── teachable
│ │ ├── SoloAnalizeMain
│ │ ├── SoloFingeringMain
│ │ ├── SoloMain
│ │ ├── SoloSongMain
│ │ ├── SoloSoundMain
│ │ ├── SoloTutorialMain
│ │ └── SoloTutorialSelect
│ ├── video
│ │ ├── OvVideo
│ │ ├── soloUserVideo
│ │ └── UserVideo
│ ├── HomeMain
│ └── ModeMain
├── router
├── store
└── views
├── solo
│ ├── SoloAnalizeView
│ ├── SoloFingeringView
│ ├── SoloSongView
│ ├── SoloSoundView
│ ├── SoloTutorialSelectView
│ ├── SoloTutorialView
│ └── SoloView
├── HomeView
├── ModelView
└── playroom


💬 협업 툴

  • GitLab
  • Notion
  • JIRA
  • MatterMost


👬 협업 환경

GitLab

Git Flow

  • 각자 맡은 기능에 맞게 feature 브랜치를 생성하여 개발
  • 완료된 기능은 developmerge
  • 매일 오전 9시 스크럼 회의가 끝나면 develop 최신 버전을 pull

Commit convention

FEAT : 기능 추가, 프로젝트 생성, 초기 설정
FIX : 기능 변경, 기능 수정, 오류 수정
REFACTOR : 같은 기능을 하는 코드를 리팩토링

Git Convention

Notion

  • 팀 전체가 알아야 할 공지사항이나 프로젝트를 진행하면서 나오는 각종 산출물들의 형상관리

JIRA

  • 협업 및 일정, 업무 관리를 JIRA를 통해 관리하였습니다.
  • 매 주 월요일 한 주동안 진행되어야 할 계획을 수립하여 진행할 이슈들을 스프린트를 만들어 등록

Epic : BackEnd, FrontEnd, 기획, 설계
story : 기획, 설계, 산출물 제작 등 개발외의 업무에 관한 업무 관리
task : 코드 작성과 관련된 개발업무에 관한 업무 관리

MatterMost

  • 일일 스크럼 회의록 관리
  • GitLab과 연동하여 실시간 GitLab 관리
  • Archiving채널을 통해서 각 종 정보 공유

산출물



결과물



팀원 소개

image

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

🎼 튜토리코더 - 원격 악기 교육 플랫폼

📆 프로젝트 진행 기간

2023.01.09(월) ~ 2023.02.17(금) (39일간 진행)
SSAFY 8기 2학기 공통프로젝트 - 튜토리코더

💻 서비스 화면

메인화면 / 닉네임 설정

모드 설정 화면 / 혼자하기 모드 화면

혼자하기 튜토리얼 / 혼자하기 소리내기

혼자하기 연주하기 / 같이하기 대기방

같이하기 카카오톡 공유 / 같이하기 방 설정

같이하기 소리내기 / 같이하기 연주하기



🎵 기획 배경

음악적 성장이 가장 급속하게 발달하는 시기는 초등학교 시기이며 이 시기의 음악적 경험은 아이들에게 많은 영향을 미친다.

  • 높은 학업 성취도와 자존감
  • 창의적인 사고
  • 의사를 표현하는 능력향상 하지만 현재 코로나로 인해 교실에서 마스크를 착용해야 하기 때문에 음악교육을 하는데 어려움이 있습니다.

이와 같은 어려움을 해소하기 위해서 탄생한 WebRTC기반의 원격 악기 교육 플랫폼 입니다

🎶 개요

원격 악기 교육 플랫폼 - 튜토리코더

  • 각자의 실력에 따른 연습 방법 제시

초등교육과정의 여러 동요들을 통해서 자신의 수준의 맞는 곡을 선택하여 연습할 수 있습니다.

  • 즉각적인 피드백

게임 결과를 분석한 결과를 보여줌으로써 자신의 부족한 부분을 바로 확인할 수 있습니다.

💻 스토리보드

스토리보드

📚 기술 스텍 및 주요 기능

🎥 OpenVidu

OpenVidu는 웹 또는 모바일 애플리케이션에 실시간 커뮤니케이션을 쉽고 빠르게 추가할 수 있는 플랫폼입니다.



👤 teachable machine

리코더의 각 음계를 학습시켜 소리 인식을 통해 유저가 연주하는 음계를 파악하고 요구하는 음계와 맞는지 틀린지를 구분하게 하였습니다.

학습시킨 모델에서 솔과 라를 각각 연주한 결과입니다. 튜토리코더에서는 음계별로 도출된 값을 이용하여 어떤 음계에 가장 가까운지 판단하였습니다.

소리내기

  • 사용자가 내는 소리가 학습된 데이터중 어느 것에 가장 가까운지 판정
  • 도부터 시까지 7개 음계 외에도 배경소음, 음이탈 등의 틀린 경우 3가지를 추가로 학습시켜 정확도 향상


연주하기

Canvas API

  • Canvas API를 이용하여 오선지 표시
  • 음 높이와 해당 음의 start / end 시간을 가진 Note라는 배열을 통해서 시간에 맞추어 화면에 표시

UserMedia API

  • 사용자의 마이크 권한 요청

Web Audio API

  • AnalyserNode를 사용하여 실시간으로 마이크로 들어오는 주파수 값을 받는다.
  • 푸리에 변환 소스를 통해서 입력받은 주파수 값을 음 높이로 변환

ResizeObserver API

  • 실시간으로 변환되는 음 높이를 받아서 큐 형태의 배열에 넣고 해당 배열을 화면 중앙에 표시


📋 개발환경

BackEnd

  • SpringBoot 2.5.5
  • Java 11

FrontEnd

  • Vue.js 3.0.0
  • node 16.18.0

AI

  • Teachable Machine
  • Tensorflow 1.3.1

CI / CD

  • AWS EC2
  • Docker
  • NGINX


📂 프로젝트 파일 구조


Back

backend
├── src
│ ├── auth
│ ├── filter
│ ├── interceptor
│ └── listener
├── Dockerfile
└── pom.xml

Front

frontend
├── node_modules
├── patches
│ ├── @tensorflow-models+speech-commands+0.4.2
├── public
└── src
├── assets
├── components
│ ├── multi
│ │ ├── MultiAnalizeMain
│ │ ├── MultiSoloAnalizeMain
│ │ ├── MultiSongMain
│ │ └── MultiSoundMain
│ ├── solo
│ │ ├── teachable
│ │ ├── SoloAnalizeMain
│ │ ├── SoloFingeringMain
│ │ ├── SoloMain
│ │ ├── SoloSongMain
│ │ ├── SoloSoundMain
│ │ ├── SoloTutorialMain
│ │ └── SoloTutorialSelect
│ ├── video
│ │ ├── OvVideo
│ │ ├── soloUserVideo
│ │ └── UserVideo
│ ├── HomeMain
│ └── ModeMain
├── router
├── store
└── views
├── solo
│ ├── SoloAnalizeView
│ ├── SoloFingeringView
│ ├── SoloSongView
│ ├── SoloSoundView
│ ├── SoloTutorialSelectView
│ ├── SoloTutorialView
│ └── SoloView
├── HomeView
├── ModelView
└── playroom


💬 협업 툴

  • GitLab
  • Notion
  • JIRA
  • MatterMost


👬 협업 환경

GitLab

Git Flow

  • 각자 맡은 기능에 맞게 feature 브랜치를 생성하여 개발
  • 완료된 기능은 developmerge
  • 매일 오전 9시 스크럼 회의가 끝나면 develop 최신 버전을 pull

Commit convention

FEAT : 기능 추가, 프로젝트 생성, 초기 설정
FIX : 기능 변경, 기능 수정, 오류 수정
REFACTOR : 같은 기능을 하는 코드를 리팩토링

Git Convention

Notion

  • 팀 전체가 알아야 할 공지사항이나 프로젝트를 진행하면서 나오는 각종 산출물들의 형상관리

JIRA

  • 협업 및 일정, 업무 관리를 JIRA를 통해 관리하였습니다.
  • 매 주 월요일 한 주동안 진행되어야 할 계획을 수립하여 진행할 이슈들을 스프린트를 만들어 등록

Epic : BackEnd, FrontEnd, 기획, 설계
story : 기획, 설계, 산출물 제작 등 개발외의 업무에 관한 업무 관리
task : 코드 작성과 관련된 개발업무에 관한 업무 관리

MatterMost

  • 일일 스크럼 회의록 관리
  • GitLab과 연동하여 실시간 GitLab 관리
  • Archiving채널을 통해서 각 종 정보 공유

산출물



결과물



팀원 소개

image

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🎼 튜토리코더 - 원격 악기 교육 플랫폼

📆 프로젝트 진행 기간

2023.01.09(월) ~ 2023.02.17(금) (39일간 진행)
SSAFY 8기 2학기 공통프로젝트 - 튜토리코더

💻 서비스 화면

메인화면 / 닉네임 설정

모드 설정 화면 / 혼자하기 모드 화면

혼자하기 튜토리얼 / 혼자하기 소리내기

혼자하기 연주하기 / 같이하기 대기방

같이하기 카카오톡 공유 / 같이하기 방 설정

같이하기 소리내기 / 같이하기 연주하기



🎵 기획 배경

음악적 성장이 가장 급속하게 발달하는 시기는 초등학교 시기이며 이 시기의 음악적 경험은 아이들에게 많은 영향을 미친다.

  • 높은 학업 성취도와 자존감
  • 창의적인 사고
  • 의사를 표현하는 능력향상 하지만 현재 코로나로 인해 교실에서 마스크를 착용해야 하기 때문에 음악교육을 하는데 어려움이 있습니다.

이와 같은 어려움을 해소하기 위해서 탄생한 WebRTC기반의 원격 악기 교육 플랫폼 입니다

🎶 개요

원격 악기 교육 플랫폼 - 튜토리코더

  • 각자의 실력에 따른 연습 방법 제시

초등교육과정의 여러 동요들을 통해서 자신의 수준의 맞는 곡을 선택하여 연습할 수 있습니다.

  • 즉각적인 피드백

게임 결과를 분석한 결과를 보여줌으로써 자신의 부족한 부분을 바로 확인할 수 있습니다.

💻 스토리보드

스토리보드

📚 기술 스텍 및 주요 기능

🎥 OpenVidu

OpenVidu는 웹 또는 모바일 애플리케이션에 실시간 커뮤니케이션을 쉽고 빠르게 추가할 수 있는 플랫폼입니다.



👤 teachable machine

리코더의 각 음계를 학습시켜 소리 인식을 통해 유저가 연주하는 음계를 파악하고 요구하는 음계와 맞는지 틀린지를 구분하게 하였습니다.

학습시킨 모델에서 솔과 라를 각각 연주한 결과입니다. 튜토리코더에서는 음계별로 도출된 값을 이용하여 어떤 음계에 가장 가까운지 판단하였습니다.

소리내기

  • 사용자가 내는 소리가 학습된 데이터중 어느 것에 가장 가까운지 판정
  • 도부터 시까지 7개 음계 외에도 배경소음, 음이탈 등의 틀린 경우 3가지를 추가로 학습시켜 정확도 향상


연주하기

Canvas API

  • Canvas API를 이용하여 오선지 표시
  • 음 높이와 해당 음의 start / end 시간을 가진 Note라는 배열을 통해서 시간에 맞추어 화면에 표시

UserMedia API

  • 사용자의 마이크 권한 요청

Web Audio API

  • AnalyserNode를 사용하여 실시간으로 마이크로 들어오는 주파수 값을 받는다.
  • 푸리에 변환 소스를 통해서 입력받은 주파수 값을 음 높이로 변환

ResizeObserver API

  • 실시간으로 변환되는 음 높이를 받아서 큐 형태의 배열에 넣고 해당 배열을 화면 중앙에 표시


📋 개발환경

BackEnd

  • SpringBoot 2.5.5
  • Java 11

FrontEnd

  • Vue.js 3.0.0
  • node 16.18.0

AI

  • Teachable Machine
  • Tensorflow 1.3.1

CI / CD

  • AWS EC2
  • Docker
  • NGINX


📂 프로젝트 파일 구조


Back

backend
├── src
│ ├── auth
│ ├── filter
│ ├── interceptor
│ └── listener
├── Dockerfile
└── pom.xml

Front

frontend
├── node_modules
├── patches
│ ├── @tensorflow-models+speech-commands+0.4.2
├── public
└── src
├── assets
├── components
│ ├── multi
│ │ ├── MultiAnalizeMain
│ │ ├── MultiSoloAnalizeMain
│ │ ├── MultiSongMain
│ │ └── MultiSoundMain
│ ├── solo
│ │ ├── teachable
│ │ ├── SoloAnalizeMain
│ │ ├── SoloFingeringMain
│ │ ├── SoloMain
│ │ ├── SoloSongMain
│ │ ├── SoloSoundMain
│ │ ├── SoloTutorialMain
│ │ └── SoloTutorialSelect
│ ├── video
│ │ ├── OvVideo
│ │ ├── soloUserVideo
│ │ └── UserVideo
│ ├── HomeMain
│ └── ModeMain
├── router
├── store
└── views
├── solo
│ ├── SoloAnalizeView
│ ├── SoloFingeringView
│ ├── SoloSongView
│ ├── SoloSoundView
│ ├── SoloTutorialSelectView
│ ├── SoloTutorialView
│ └── SoloView
├── HomeView
├── ModelView
└── playroom


💬 협업 툴

  • GitLab
  • Notion
  • JIRA
  • MatterMost


👬 협업 환경

GitLab

Git Flow

  • 각자 맡은 기능에 맞게 feature 브랜치를 생성하여 개발
  • 완료된 기능은 developmerge
  • 매일 오전 9시 스크럼 회의가 끝나면 develop 최신 버전을 pull

Commit convention

FEAT : 기능 추가, 프로젝트 생성, 초기 설정
FIX : 기능 변경, 기능 수정, 오류 수정
REFACTOR : 같은 기능을 하는 코드를 리팩토링

Git Convention

Notion

  • 팀 전체가 알아야 할 공지사항이나 프로젝트를 진행하면서 나오는 각종 산출물들의 형상관리

JIRA

  • 협업 및 일정, 업무 관리를 JIRA를 통해 관리하였습니다.
  • 매 주 월요일 한 주동안 진행되어야 할 계획을 수립하여 진행할 이슈들을 스프린트를 만들어 등록

Epic : BackEnd, FrontEnd, 기획, 설계
story : 기획, 설계, 산출물 제작 등 개발외의 업무에 관한 업무 관리
task : 코드 작성과 관련된 개발업무에 관한 업무 관리

MatterMost

  • 일일 스크럼 회의록 관리
  • GitLab과 연동하여 실시간 GitLab 관리
  • Archiving채널을 통해서 각 종 정보 공유

산출물



결과물



팀원 소개

image

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🎼 튜토리코더 - 원격 악기 교육 플랫폼

📆 프로젝트 진행 기간

2023.01.09(월) ~ 2023.02.17(금) (39일간 진행)
SSAFY 8기 2학기 공통프로젝트 - 튜토리코더

💻 서비스 화면

메인화면 / 닉네임 설정

모드 설정 화면 / 혼자하기 모드 화면

혼자하기 튜토리얼 / 혼자하기 소리내기

혼자하기 연주하기 / 같이하기 대기방

같이하기 카카오톡 공유 / 같이하기 방 설정

같이하기 소리내기 / 같이하기 연주하기



🎵 기획 배경

음악적 성장이 가장 급속하게 발달하는 시기는 초등학교 시기이며 이 시기의 음악적 경험은 아이들에게 많은 영향을 미친다.

  • 높은 학업 성취도와 자존감
  • 창의적인 사고
  • 의사를 표현하는 능력향상 하지만 현재 코로나로 인해 교실에서 마스크를 착용해야 하기 때문에 음악교육을 하는데 어려움이 있습니다.

이와 같은 어려움을 해소하기 위해서 탄생한 WebRTC기반의 원격 악기 교육 플랫폼 입니다

🎶 개요

원격 악기 교육 플랫폼 - 튜토리코더

  • 각자의 실력에 따른 연습 방법 제시

초등교육과정의 여러 동요들을 통해서 자신의 수준의 맞는 곡을 선택하여 연습할 수 있습니다.

  • 즉각적인 피드백

게임 결과를 분석한 결과를 보여줌으로써 자신의 부족한 부분을 바로 확인할 수 있습니다.

💻 스토리보드

스토리보드

📚 기술 스텍 및 주요 기능

🎥 OpenVidu

OpenVidu는 웹 또는 모바일 애플리케이션에 실시간 커뮤니케이션을 쉽고 빠르게 추가할 수 있는 플랫폼입니다.



👤 teachable machine

리코더의 각 음계를 학습시켜 소리 인식을 통해 유저가 연주하는 음계를 파악하고 요구하는 음계와 맞는지 틀린지를 구분하게 하였습니다.

학습시킨 모델에서 솔과 라를 각각 연주한 결과입니다. 튜토리코더에서는 음계별로 도출된 값을 이용하여 어떤 음계에 가장 가까운지 판단하였습니다.

소리내기

  • 사용자가 내는 소리가 학습된 데이터중 어느 것에 가장 가까운지 판정
  • 도부터 시까지 7개 음계 외에도 배경소음, 음이탈 등의 틀린 경우 3가지를 추가로 학습시켜 정확도 향상


연주하기

Canvas API

  • Canvas API를 이용하여 오선지 표시
  • 음 높이와 해당 음의 start / end 시간을 가진 Note라는 배열을 통해서 시간에 맞추어 화면에 표시

UserMedia API

  • 사용자의 마이크 권한 요청

Web Audio API

  • AnalyserNode를 사용하여 실시간으로 마이크로 들어오는 주파수 값을 받는다.
  • 푸리에 변환 소스를 통해서 입력받은 주파수 값을 음 높이로 변환

ResizeObserver API

  • 실시간으로 변환되는 음 높이를 받아서 큐 형태의 배열에 넣고 해당 배열을 화면 중앙에 표시


📋 개발환경

BackEnd

  • SpringBoot 2.5.5
  • Java 11

FrontEnd

  • Vue.js 3.0.0
  • node 16.18.0

AI

  • Teachable Machine
  • Tensorflow 1.3.1

CI / CD

  • AWS EC2
  • Docker
  • NGINX


📂 프로젝트 파일 구조


Back

backend
├── src
│ ├── auth
│ ├── filter
│ ├── interceptor
│ └── listener
├── Dockerfile
└── pom.xml

Front

frontend
├── node_modules
├── patches
│ ├── @tensorflow-models+speech-commands+0.4.2
├── public
└── src
├── assets
├── components
│ ├── multi
│ │ ├── MultiAnalizeMain
│ │ ├── MultiSoloAnalizeMain
│ │ ├── MultiSongMain
│ │ └── MultiSoundMain
│ ├── solo
│ │ ├── teachable
│ │ ├── SoloAnalizeMain
│ │ ├── SoloFingeringMain
│ │ ├── SoloMain
│ │ ├── SoloSongMain
│ │ ├── SoloSoundMain
│ │ ├── SoloTutorialMain
│ │ └── SoloTutorialSelect
│ ├── video
│ │ ├── OvVideo
│ │ ├── soloUserVideo
│ │ └── UserVideo
│ ├── HomeMain
│ └── ModeMain
├── router
├── store
└── views
├── solo
│ ├── SoloAnalizeView
│ ├── SoloFingeringView
│ ├── SoloSongView
│ ├── SoloSoundView
│ ├── SoloTutorialSelectView
│ ├── SoloTutorialView
│ └── SoloView
├── HomeView
├── ModelView
└── playroom


💬 협업 툴

  • GitLab
  • Notion
  • JIRA
  • MatterMost


👬 협업 환경

GitLab

Git Flow

  • 각자 맡은 기능에 맞게 feature 브랜치를 생성하여 개발
  • 완료된 기능은 developmerge
  • 매일 오전 9시 스크럼 회의가 끝나면 develop 최신 버전을 pull

Commit convention

FEAT : 기능 추가, 프로젝트 생성, 초기 설정
FIX : 기능 변경, 기능 수정, 오류 수정
REFACTOR : 같은 기능을 하는 코드를 리팩토링

Git Convention

Notion

  • 팀 전체가 알아야 할 공지사항이나 프로젝트를 진행하면서 나오는 각종 산출물들의 형상관리

JIRA

  • 협업 및 일정, 업무 관리를 JIRA를 통해 관리하였습니다.
  • 매 주 월요일 한 주동안 진행되어야 할 계획을 수립하여 진행할 이슈들을 스프린트를 만들어 등록

Epic : BackEnd, FrontEnd, 기획, 설계
story : 기획, 설계, 산출물 제작 등 개발외의 업무에 관한 업무 관리
task : 코드 작성과 관련된 개발업무에 관한 업무 관리

MatterMost

  • 일일 스크럼 회의록 관리
  • GitLab과 연동하여 실시간 GitLab 관리
  • Archiving채널을 통해서 각 종 정보 공유

산출물



결과물



팀원 소개

image

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

🎼 튜토리코더 - 원격 악기 교육 플랫폼

📆 프로젝트 진행 기간

2023.01.09(월) ~ 2023.02.17(금) (39일간 진행)
SSAFY 8기 2학기 공통프로젝트 - 튜토리코더

💻 서비스 화면

메인화면 / 닉네임 설정

모드 설정 화면 / 혼자하기 모드 화면

혼자하기 튜토리얼 / 혼자하기 소리내기

혼자하기 연주하기 / 같이하기 대기방

같이하기 카카오톡 공유 / 같이하기 방 설정

같이하기 소리내기 / 같이하기 연주하기



🎵 기획 배경

음악적 성장이 가장 급속하게 발달하는 시기는 초등학교 시기이며 이 시기의 음악적 경험은 아이들에게 많은 영향을 미친다.

  • 높은 학업 성취도와 자존감
  • 창의적인 사고
  • 의사를 표현하는 능력향상 하지만 현재 코로나로 인해 교실에서 마스크를 착용해야 하기 때문에 음악교육을 하는데 어려움이 있습니다.

이와 같은 어려움을 해소하기 위해서 탄생한 WebRTC기반의 원격 악기 교육 플랫폼 입니다

🎶 개요

원격 악기 교육 플랫폼 - 튜토리코더

  • 각자의 실력에 따른 연습 방법 제시

초등교육과정의 여러 동요들을 통해서 자신의 수준의 맞는 곡을 선택하여 연습할 수 있습니다.

  • 즉각적인 피드백

게임 결과를 분석한 결과를 보여줌으로써 자신의 부족한 부분을 바로 확인할 수 있습니다.

💻 스토리보드

스토리보드

📚 기술 스텍 및 주요 기능

🎥 OpenVidu

OpenVidu는 웹 또는 모바일 애플리케이션에 실시간 커뮤니케이션을 쉽고 빠르게 추가할 수 있는 플랫폼입니다.



👤 teachable machine

리코더의 각 음계를 학습시켜 소리 인식을 통해 유저가 연주하는 음계를 파악하고 요구하는 음계와 맞는지 틀린지를 구분하게 하였습니다.

학습시킨 모델에서 솔과 라를 각각 연주한 결과입니다. 튜토리코더에서는 음계별로 도출된 값을 이용하여 어떤 음계에 가장 가까운지 판단하였습니다.

소리내기

  • 사용자가 내는 소리가 학습된 데이터중 어느 것에 가장 가까운지 판정
  • 도부터 시까지 7개 음계 외에도 배경소음, 음이탈 등의 틀린 경우 3가지를 추가로 학습시켜 정확도 향상


연주하기

Canvas API

  • Canvas API를 이용하여 오선지 표시
  • 음 높이와 해당 음의 start / end 시간을 가진 Note라는 배열을 통해서 시간에 맞추어 화면에 표시

UserMedia API

  • 사용자의 마이크 권한 요청

Web Audio API

  • AnalyserNode를 사용하여 실시간으로 마이크로 들어오는 주파수 값을 받는다.
  • 푸리에 변환 소스를 통해서 입력받은 주파수 값을 음 높이로 변환

ResizeObserver API

  • 실시간으로 변환되는 음 높이를 받아서 큐 형태의 배열에 넣고 해당 배열을 화면 중앙에 표시


📋 개발환경

BackEnd

  • SpringBoot 2.5.5
  • Java 11

FrontEnd

  • Vue.js 3.0.0
  • node 16.18.0

AI

  • Teachable Machine
  • Tensorflow 1.3.1

CI / CD

  • AWS EC2
  • Docker
  • NGINX


📂 프로젝트 파일 구조


Back

backend
├── src
│ ├── auth
│ ├── filter
│ ├── interceptor
│ └── listener
├── Dockerfile
└── pom.xml

Front

frontend
├── node_modules
├── patches
│ ├── @tensorflow-models+speech-commands+0.4.2
├── public
└── src
├── assets
├── components
│ ├── multi
│ │ ├── MultiAnalizeMain
│ │ ├── MultiSoloAnalizeMain
│ │ ├── MultiSongMain
│ │ └── MultiSoundMain
│ ├── solo
│ │ ├── teachable
│ │ ├── SoloAnalizeMain
│ │ ├── SoloFingeringMain
│ │ ├── SoloMain
│ │ ├── SoloSongMain
│ │ ├── SoloSoundMain
│ │ ├── SoloTutorialMain
│ │ └── SoloTutorialSelect
│ ├── video
│ │ ├── OvVideo
│ │ ├── soloUserVideo
│ │ └── UserVideo
│ ├── HomeMain
│ └── ModeMain
├── router
├── store
└── views
├── solo
│ ├── SoloAnalizeView
│ ├── SoloFingeringView
│ ├── SoloSongView
│ ├── SoloSoundView
│ ├── SoloTutorialSelectView
│ ├── SoloTutorialView
│ └── SoloView
├── HomeView
├── ModelView
└── playroom


💬 협업 툴

  • GitLab
  • Notion
  • JIRA
  • MatterMost


👬 협업 환경

GitLab

Git Flow

  • 각자 맡은 기능에 맞게 feature 브랜치를 생성하여 개발
  • 완료된 기능은 developmerge
  • 매일 오전 9시 스크럼 회의가 끝나면 develop 최신 버전을 pull

Commit convention

FEAT : 기능 추가, 프로젝트 생성, 초기 설정
FIX : 기능 변경, 기능 수정, 오류 수정
REFACTOR : 같은 기능을 하는 코드를 리팩토링

Git Convention

Notion

  • 팀 전체가 알아야 할 공지사항이나 프로젝트를 진행하면서 나오는 각종 산출물들의 형상관리

JIRA

  • 협업 및 일정, 업무 관리를 JIRA를 통해 관리하였습니다.
  • 매 주 월요일 한 주동안 진행되어야 할 계획을 수립하여 진행할 이슈들을 스프린트를 만들어 등록

Epic : BackEnd, FrontEnd, 기획, 설계
story : 기획, 설계, 산출물 제작 등 개발외의 업무에 관한 업무 관리
task : 코드 작성과 관련된 개발업무에 관한 업무 관리

MatterMost

  • 일일 스크럼 회의록 관리
  • GitLab과 연동하여 실시간 GitLab 관리
  • Archiving채널을 통해서 각 종 정보 공유

산출물



결과물



팀원 소개

image

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🎼 튜토리코더 - 원격 악기 교육 플랫폼

📆 프로젝트 진행 기간

2023.01.09(월) ~ 2023.02.17(금) (39일간 진행)
SSAFY 8기 2학기 공통프로젝트 - 튜토리코더

💻 서비스 화면

메인화면 / 닉네임 설정

모드 설정 화면 / 혼자하기 모드 화면

혼자하기 튜토리얼 / 혼자하기 소리내기

혼자하기 연주하기 / 같이하기 대기방

같이하기 카카오톡 공유 / 같이하기 방 설정

같이하기 소리내기 / 같이하기 연주하기



🎵 기획 배경

음악적 성장이 가장 급속하게 발달하는 시기는 초등학교 시기이며 이 시기의 음악적 경험은 아이들에게 많은 영향을 미친다.

  • 높은 학업 성취도와 자존감
  • 창의적인 사고
  • 의사를 표현하는 능력향상 하지만 현재 코로나로 인해 교실에서 마스크를 착용해야 하기 때문에 음악교육을 하는데 어려움이 있습니다.

이와 같은 어려움을 해소하기 위해서 탄생한 WebRTC기반의 원격 악기 교육 플랫폼 입니다

🎶 개요

원격 악기 교육 플랫폼 - 튜토리코더

  • 각자의 실력에 따른 연습 방법 제시

초등교육과정의 여러 동요들을 통해서 자신의 수준의 맞는 곡을 선택하여 연습할 수 있습니다.

  • 즉각적인 피드백

게임 결과를 분석한 결과를 보여줌으로써 자신의 부족한 부분을 바로 확인할 수 있습니다.

💻 스토리보드

스토리보드

📚 기술 스텍 및 주요 기능

🎥 OpenVidu

OpenVidu는 웹 또는 모바일 애플리케이션에 실시간 커뮤니케이션을 쉽고 빠르게 추가할 수 있는 플랫폼입니다.



👤 teachable machine

리코더의 각 음계를 학습시켜 소리 인식을 통해 유저가 연주하는 음계를 파악하고 요구하는 음계와 맞는지 틀린지를 구분하게 하였습니다.

학습시킨 모델에서 솔과 라를 각각 연주한 결과입니다. 튜토리코더에서는 음계별로 도출된 값을 이용하여 어떤 음계에 가장 가까운지 판단하였습니다.

소리내기

  • 사용자가 내는 소리가 학습된 데이터중 어느 것에 가장 가까운지 판정
  • 도부터 시까지 7개 음계 외에도 배경소음, 음이탈 등의 틀린 경우 3가지를 추가로 학습시켜 정확도 향상


연주하기

Canvas API

  • Canvas API를 이용하여 오선지 표시
  • 음 높이와 해당 음의 start / end 시간을 가진 Note라는 배열을 통해서 시간에 맞추어 화면에 표시

UserMedia API

  • 사용자의 마이크 권한 요청

Web Audio API

  • AnalyserNode를 사용하여 실시간으로 마이크로 들어오는 주파수 값을 받는다.
  • 푸리에 변환 소스를 통해서 입력받은 주파수 값을 음 높이로 변환

ResizeObserver API

  • 실시간으로 변환되는 음 높이를 받아서 큐 형태의 배열에 넣고 해당 배열을 화면 중앙에 표시


📋 개발환경

BackEnd

  • SpringBoot 2.5.5
  • Java 11

FrontEnd

  • Vue.js 3.0.0
  • node 16.18.0

AI

  • Teachable Machine
  • Tensorflow 1.3.1

CI / CD

  • AWS EC2
  • Docker
  • NGINX


📂 프로젝트 파일 구조


Back

backend
├── src
│ ├── auth
│ ├── filter
│ ├── interceptor
│ └── listener
├── Dockerfile
└── pom.xml

Front

frontend
├── node_modules
├── patches
│ ├── @tensorflow-models+speech-commands+0.4.2
├── public
└── src
├── assets
├── components
│ ├── multi
│ │ ├── MultiAnalizeMain
│ │ ├── MultiSoloAnalizeMain
│ │ ├── MultiSongMain
│ │ └── MultiSoundMain
│ ├── solo
│ │ ├── teachable
│ │ ├── SoloAnalizeMain
│ │ ├── SoloFingeringMain
│ │ ├── SoloMain
│ │ ├── SoloSongMain
│ │ ├── SoloSoundMain
│ │ ├── SoloTutorialMain
│ │ └── SoloTutorialSelect
│ ├── video
│ │ ├── OvVideo
│ │ ├── soloUserVideo
│ │ └── UserVideo
│ ├── HomeMain
│ └── ModeMain
├── router
├── store
└── views
├── solo
│ ├── SoloAnalizeView
│ ├── SoloFingeringView
│ ├── SoloSongView
│ ├── SoloSoundView
│ ├── SoloTutorialSelectView
│ ├── SoloTutorialView
│ └── SoloView
├── HomeView
├── ModelView
└── playroom


💬 협업 툴

  • GitLab
  • Notion
  • JIRA
  • MatterMost


👬 협업 환경

GitLab

Git Flow

  • 각자 맡은 기능에 맞게 feature 브랜치를 생성하여 개발
  • 완료된 기능은 developmerge
  • 매일 오전 9시 스크럼 회의가 끝나면 develop 최신 버전을 pull

Commit convention

FEAT : 기능 추가, 프로젝트 생성, 초기 설정
FIX : 기능 변경, 기능 수정, 오류 수정
REFACTOR : 같은 기능을 하는 코드를 리팩토링

Git Convention

Notion

  • 팀 전체가 알아야 할 공지사항이나 프로젝트를 진행하면서 나오는 각종 산출물들의 형상관리

JIRA

  • 협업 및 일정, 업무 관리를 JIRA를 통해 관리하였습니다.
  • 매 주 월요일 한 주동안 진행되어야 할 계획을 수립하여 진행할 이슈들을 스프린트를 만들어 등록

Epic : BackEnd, FrontEnd, 기획, 설계
story : 기획, 설계, 산출물 제작 등 개발외의 업무에 관한 업무 관리
task : 코드 작성과 관련된 개발업무에 관한 업무 관리

MatterMost

  • 일일 스크럼 회의록 관리
  • GitLab과 연동하여 실시간 GitLab 관리
  • Archiving채널을 통해서 각 종 정보 공유

산출물



결과물



팀원 소개

image

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

🎼 튜토리코더 - 원격 악기 교육 플랫폼

📆 프로젝트 진행 기간

2023.01.09(월) ~ 2023.02.17(금) (39일간 진행)
SSAFY 8기 2학기 공통프로젝트 - 튜토리코더

💻 서비스 화면

메인화면 / 닉네임 설정

모드 설정 화면 / 혼자하기 모드 화면

혼자하기 튜토리얼 / 혼자하기 소리내기

혼자하기 연주하기 / 같이하기 대기방

같이하기 카카오톡 공유 / 같이하기 방 설정

같이하기 소리내기 / 같이하기 연주하기



🎵 기획 배경

음악적 성장이 가장 급속하게 발달하는 시기는 초등학교 시기이며 이 시기의 음악적 경험은 아이들에게 많은 영향을 미친다.

  • 높은 학업 성취도와 자존감
  • 창의적인 사고
  • 의사를 표현하는 능력향상 하지만 현재 코로나로 인해 교실에서 마스크를 착용해야 하기 때문에 음악교육을 하는데 어려움이 있습니다.

이와 같은 어려움을 해소하기 위해서 탄생한 WebRTC기반의 원격 악기 교육 플랫폼 입니다

🎶 개요

원격 악기 교육 플랫폼 - 튜토리코더

  • 각자의 실력에 따른 연습 방법 제시

초등교육과정의 여러 동요들을 통해서 자신의 수준의 맞는 곡을 선택하여 연습할 수 있습니다.

  • 즉각적인 피드백

게임 결과를 분석한 결과를 보여줌으로써 자신의 부족한 부분을 바로 확인할 수 있습니다.

💻 스토리보드

스토리보드

📚 기술 스텍 및 주요 기능

🎥 OpenVidu

OpenVidu는 웹 또는 모바일 애플리케이션에 실시간 커뮤니케이션을 쉽고 빠르게 추가할 수 있는 플랫폼입니다.



👤 teachable machine

리코더의 각 음계를 학습시켜 소리 인식을 통해 유저가 연주하는 음계를 파악하고 요구하는 음계와 맞는지 틀린지를 구분하게 하였습니다.

학습시킨 모델에서 솔과 라를 각각 연주한 결과입니다. 튜토리코더에서는 음계별로 도출된 값을 이용하여 어떤 음계에 가장 가까운지 판단하였습니다.

소리내기

  • 사용자가 내는 소리가 학습된 데이터중 어느 것에 가장 가까운지 판정
  • 도부터 시까지 7개 음계 외에도 배경소음, 음이탈 등의 틀린 경우 3가지를 추가로 학습시켜 정확도 향상


연주하기

Canvas API

  • Canvas API를 이용하여 오선지 표시
  • 음 높이와 해당 음의 start / end 시간을 가진 Note라는 배열을 통해서 시간에 맞추어 화면에 표시

UserMedia API

  • 사용자의 마이크 권한 요청

Web Audio API

  • AnalyserNode를 사용하여 실시간으로 마이크로 들어오는 주파수 값을 받는다.
  • 푸리에 변환 소스를 통해서 입력받은 주파수 값을 음 높이로 변환

ResizeObserver API

  • 실시간으로 변환되는 음 높이를 받아서 큐 형태의 배열에 넣고 해당 배열을 화면 중앙에 표시


📋 개발환경

BackEnd

  • SpringBoot 2.5.5
  • Java 11

FrontEnd

  • Vue.js 3.0.0
  • node 16.18.0

AI

  • Teachable Machine
  • Tensorflow 1.3.1

CI / CD

  • AWS EC2
  • Docker
  • NGINX


📂 프로젝트 파일 구조


Back

backend
├── src
│ ├── auth
│ ├── filter
│ ├── interceptor
│ └── listener
├── Dockerfile
└── pom.xml

Front

frontend
├── node_modules
├── patches
│ ├── @tensorflow-models+speech-commands+0.4.2
├── public
└── src
├── assets
├── components
│ ├── multi
│ │ ├── MultiAnalizeMain
│ │ ├── MultiSoloAnalizeMain
│ │ ├── MultiSongMain
│ │ └── MultiSoundMain
│ ├── solo
│ │ ├── teachable
│ │ ├── SoloAnalizeMain
│ │ ├── SoloFingeringMain
│ │ ├── SoloMain
│ │ ├── SoloSongMain
│ │ ├── SoloSoundMain
│ │ ├── SoloTutorialMain
│ │ └── SoloTutorialSelect
│ ├── video
│ │ ├── OvVideo
│ │ ├── soloUserVideo
│ │ └── UserVideo
│ ├── HomeMain
│ └── ModeMain
├── router
├── store
└── views
├── solo
│ ├── SoloAnalizeView
│ ├── SoloFingeringView
│ ├── SoloSongView
│ ├── SoloSoundView
│ ├── SoloTutorialSelectView
│ ├── SoloTutorialView
│ └── SoloView
├── HomeView
├── ModelView
└── playroom


💬 협업 툴

  • GitLab
  • Notion
  • JIRA
  • MatterMost


👬 협업 환경

GitLab

Git Flow

  • 각자 맡은 기능에 맞게 feature 브랜치를 생성하여 개발
  • 완료된 기능은 developmerge
  • 매일 오전 9시 스크럼 회의가 끝나면 develop 최신 버전을 pull

Commit convention

FEAT : 기능 추가, 프로젝트 생성, 초기 설정
FIX : 기능 변경, 기능 수정, 오류 수정
REFACTOR : 같은 기능을 하는 코드를 리팩토링

Git Convention

Notion

  • 팀 전체가 알아야 할 공지사항이나 프로젝트를 진행하면서 나오는 각종 산출물들의 형상관리

JIRA

  • 협업 및 일정, 업무 관리를 JIRA를 통해 관리하였습니다.
  • 매 주 월요일 한 주동안 진행되어야 할 계획을 수립하여 진행할 이슈들을 스프린트를 만들어 등록

Epic : BackEnd, FrontEnd, 기획, 설계
story : 기획, 설계, 산출물 제작 등 개발외의 업무에 관한 업무 관리
task : 코드 작성과 관련된 개발업무에 관한 업무 관리

MatterMost

  • 일일 스크럼 회의록 관리
  • GitLab과 연동하여 실시간 GitLab 관리
  • Archiving채널을 통해서 각 종 정보 공유

산출물



결과물



팀원 소개

image

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

🎼 튜토리코더 - 원격 악기 교육 플랫폼

📆 프로젝트 진행 기간

2023.01.09(월) ~ 2023.02.17(금) (39일간 진행)
SSAFY 8기 2학기 공통프로젝트 - 튜토리코더

💻 서비스 화면

메인화면 / 닉네임 설정

모드 설정 화면 / 혼자하기 모드 화면

혼자하기 튜토리얼 / 혼자하기 소리내기

혼자하기 연주하기 / 같이하기 대기방

같이하기 카카오톡 공유 / 같이하기 방 설정

같이하기 소리내기 / 같이하기 연주하기



🎵 기획 배경

음악적 성장이 가장 급속하게 발달하는 시기는 초등학교 시기이며 이 시기의 음악적 경험은 아이들에게 많은 영향을 미친다.

  • 높은 학업 성취도와 자존감
  • 창의적인 사고
  • 의사를 표현하는 능력향상 하지만 현재 코로나로 인해 교실에서 마스크를 착용해야 하기 때문에 음악교육을 하는데 어려움이 있습니다.

이와 같은 어려움을 해소하기 위해서 탄생한 WebRTC기반의 원격 악기 교육 플랫폼 입니다

🎶 개요

원격 악기 교육 플랫폼 - 튜토리코더

  • 각자의 실력에 따른 연습 방법 제시

초등교육과정의 여러 동요들을 통해서 자신의 수준의 맞는 곡을 선택하여 연습할 수 있습니다.

  • 즉각적인 피드백

게임 결과를 분석한 결과를 보여줌으로써 자신의 부족한 부분을 바로 확인할 수 있습니다.

💻 스토리보드

스토리보드

📚 기술 스텍 및 주요 기능

🎥 OpenVidu

OpenVidu는 웹 또는 모바일 애플리케이션에 실시간 커뮤니케이션을 쉽고 빠르게 추가할 수 있는 플랫폼입니다.



👤 teachable machine

리코더의 각 음계를 학습시켜 소리 인식을 통해 유저가 연주하는 음계를 파악하고 요구하는 음계와 맞는지 틀린지를 구분하게 하였습니다.

학습시킨 모델에서 솔과 라를 각각 연주한 결과입니다. 튜토리코더에서는 음계별로 도출된 값을 이용하여 어떤 음계에 가장 가까운지 판단하였습니다.

소리내기

  • 사용자가 내는 소리가 학습된 데이터중 어느 것에 가장 가까운지 판정
  • 도부터 시까지 7개 음계 외에도 배경소음, 음이탈 등의 틀린 경우 3가지를 추가로 학습시켜 정확도 향상


연주하기

Canvas API

  • Canvas API를 이용하여 오선지 표시
  • 음 높이와 해당 음의 start / end 시간을 가진 Note라는 배열을 통해서 시간에 맞추어 화면에 표시

UserMedia API

  • 사용자의 마이크 권한 요청

Web Audio API

  • AnalyserNode를 사용하여 실시간으로 마이크로 들어오는 주파수 값을 받는다.
  • 푸리에 변환 소스를 통해서 입력받은 주파수 값을 음 높이로 변환

ResizeObserver API

  • 실시간으로 변환되는 음 높이를 받아서 큐 형태의 배열에 넣고 해당 배열을 화면 중앙에 표시


📋 개발환경

BackEnd

  • SpringBoot 2.5.5
  • Java 11

FrontEnd

  • Vue.js 3.0.0
  • node 16.18.0

AI

  • Teachable Machine
  • Tensorflow 1.3.1

CI / CD

  • AWS EC2
  • Docker
  • NGINX


📂 프로젝트 파일 구조


Back

backend
├── src
│ ├── auth
│ ├── filter
│ ├── interceptor
│ └── listener
├── Dockerfile
└── pom.xml

Front

frontend
├── node_modules
├── patches
│ ├── @tensorflow-models+speech-commands+0.4.2
├── public
└── src
├── assets
├── components
│ ├── multi
│ │ ├── MultiAnalizeMain
│ │ ├── MultiSoloAnalizeMain
│ │ ├── MultiSongMain
│ │ └── MultiSoundMain
│ ├── solo
│ │ ├── teachable
│ │ ├── SoloAnalizeMain
│ │ ├── SoloFingeringMain
│ │ ├── SoloMain
│ │ ├── SoloSongMain
│ │ ├── SoloSoundMain
│ │ ├── SoloTutorialMain
│ │ └── SoloTutorialSelect
│ ├── video
│ │ ├── OvVideo
│ │ ├── soloUserVideo
│ │ └── UserVideo
│ ├── HomeMain
│ └── ModeMain
├── router
├── store
└── views
├── solo
│ ├── SoloAnalizeView
│ ├── SoloFingeringView
│ ├── SoloSongView
│ ├── SoloSoundView
│ ├── SoloTutorialSelectView
│ ├── SoloTutorialView
│ └── SoloView
├── HomeView
├── ModelView
└── playroom


💬 협업 툴

  • GitLab
  • Notion
  • JIRA
  • MatterMost


👬 협업 환경

GitLab

Git Flow

  • 각자 맡은 기능에 맞게 feature 브랜치를 생성하여 개발
  • 완료된 기능은 developmerge
  • 매일 오전 9시 스크럼 회의가 끝나면 develop 최신 버전을 pull

Commit convention

FEAT : 기능 추가, 프로젝트 생성, 초기 설정
FIX : 기능 변경, 기능 수정, 오류 수정
REFACTOR : 같은 기능을 하는 코드를 리팩토링

Git Convention

Notion

  • 팀 전체가 알아야 할 공지사항이나 프로젝트를 진행하면서 나오는 각종 산출물들의 형상관리

JIRA

  • 협업 및 일정, 업무 관리를 JIRA를 통해 관리하였습니다.
  • 매 주 월요일 한 주동안 진행되어야 할 계획을 수립하여 진행할 이슈들을 스프린트를 만들어 등록

Epic : BackEnd, FrontEnd, 기획, 설계
story : 기획, 설계, 산출물 제작 등 개발외의 업무에 관한 업무 관리
task : 코드 작성과 관련된 개발업무에 관한 업무 관리

MatterMost

  • 일일 스크럼 회의록 관리
  • GitLab과 연동하여 실시간 GitLab 관리
  • Archiving채널을 통해서 각 종 정보 공유

산출물



결과물



팀원 소개

image

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages