쪽지발송 성공
Click here
재능넷 이용방법
재능넷 이용방법 동영상편
가입인사 이벤트
판매 수수료 안내
안전거래 TIP
재능인 인증서 발급안내

🌲 지식인의 숲 🌲

🌳 디자인
🌳 음악/영상
🌳 문서작성
🌳 번역/외국어
🌳 프로그램개발
🌳 마케팅/비즈니스
🌳 생활서비스
🌳 철학
🌳 과학
🌳 수학
🌳 역사
해당 지식과 관련있는 인기재능

안녕하세요!!!고객님이 상상하시는 작업물 그 이상을 작업해 드리려 노력합니다.저는 작업물을 완성하여 고객님에게 보내드리는 것으로 거래 완료...

#### 결재 먼저 하지 마시고 쪽지 먼저 주세요. ######## 결재 먼저 하지 마시고 쪽지 먼저 주세요. ####안녕하세요. C/C++/MFC/C#/Python 프...

프로그래밍 15년이상 개발자입니다.(이학사, 공학 석사) ※ 판매자와 상담 후에 구매해주세요. 학습을 위한 코드, 게임, 엑셀 자동화, 업...

30년간 직장 생활을 하고 정년 퇴직을 하였습니다.퇴직 후 재능넷 수행 내용은 쇼핑몰/학원/판매점 등 관리 프로그램 및 데이터 ...

C++ 오디오 프로그래밍: 음악 앱 만들기

2024-09-17 04:01:24

재능넷
조회수 88 댓글수 0

C++ 오디오 프로그래밍: 음악 앱 만들기 🎵🎹

안녕하세요, 음악과 프로그래밍의 세계에 오신 것을 환영합니다! 🎉 이 글에서는 C++를 사용하여 오디오 프로그래밍을 통해 음악 앱을 만드는 방법에 대해 상세히 알아보겠습니다. 프로그래밍 세계에서 음악의 마법을 창조하는 여정을 함께 떠나볼까요?

오디오 프로그래밍은 프로그래밍 기술과 음악적 창의성이 만나는 흥미진진한 분야입니다. C++의 강력한 기능을 활용하여 우리만의 독특한 음악 앱을 만들 수 있습니다. 이는 단순한 코딩 이상의 것으로, 소리의 세계를 탐험하고 조작하는 예술적인 과정이기도 합니다.

