1200 미만으로는 생소하고...

56000이냐 57600이냐는 좀 헷갈리네..

아무튼 가끔 쓸데 있으니 일단 링크!


Standard baud rates supported by most serial ports:
 
  • 110
  • 300
  •  
  • 600
  • 1200
  •  
  • 2400
  • 4800
  •  
  • 9600
  • 14400
  •  
  • 19200
  • 28800
  •  
  • 38400
  • 56000
  •  
  • 57600
  • 115200


  • Standard baud rates supported by some serial ports:
     
  • 128000
  • 153600
  •  
  • 230400
  • 256000
  •  
  • 460800
  • 921600


  • [링크 : http://digital.ni.com/public.nsf/allkb/D37754FFA24F7C3F86256706005B9BE7]

    Posted by 구차니

    c#이나 .net framework을 쓰면 간편한데

    win32로는 영 복잡할수 밖에 없는 듯?


    그런데 QueryDosDevice()를 쓰면 0ms 라는데

    1. CreateFile("COM" + 1->255) as suggested by Wael Dalloul
      ✔ Found com0com ports, took 234ms.

    2. QueryDosDevice()
      ✔ Found com0com ports, took 0ms.

    3. GetDefaultCommConfig("COM" + 1->255)
      ✔ Found com0com ports, took 235ms.

    4. "SetupAPI1" using calls to SETUPAPI.DLL
      ✔ Found com0com ports, also reported "friendly names", took 15ms.

    5. "SetupAPI2" using calls to SETUPAPI.DLL
      ✘ Did not find com0com ports, reported "friendly names", took 32ms.

    6. EnumPorts()
      ✘ Reported some non-COM ports, did not find com0com ports, took 15ms.

    7. Using WMI calls
      ✔ Found com0com ports, also reported "friendly names", took 47ms.

    8. COM Database using calls to MSPORTS.DLL
      ✔/✘ Reported some non-COM ports, found com0com ports, took 16ms.

    9. Iterate over registry key HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
      ✔ Found com0com ports, took 0ms. This is apparently what SysInternals PortMon uses.

    [링크 : http://stackoverflow.com/.../how-do-i-get-a-list-of-available-serial-ports-in-win32]


    m_MyPort 변수만 다른걸로 바꿔써주면 잘 작동 하는 듯

    단, unicode 기반에서는 (LPSTR)대신 (LPWSTR)로 해주어야 에러가 나지 않는다.

    void SelectComPort() //added function to find the present serial 
    {
    
        TCHAR lpTargetPath[5000]; // buffer to store the path of the COMPORTS
        DWORD test;
        bool gotPort=0; // in case the port is not found
    
        for(int i=0; i<255; i++) // checking ports from COM0 to COM255
        {
            CString str;
            str.Format(_T("%d"),i);
            CString ComName=CString("COM") + CString(str); // converting to COM0, COM1, COM2
    
            test = QueryDosDevice(ComName, (LPSTR)lpTargetPath, 5000);
    
                // Test the return value and error if any
            if(test!=0) //QueryDosDevice returns zero if it didn't find an object
            {
                m_MyPort.AddString((CString)ComName); // add to the ComboBox
                gotPort=1; // found port
            }
    
            if(::GetLastError()==ERROR_INSUFFICIENT_BUFFER)
            {
                lpTargetPath[10000]; // in case the buffer got filled, increase size of the buffer.
                continue;
            }
    
        }
    
        if(!gotPort) // if not port
        m_MyPort.AddString((CString)"No Active Ports Found"); // to display error message incase no ports found
    
    }


    [링크 : http://stackoverflow.com/.../what-is-proper-way-to-detect-all-available-serial-ports-on-windows]

    Posted by 구차니

    시리얼포트 10번 이후 열기라는 글이 있어서 보니


    버그가 있어서 COM9 까진 그냥 여는데, 그 이후에는

    \\.\COM%d 식으로 표현을 해야 하는데 escape 문자를 넣어주어야 하니 이렇게 미친듯이 길어진다.


    hPort = CreateFile("\\\\.\\COM10", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); 

    [링크 : http://stackoverflow.com/questions/11775185/open-a-com-port-in-c-with-number-higher-that-9]

    Posted by 구차니

    많이 쓰는게 N-8-1 이니까

    1byte 전송에 10bit를 주로 쓰니까 일단 둘다 계산



    많이 사용되는(?) 비트레이트 저장

    [링크 : http://www.cermetek.com/Catalog/High-Speed-Modems/DataSheet/...CH1794_607-0003/]

    Posted by 구차니
    모종의 음모/mp3 분석2014. 10. 1. 16:36
    음.. 크게와 닫지 않는데.. ADPCM 같은 느낌?

    과거에는 확실하게 디코더가 작동하지 않아 문제가 되었지만
    요즘에는 디코더가 좋아져서 문제없이 작동하기에 동일 bitrate일 경우 음질이 더 좋아진다고 한다.
    일단 frame 단위로 설정이 되므로 mp3 내에서도 프레임 단위로 M/S stereo 와 Joint Stereo를 오갈수 있는 듯

    M/S (Mid/Main - Side)
    [링크 : http://www.sounddevices.com/notes/general/ms-stereo-basics/]


    한정대역에서 고품질 오디오 서비스를 위한 코딩 방식의 일종. 
    스테레오 처럼 무조건 좌우측 신호를 나누어 기록하는 것이 아니고 좌우축 신호에서 공통되는 신호는 1가지만 기록하며 좌우측에는 각각 다른 신호만을 기록하므로 스테레오와 비교하면 남는 공간에 데이터를 더 기록할 수 있어 음질을 향상시킬 수 있는 방식이다. MP3나 DAB방송에서 한정된 대역으로 고음질 서비스를 위해 사용된다.
     
    [링크 : http://word.tta.or.kr/terms/termsView.jsp?gubun=1&terms_num=28873

    [링크 : http://en.wikipedia.org/wiki/Joint_(audio_engineering)]
    [링크 : http://ko.goldenears.net/board/1160186]
    [링크 : http://www.clien.net/cs2/bbs/board.php?bo_table=cm_mac&wr_id=384226&page=

    '모종의 음모 > mp3 분석' 카테고리의 다른 글

    mp3 id3 태그 내의 jpeg 추출  (0) 2014.10.01
    mp3 format  (0) 2014.10.01
    bitrate / sampling rate / mp3 / 등등등...  (0) 2014.09.16
    Posted by 구차니
    모종의 음모/mp3 분석2014. 10. 1. 16:27
    mp3 파일을 들여다 보다 보니.. JFIF 라는 문구 발견
    심심해서 적당하게 잘라내 보니 된다.

    일단 시작 지점은 JFIF 앞 6바이트 부터
    mp3 헤더인 FFFB... 이전 0x00 부분을 제외한(패딩으로 생각되니)

    추출한 녀석은 320x320 인데 IDv3 에 표준 사이즈인지는 미지수



     

    '모종의 음모 > mp3 분석' 카테고리의 다른 글

    mp3 joint stereo  (0) 2014.10.01
    mp3 format  (0) 2014.10.01
    bitrate / sampling rate / mp3 / 등등등...  (0) 2014.09.16
    Posted by 구차니
    모종의 음모/mp3 분석2014. 10. 1. 13:10
    mp3
    [링크 : http://en.wikipedia.org/wiki/ID3]

    일단 FFFBA040 이라고 아래에서 예를 들지만
    mpeg1 - Layer 3냐 
    mpeg2 - Layer 3냐에 따라서도 조금씩 달라지지만
    FFFx 로 시작하는건 "거의" 확실하다는 점



    [링크 : http://en.wikipedia.org/wiki/MP3]
    [링크 : http://www.datavoyage.com/mpgscript/mpeghdr.htm]

    MP3 file is divided into a small blocks - frames. Each frame has constant time length 0.026 sec.
    But size of one frame (in Bytes) varies according to bitrate. Eg. for 128kbps it is (normally) 417 Bytes and for 192kbps 626 Bytes.
    [링크 : http://www.multiweb.cz/twoinches/mp3inside.htm]

    --

    96kbps / 44k / 2ch mp3의 덤프
    팟인코더로 해서 앞에 ID3 태그에 간략하게 팟 인코더로 나오고 FFFB7064로 프레임당 313 바이트 정도로 나온다.
    이유는 모르겠지만.. CBR이라고 해도 313/314로 오락가락하는데 패딩 문제인거 같긴하지만 계산법을 찾아 봐야 할 듯

     

    320kbps / 44k / 2ch mp3의 덤프
    FFFBE064 로 프레임당 1044 / 1045 바이트


    mp3 헤더 분석 및 프레임 크기 계산


    // MPEG versions - use [version]

    const uint8_t mpeg_versions[4] = { 25, 0, 2, 1 };


    // Layers - use [layer]

    const uint8_t mpeg_layers[4] = { 0, 3, 2, 1 };


    // Bitrates - use [version][layer][bitrate]

    const uint16_t mpeg_bitrates[4][4][16] = {

      { // Version 2.5

        { 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0 }, // Reserved

        { 0,   8,  16,  24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160, 0 }, // Layer 3

        { 0,   8,  16,  24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160, 0 }, // Layer 2

        { 0,  32,  48,  56,  64,  80,  96, 112, 128, 144, 160, 176, 192, 224, 256, 0 }  // Layer 1

      },

      { // Reserved

        { 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0 }, // Invalid

        { 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0 }, // Invalid

        { 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0 }, // Invalid

        { 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0 }  // Invalid

      },

      { // Version 2

        { 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0 }, // Reserved

        { 0,   8,  16,  24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160, 0 }, // Layer 3

        { 0,   8,  16,  24,  32,  40,  48,  56,  64,  80,  96, 112, 128, 144, 160, 0 }, // Layer 2

        { 0,  32,  48,  56,  64,  80,  96, 112, 128, 144, 160, 176, 192, 224, 256, 0 }  // Layer 1

      },

      { // Version 1

        { 0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, 0 }, // Reserved

        { 0,  32,  40,  48,  56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 0 }, // Layer 3

        { 0,  32,  48,  56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, // Layer 2

        { 0,  32,  64,  96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }, // Layer 1

      }

    };


    // Sample rates - use [version][srate]

    const uint16_t mpeg_srates[4][4] = {

        { 11025, 12000,  8000, 0 }, // MPEG 2.5

        {     0,     0,     0, 0 }, // Reserved

        { 22050, 24000, 16000, 0 }, // MPEG 2

        { 44100, 48000, 32000, 0 }  // MPEG 1

    };


    // Samples per frame - use [version][layer]

    const uint16_t mpeg_frame_samples[4][4] = {

    //    Rsvd     3     2     1  < Layer  v Version

        {    0,  576, 1152,  384 }, //       2.5

        {    0,    0,    0,    0 }, //       Reserved

        {    0,  576, 1152,  384 }, //       2

        {    0, 1152, 1152,  384 }  //       1

    };


    // Slot size (MPEG unit of measurement) - use [layer]

    const uint8_t mpeg_slot_size[4] = { 0, 1, 1, 4 }; // Rsvd, 3, 2, 1



    uint16_t mpg_get_frame_size (char *hdr) {

        

        // Quick validity check

        if ( ( ((unsigned char)hdr[0] & 0xFF) != 0xFF)

          || ( ((unsigned char)hdr[1] & 0xE0) != 0xE0)   // 3 sync bits

          || ( ((unsigned char)hdr[1] & 0x18) == 0x08)   // Version rsvd

          || ( ((unsigned char)hdr[1] & 0x06) == 0x00)   // Layer rsvd

          || ( ((unsigned char)hdr[2] & 0xF0) == 0xF0)   // Bitrate rsvd

        ) return 0;

        

        // Data to be extracted from the header

        uint8_t   ver = (hdr[1] & 0x18) >> 3;   // Version index

        uint8_t   lyr = (hdr[1] & 0x06) >> 1;   // Layer index

        uint8_t   pad = (hdr[2] & 0x02) >> 1;   // Padding? 0/1

        uint8_t   brx = (hdr[2] & 0xf0) >> 4;   // Bitrate index

        uint8_t   srx = (hdr[2] & 0x0c) >> 2;   // SampRate index

        

        // Lookup real values of these fields

        uint32_t  bitrate   = mpeg_bitrates[ver][lyr][brx] * 1000;

        uint32_t  samprate  = mpeg_srates[ver][srx];

        uint16_t  samples   = mpeg_frame_samples[ver][lyr];

        uint8_t   slot_size = mpeg_slot_size[lyr];

        

        // In-between calculations

        float     bps       = (float)samples / 8.0;

        float     fsize     = ( (bps * (float)bitrate) / (float)samprate ) + ( (pad) ? slot_size : 0 );

        

        // Frame sizes are truncated integers

        return (uint16_t)fsize;

    }
    [링크 : http://www.hydrogenaud.io/forums/index.php?showtopic=85125]

    '모종의 음모 > mp3 분석' 카테고리의 다른 글

    mp3 joint stereo  (0) 2014.10.01
    mp3 id3 태그 내의 jpeg 추출  (0) 2014.10.01
    bitrate / sampling rate / mp3 / 등등등...  (0) 2014.09.16
    Posted by 구차니
    모종의 음모/mp3 분석2014. 9. 16. 16:18
    MP3 파일을 보면 아래와 같이 다양한 비트레이트가 있는데

    익숙한 녀석으로는 96kbps / 128kbps / 192kbps / 320kbps 등이 있다.

    [링크 : http://en.wikipedia.org/wiki/MP3]

    물론 이런 다양한 비트레이트가 존재하더라도
    CD의 원본 비트레이트
    44.1kHz / 16bit / 2Channel 이기에
    44100 * 16 * 2 = 1,411,200 bps
    편의상 CD-DA의 비트 레이트는 1,411.2kbit/s 로 표기를 하는 듯한데..(1024가 아니잖아?)
    [링크 : http://en.wikipedia.org/wiki/Bit_rate]

    아무튼. 1.4Mbps 정도의 CD롬 음질이기에 mp3로 320kbps가 엄청 좋아보인다고 하더라도
    실제로는 1/4 이상 압축된 상태란 것.
    그렇기에 mp3 에서 동일 sampling rate / sampling bit / channel 이라고 하더라도 다른 bitrate가 존재할 수 있다.
    [링크 : http://en.wikipedia.org/wiki/Sampling_(signal_processing)]
     

    뜬금포 결론 : MP3의 비트레이트가 오락가락  

    '모종의 음모 > mp3 분석' 카테고리의 다른 글

    mp3 joint stereo  (0) 2014.10.01
    mp3 id3 태그 내의 jpeg 추출  (0) 2014.10.01
    mp3 format  (0) 2014.10.01
    Posted by 구차니

    일어문장을 출력하는데 &가 출력되지 않아 분석을 해보니
    0xFF06 이라는 이상한 영역으로 문자열이 나오는 것을 발견..
    Fullwidth 라는 녀석인데.. 일종의.. 고정폭 폰트 처럼 사용가능한 영역일거 같긴한데..

    아무튼 폰트 갯수 제한으로 인해 따로 처리할 수 없기에
    일반적인 0x0021 영역으로 매핑해도 무방할 듯 하다.


    2014/06/09 - [모종의 음모/다국어 지원] - 일본어 유니코드

    Posted by 구차니
    일본어는
    히라가나 영역(0x3050~309F)
    카타카나 영역(0x30A0~30FF)
    그리고 한자 영역(0x4E00~9FFF CJK Ideograph) 을 사용한다.

    웬만한 건 다 IME에서 처리해서 유니코드 상에서는 조합을 해줄건 없기에
    반음("),반탁음(º)이라던가 요음(작은 글씨)은 1:1로 매칭된다.
    머.. 좋게 말하면.. 오토마타란게 필요없을 정도로 참.. 간단한 언어?
    [링크 : http://blog.naver.com/kisshaedo/140171257202]


    결론 : 별거 없다. 그냥 있는대로 그대로 출력하면 끝  
    Posted by 구차니