이 글은 C++ 프로그래밍에 대한 기본적인 이해가 있는 분들을 대상으로 합니다. 하지만 걱정 마세요! 복잡한 개념들도 최대한 쉽게 설명하려고 노력했습니다. 또한, 재능넷(https://www.jaenung.net)의 '지식인의 숲' 섹션을 통해 이 글을 접하신 분들께 특별히 감사드립니다. 여러분의 창의적인 재능과 이 글의 내용이 만나 멋진 시너지를 낼 수 있기를 기대합니다.

자, 이제 C++로 음악의 세계를 프로그래밍하는 여정을 시작해볼까요? 🚀🎼

1. C++ 오디오 프로그래밍의 기초 🎧

C++에서 오디오 프로그래밍을 시작하기 전에, 먼저 소리의 기본 개념과 디지털 오디오의 원리를 이해해야 합니다. 이는 우리가 만들 음악 앱의 기반이 될 것입니다.

1.1 소리의 기본 개념

소리는 물리적으로 공기의 진동입니다. 이 진동은 파동의 형태로 전파되며, 우리의 귀에 도달하여 소리로 인식됩니다. 소리의 주요 특성은 다음과 같습니다:

  • 주파수(Frequency): 1초 동안의 진동 횟수로, 단위는 Hz(헤르츠)입니다. 주파수가 높을수록 고음이 됩니다.
  • 진폭(Amplitude): 파동의 최대 변위로, 소리의 크기를 결정합니다.
  • 파형(Waveform): 소리의 특성을 나타내는 그래프 형태입니다.
시간 진폭 소리의 파형

1.2 디지털 오디오의 원리

디지털 오디오는 연속적인 아날로그 신호를 이산적인 디지털 값으로 변환한 것입니다. 이 과정을 '샘플링'이라고 합니다. 주요 개념은 다음과 같습니다:

  • 샘플링 레이트(Sampling Rate): 1초 동안 샘플링하는 횟수입니다. 일반적으로 44.1kHz나 48kHz를 사용합니다.
  • 비트 깊이(Bit Depth): 각 샘플의 크기를 나타내는 비트 수입니다. 보통 16비트나 24비트를 사용합니다.
  • 채널(Channel): 오디오 신호의 수를 나타냅니다. 스테레오는 2채널, 모노는 1채널입니다.
시간 진폭 디지털 오디오 샘플링

1.3 C++에서의 오디오 처리

C++에서 오디오를 처리하기 위해서는 주로 다음과 같은 작업을 수행합니다:

  • 오디오 데이터 읽기/쓰기
  • 오디오 신호 생성 및 조작
  • 효과 적용 (예: 필터, 리버브, 딜레이 등)
  • 오디오 스트리밍

이러한 작업을 수행하기 위해 C++에서는 다양한 라이브러리를 사용할 수 있습니다. 대표적인 라이브러리로는 PortAudio, JUCE, OpenAL 등이 있습니다. 이 글에서는 주로 JUCE 프레임워크를 사용하여 예제를 설명할 것입니다.

JUCE는 크로스 플랫폼 C++ 라이브러리로, 오디오 애플리케이션 개발에 특화되어 있습니다. JUCE를 사용하면 복잡한 저수준 오디오 처리를 추상화하여 보다 쉽게 오디오 프로그래밍을 할 수 있습니다.

다음 섹션에서는 JUCE를 사용하여 간단한 오디오 프로그램을 만드는 방법을 살펴보겠습니다. 🎶

2. JUCE 프레임워크 소개 및 설정 🛠️

JUCE(Jules' Utility Class Extensions)는 오디오 애플리케이션 개발을 위한 강력한 C++ 프레임워크입니다. 크로스 플랫폼을 지원하며, 오디오 처리, GUI 생성, 플러그인 개발 등 다양한 기능을 제공합니다.

2.1 JUCE의 주요 특징

  • 크로스 플랫폼 지원 (Windows, macOS, Linux, iOS, Android)
  • 오디오 및 MIDI 처리를 위한 강력한 클래스 제공
  • GUI 개발을 위한 풍부한 컴포넌트
  • VST, AU, AAX 등 다양한 플러그인 포맷 지원
  • 실시간 오디오 처리에 최적화된 성능

2.2 JUCE 설치 및 설정

JUCE를 사용하기 위해서는 다음 단계를 따라야 합니다:

  1. JUCE 다운로드: JUCE 공식 웹사이트(https://juce.com/)에서 최신 버전을 다운로드합니다.
  2. Projucer 실행: JUCE에 포함된 Projucer 애플리케이션을 실행합니다. 이는 JUCE 프로젝트를 생성하고 관리하는 도구입니다.
  3. 새 프로젝트 생성: Projucer에서 새 프로젝트를 생성합니다. 오디오 애플리케이션 템플릿을 선택할 수 있습니다.
  4. 프로젝트 설정: 프로젝트 이름, 저장 위치, 모듈 등을 설정합니다.
  5. IDE에서 열기: 프로젝트를 선호하는 IDE(예: Visual Studio, Xcode)에서 엽니다.
JUCE 프로젝트 설정 과정 1 다운로드 2 Projucer 실행 3 프로젝트 생성 4 설정 5 IDE에서 열기

2.3 JUCE 프로젝트 구조

JUCE 프로젝트는 일반적으로 다음과 같은 구조를 가집니다:

  • Main.cpp: 애플리케이션의 진입점
  • MainComponent.h/cpp: 주요 GUI 컴포넌트
  • JuceHeader.h: JUCE 모듈 헤더

JUCE를 사용하면 오디오 처리, GUI 생성, 파일 I/O 등 다양한 작업을 쉽게 수행할 수 있습니다. 예를 들어, 오디오 입출력을 처리하는 기본 코드는 다음과 같습니다:


class MainContentComponent : public AudioAppComponent
{
public:
    MainContentComponent()
    {
        setSize (800, 600);
        setAudioChannels (2, 2); // 스테레오 입출력
    }

    ~MainContentComponent()
    {
        shutdownAudio();
    }

    void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override
    {
        // 오디오 처리 준비
    }

    void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) override
    {
        // 실시간 오디오 처리
    }

    void releaseResources() override
    {
        // 사용한 리소스 해제
    }

    void paint (Graphics& g) override
    {
        g.fillAll (Colours::black);
    }

private:
    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)
};

이 코드는 기본적인 오디오 컴포넌트를 설정하고, 오디오 입출력을 처리하는 메서드를 제공합니다. prepareToPlay에서 초기 설정을, getNextAudioBlock에서 실시간 오디오 처리를 수행할 수 있습니다.

JUCE를 사용하면 이러한 기본 구조를 바탕으로 복잡한 오디오 애플리케이션을 쉽게 개발할 수 있습니다. 다음 섹션에서는 이를 바탕으로 실제 음악 앱을 만드는 과정을 살펴보겠습니다. 🎵🖥️

3. 기본적인 음악 앱 만들기 🎼

이제 JUCE를 사용하여 간단한 음악 앱을 만들어보겠습니다. 이 앱은 기본적인 신디사이저 기능을 가지며, 키보드 입력에 따라 소리를 생성합니다.

3.1 프로젝트 설정

먼저 Projucer에서 새 프로젝트를 생성합니다. 'Audio Application'템플릿을 선택하고, 프로젝트 이름을 'SimpleSynth'로 지정합니다.

3.2 오실레이터 클래스 만들기

소리를 생성하기 위한 기본 오실레이터 클래스를 만들어봅시다.


class Oscillator
{
public:
    Oscillator() : frequency(440.0), phase(0.0), sampleRate(44100.0) {}

    void setFrequency(float freq)
    {
        frequency = freq;
    }

    void setSampleRate(float sr)
    {
        sampleRate = sr;
    }

    float getNextSample()
    {
        float sample = std::sin(2.0 * M_PI * phase);
        phase += frequency / sampleRate;
        if (phase >= 1.0)
            phase -= 1.0;
        return sample;
    }

private:
    float frequency;
    float phase;
    float sampleRate;
};

Oscillator 클래스는 기본적인 사인파를 생성합니다. getNextSample() 메서드를 호출할 때마다 다음 오디오 샘플을 반환합니다.

3.3 MainComponent 수정

이제 MainComponent를 수정하여 오실레이터를 사용하고 키보드 입력을 처리하도록 합니다.


class MainComponent : public AudioAppComponent,
                      public KeyListener
{
public:
    MainComponent()
    {
        setSize (800, 600);
        setAudioChannels (0, 2); // 스테레오 출력만 사용
        addKeyListener(this);
        setWantsKeyboardFocus(true);
    }

    ~MainComponent() override
    {
        shutdownAudio();
    }

    void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override
    {
        osc.setSampleRate(sampleRate);
    }

    void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) override
    {
        auto* leftChannel = bufferToFill.buffer->getWritePointer(0);
        auto* rightChannel = bufferToFill.buffer->getWritePointer(1);

        for (auto sample = 0; sample < bufferToFill.numSamples; ++sample)
        {
            float currentSample = osc.getNextSample();
            leftChannel[sample] = currentSample;
            rightChannel[sample] = currentSample;
        }
    }

    void releaseResources() override
    {
    }

    void paint (Graphics& g) override
    {
        g.fillAll (getLookAndFeel().findColour (ResizableWindow::backgroundColourId));
        g.setFont (Font (16.0f));
        g.setColour (Colours::white);
        g.drawText ("Press keys A-G for different notes!", getLocalBounds(), Justification::centred, true);
    }

    void resized() override
    {
    }

    bool keyPressed (const KeyPress& key, Component* originatingComponent) override
    {
        // A부터 G까지의 키에 대해 주파수 설정
        switch (key.getTextCharacter())
        {
            case 'a': case 'A': osc.setFrequency(440.0f); break;  // A4
            case 's': case 'S': osc.setFrequency(493.88f); break; // B4
            case 'd': case 'D': osc.setFrequency(261.63f); break; // C4
            case 'f': case 'F': osc.setFrequency(293.66f); break; // D4
            case 'g': case 'G': osc.setFrequency(329.63f); break; // E4
            default: return false;
        }
        return true;
    }

private:
    Oscillator osc;

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
};

이 코드는 다음과 같은 기능을 수행합니다:

  • 오실레이터 객체를 생성하고 관리합니다.
  • getNextAudioBlock 메서드에서 실시간으로 오디오 샘플을 생성합니다.
  • 키보드 입력을 처리하여 다른 음높이의 소리를 생성합니다.

3.4 GUI 개선

앱의 사용성을 높이기 위해 간단한 GUI를 추가해봅시다. 버튼을 클릭하여 음을 재생할 수 있도록 만들어보겠습니다.


class MainComponent : public AudioAppComponent,
                      public Button::Listener
{
public:
    MainComponent()
    {
        setSize (800, 600);
        setAudioChannels (0, 2);

        addAndMakeVisible(playButton);
        playButton.setButtonText("Play A4");
        playButton.addListener(this);
    }

    // ... (이전 코드와 동일)

    void resized() override
    {
        playButton.setBounds(getWidth() / 2 - 50, getHeight() / 2 - 25, 100, 50);
    }

    void buttonClicked (Button* button) override
    {
        if (button == &playButton)
        {
            osc.setFrequency(440.0f); // A4 음 재생
        }
    }

private:
    Oscillator osc;
    TextButton playButton;

    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
};
Play A4 Simple Synth

이제 기본적인 음악 앱이 완성되었습니다! 이 앱은 A4 음을 재생할 수 있으며, 키보드 입력을 통해 다른 음도 재생할 수 있습니다.

다음 섹션에서는 이 기본 앱을 확장하여 더 복잡한 기능을 추가해보겠습니다. 음색 조절, 엔벨로프, 효과 등을 구현하여 더 풍부한 음악 앱을 만들어볼 것입니다. 🎹🎛️

4. 고급 기능 추가하기 🚀

기본적인 신디사이저 앱을 만들었으니, 이제 더 흥미로운 기능들을 추가해 보겠습니다. 이 섹션에서는 다양한 파형, ADSR 엔벨로프, 필터, 그리고 간단한 시퀀서를 구현해 볼 것입니다.

4.1 다양한 파형 구현

먼저 오실레이터 클래스를 확장하여 사인파 외에도 다양한 파형을 생성할 수 있도록 해보겠습니다.


class Oscillator
{
public:
    enum WaveType
    {
        Sine,
        Square,
        Saw,
        Triangle
    };

    Oscillator() : frequency(440.0), phase(0.0), sampleRate(44100.0), waveType(Sine) {}

    void setWaveType(WaveType type)
    {
        waveType = type;
    }

    // ... (이전 코드와 동일)

    float getNextSample()
    {
        float sample = 0.0f;
        switch (waveType)
        {
            case Sine:
                sample = std::sin(2.0 * M_PI * phase);
                break;
            case Square:
                sample = phase < 0.5f ? 1.0f : -1.0f;
                break;
            case Saw:
                sample = 2.0f * phase - 1.0f;
                break;
            case Triangle:
                sample = phase < 0.5f ? 4.0f * phase - 1.0f : 3.0f - 4.0f * phase;
                break;
        }
        
        phase += frequency / sampleRate;
        if (phase >= 1.0)
            phase -= 1.0;
        return sample;
    }

private:
    float frequency;
    float phase;
    float sampleRate;
    WaveType waveType;
};
다양한 파형 Sine Wave Square Wave Saw Wave Triangle Wave

4.2 ADSR 엔벨로프 구현

ADSR(Attack, Decay, Sustain, Release) 엔벨로프는 소리의 시작부터 끝까지의 볼륨 변화를 제어합니다. 이를 구현해 봅시다.


class ADSREnvelope
{
public:
    ADSREnvelope() : state(Idle), level(0.0f), 
                     attackTime(0.1f), decayTime(0.1f), 
                     sustainLevel(0.7f), releaseTime(0.2f) {}

    void trigger()
    {
        state = Attack;
        level = 0.0f;
    }

    void release()
    {
        state = Release;
    }

    float getNextSample()
    {
        switch (state)
        {
            case Attack:
                level += 1.0f / (attackTime * sampleRate);
                if (level >= 1.0f)
                {
                    level = 1.0f;
                    state = Decay;
                }
                break;
            case Decay:
                level -= (1.0f - sustainLevel) / (decayTime * sampleRate);
                if (level <= sustainLevel)
                {
                    level = sustainLevel;
                    state = Sustain;
                }
                break;
            case Sustain:
                // 레벨 유지
                break;
            case Release:
                level -= sustainLevel / (releaseTime * sampleRate);
                if (level <= 0.0f)
                {
                    level = 0.0f;
                    state = Idle;
                }
                break;
            case Idle:
                level = 0.0f;
                break;
        }
        return level;
    }

private:
    enum State { Idle, Attack, Decay, Sustain, Release };
    State state;
    float level;
    float attackTime, decayTime, sustainLevel, releaseTime;
    float sampleRate;
};
ADSR Envelope Attack Decay Sustain Release

4.3 필터 구현

간단한 로우패스 필터를 구현하여 소리의 음색을 조절할 수 있게 해봅시다.


class LowPassFilter
{
public:
    LowPassFilter() : cutoff(1000.0f), resonance(0.7f), y1(0.0f), y2(0.0f), x1(0.0f), x2(0.0f) {}

    void setCutoff(float frequency)
    {
        cutoff = frequency;
        calculateCoefficients();
    }

    void setResonance(float q)
    {
        resonance = q;
        calculateCoefficients();
    }

    float process(float input)
    {
        float output = a0 * input + a1 * x1 + a2 * x2 - b1 * y1 - b2 * y2;
        x2 = x1;
        x1 = input;
        y2 = y1;
        y1 = output;
        return output;
    }

private:
    void calculateCoefficients()
    {
        float omega = 2.0f * M_PI * cutoff / sampleRate;
        float alpha = std::sin(omega) / (2.0f * resonance);
        
        a0 = (1.0f - std::cos(omega)) / 2.0f;
        a1 = 1.0f - std::cos(omega);
        a2 = a0;
        b1 = -2.0f * std::cos(omega);
        b2 = 1.0f - alpha;
        
        float norm = 1.0f / (1.0f + alpha);
        a0 *= norm;
        a1 *= norm;
        a2 *= norm;
        b1 *= norm;
        b2 *= norm;
    }

    float cutoff, resonance;
    float y1, y2, x1, x2;
    float a0, a1, a2, b1, b2;
    float sampleRate;
};

4.4 간단한 시퀀서 구현

마지막으로, 간단한 시퀀서를 구현하여 자동으로 음악을 재생할 수 있게 해봅시다.


class Sequencer
{
public:
    Sequencer() : currentStep(0), bpm(120) {}

    void setBPM(int newBpm)
    {
        bpm = newBpm;
    }

    void setSequence(const std::vector& newSequence)
    {
        sequence = newSequence;
    }

    float getNextNote()
    {
        float note = sequence[currentStep];
        currentStep = (currentStep + 1) % sequence.size();
        return note;
    }

    bool isNewStep()
    {
        double samplesPerStep = (60.0 / bpm) * sampleRate;
        return (sampleCount % static_cast(samplesPerStep)) == 0;
    }

    void incrementSampleCount()
    {
        sampleCount++;
    }

private:
    std::vector sequence;
    int currentStep;
    int bpm;
    int sampleCount;
    float sampleRate;
};

이제 이 모든 요소들을 MainComponent에 통합하여 더 복잡하고 흥미로운 음악 앱을 만들 수 있습니다. 예를 들어, GUI에 파형 선택, ADSR 조절, 필터 조절, 시퀀서 제어 등의 요소를 추가할 수 있습니다.

이러한 고급 기능들을 추가함으로써, 우리의 음악 앱은 단순한 신디사이저에서 복잡한 음악 제작 도구로 발전하게 됩니다. 사용자는 다양한 파형을 조합하고, 엔벨로프를 조절하며, 필터를 적용하고, 시퀀서를 통해 자동화된 음악을 만들 수 있게 됩니다.

다음 섹션에서는 이러한 기능들을 효과적으로 표현할 수 있는 GUI 디자인에 대해 살펴보겠습니다. 또한, 성능 최적화와 오디오 처리의 효율성을 높이는 방법에 대해서도 논의할 것입니다. 🎛️🎚️🖥️

관련 키워드

  • C++
  • 오디오 프로그래밍
  • JUCE
  • 신디사이저
  • ADSR 엔벨로프
  • 오실레이터
  • 필터
  • 시퀀서
  • GUI 개발
  • 성능 최적화

지식의 가치와 지적 재산권 보호

자유 결제 서비스

'지식인의 숲'은 "이용자 자유 결제 서비스"를 통해 지식의 가치를 공유합니다. 콘텐츠를 경험하신 후, 아래 안내에 따라 자유롭게 결제해 주세요.

자유 결제 : 국민은행 420401-04-167940 (주)재능넷
결제금액: 귀하가 받은 가치만큼 자유롭게 결정해 주세요
결제기간: 기한 없이 언제든 편한 시기에 결제 가능합니다

지적 재산권 보호 고지

  1. 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
  2. AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
  3. 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
  4. 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
  5. AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.

재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

해당 지식과 관련있는 인기재능

엑셀 문서 작성 / VBA 개발 도와드립니다.1. 기본 가격으로 구매 가능한 재능  - 간단한 문서 작성  - 간단한 함수를 응용한 자료 정리&...

윈도우 프로그램밍 3년차 개발자 입니다.업무시간이 짧아 남는 시간에 재능이 필요한분께 도움이 되고자 합니다.구매 전 간단한 요구사항 및 금액 ...

안녕하세요? 틴라이프 / 코딩몬스터에서 개발자로 활동했던 LCS입니다.구매신청하시기전에 쪽지로  내용 / 기한 (마감시간 / ...

서울 4년제 컴퓨터공학과 재학중이며, 대학 연구실에서 학부연구생으로 일하고 있습니다.사용가능한 언어는 C / Objective C / C# /Java / PH...

📚 생성된 총 지식 2,804 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동) | 사업자등록번호 : 131-86-65451
    통신판매업신고 : 2018-수원영통-0307 | 직업정보제공사업 신고번호 : 중부청 2013-4호 | jaenung@jaenung.net

    (주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.
    (주)재능넷은 통신판매중개자로서 재능넷의 거래당사자가 아니며, 판매자가 등록한 상품정보 및 거래에 대해 재능넷은 일체 책임을 지지 않습니다.

    Copyright © 2024 재능넷 Inc. All rights reserved.
ICT Innovation 대상
미래창조과학부장관 표창
서울특별시
공유기업 지정
한국데이터베이스진흥원
콘텐츠 제공서비스 품질인증
대한민국 중소 중견기업
혁신대상 중소기업청장상
인터넷에코어워드
일자리창출 분야 대상
웹어워드코리아
인터넷 서비스분야 우수상
정보통신산업진흥원장
정부유공 표창장
미래창조과학부
ICT지원사업 선정
기술혁신
벤처기업 확인
기술개발
기업부설 연구소 인정
마이크로소프트
BizsPark 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창