Updates from 6월, 2012 댓글 스레드 토글 전환 | 키보드 단축키

  • mortp June 26, 2012 12:15 am 퍼머링크 | 응답  

    아날로그/디지털 혼재회로 

    에 대한 자료들을 찾아둔 것을 공유합니다.

    저도 이것을 찾았을 당시 시간이 촉박해서 잘 읽어보지는 못했지만 도움이 될 듯 합니다.

    885

    디지털혼재회로의설계

     
  • mortp February 29, 2012 9:45 pm 퍼머링크 | 응답
    태그: , , makingclass, , , writingclass   

    SC에서 클래스 만들기 

    <SC의 클래스만들기 규칙>

    Platform.systemExtensionDir;   // Extensions available to all users on the machine, .rtf가 아니라, .sc로 저장해서 여기에 넣으면 됩니다.

    home/library/applicationsupport/supercollider/extensions 에 저장 후 cmd + k

    0. 한글 주석 사용 불가

    1. Getter vs Setter

    <는 클래스 외부에서 변수의 값을 불러올 수 있게. (Getter)

    >는 클래스 외부에서 변수의 값을 변경할 수 있게. (Setter)

    <> 두개 동시에 가능

    2. classvar vs var

    classvar 는 클래스 차원에서 접근이 가능하고, (Cc.classvar이름)

    var는 인스턴스 차원에서만 접근이 가능하다. (a = Cc.new; a.var이름)

    3. ‘메소드’ =  ‘함수’라고 생각해도 무방.

    둘 모두 그 이름을 불렀을 때 수행될 일들을 적어놓는 곳.

    클래스에 대해 적용될 함수는 정의되는 이름앞에 *을 붙이고, 인스턴스에 대해 적용될 함수는 *를 붙이지 않는다.

    4. ^(꺾쇠)표시는 다른 언어에서의 ‘return’과 같은 의미.

    뒤따라 나오는 구문의 결과값을, 함수를 부른(실행하라고 명령한) 곳으로 돌려준다.

    5. 인스턴스 메소드와 클래스 메소드를 구분짓는 것은, SC(혹은 그것의 모태인 smalltalk)만의 특징인 듯.

    SC의 클래스 구조에는 별도의 생성자(Constructor)개념이 없고, 기본적으로 상속받게 되는 최상위의 Object 클래스의 메소드를 빌려 필요한 메모리 공간 등을 할당받는 구조로 보임. Object 클래스의 내용을 이용하는 일종의 생성자 개념.

    Object.new;

    //새로운 인스턴스를 할당한다. 어떤 클래스든 실제로 인스턴스를 만들어 내기 위해서는 이것이 꼭 필요하다.

    새로 정의되는 어떠한 클래스라도 그것을 실제 사용할 수 있는 인스턴스로 만들기 위해서는 위와같은 명령이 반드시 필요. 관습적으로 쓰여지는 아래와 같은 .new라는 메소드의 내용은 최소한 위와 같은 동작을 수행하기 위해서이다.

    *new{

    //new라는 이름으로 생성의 역할을 정의하는 것은 다른 클래스들과의 통일성으로보면 당연하지만 다른 이름이어도 상관 없을 듯.

    ^ super.new; //Object.new 를 하는것과 마찬가지.

    }

    여기에 클래스만의 특별한 초기화 조건을 덫붙이기 위해서는,
    Object.new와 동시에 수행될 인스턴스 함수를 정의하여 실행한다.

    *new{

    ^ super.new.init(500, 0.5, 0.7); //Object.new + 그로인해 만들어진 인스턴스.init(아규먼트에 각각 500, 0.5, 0.7)

    }

    init{arg f = 200, a = 1.0, p = 1.0; //init는 그저 initialize 역할임을 표기하기 위한 이름. 다른 이름이어도 상관 없음.

    var freq, amp, pan;

    freq = f;

    amp = a;

    pan = p;

    }

    6. 실습코드

    
    Mtr{
    
    // classvar
    
    var <>routine, <>bpm, <>amp, <>tick, <>synth, <>synthNode, <>intv;
    
    *new{| argbpm, argamp, argtick = 4, argsynth = \default |
    
    ^super.new.play(argbpm, argamp, argtick, argsynth);
    
    }
    
    
    
    play{| argbpm, argamp, argtick, argsynth |
    
    bpm = argbpm;
    
    amp = argamp;
    
    tick = argtick;
    
    synth = argsynth;
    
    routine = fork{
    
    inf.do{| i |
    
    if(i % tick == 0,
    
    {
    
    intv = 60000 / bpm; //millisecond
    
    synthNode = Synth.new(synth, [\freq, 700, \amp, amp]);
    
    },
    
    {synthNode = Synth.new(synth, [\amp, amp]);});
    
    ((intv/1000)/2).wait;
    
    synthNode.free;
    
    ((intv/1000)/2).wait;
    
    }
    
    };
    
    }
    
    
    
    stop{
    
    routine.stop;
    
    synthNode.free;
    
    }
    
    }
    
     
    • mortp 2월 29, 2012 9:59 오후 퍼머링크 | 응답

      엔터를 쳐도 줄간격이 안늘어나요 이런;;;

    • joynimm 3월 1, 2012 1:01 오전 퍼머링크 | 응답

      this 가 뭐라그랬져? ^ 는 리턴…
      요즘 느끼는 바는 sc 같은 oop에서는 class 작성을 배워두면 많이 유용할 듯합니다.

      • mortp 3월 1, 2012 2:18 오후 퍼머링크 | 응답

        this는,
        클래스메소드를 정의할 때 쓰면 클래스를,
        인스턴스메소드를 정의할 때 쓰면 인스턴스를 참조한다고 하네요.
        음.. super와 대비되는 개념으로 생각하면 될 것 같아요.

  • mortp February 22, 2012 8:45 pm 퍼머링크 | 응답
    태그: Document, , , ,   

    내일의 시간 절약을 위해 공부 할 코드를 미리… 

    내일의 시간 절약을 위해,

    공부(?)할 코드를 미리 올려둘게요.

    우선은 startup.rtf 파일로 저장해 주세요.

    
    s = Server.internal;
    
    Server.default = s;
    
    s.boot;
    
    
    CocoaDocument.defaultFont_(Font("Arial Unicode MS",16)); //set default font
    
    
    s.doWhenBooted
    
    {
    
    var ranNum = 0;
    
    var postWindow = Document.listener;
    
    
    //set post window
    
    postWindow.font_(Font("Arial Unicode MS",16)); //set post window default font
    
    Document.postColor_(Color.white);
    
    postWindow.background_(Color.new255(10, 20, 100, 180));
    
    postWindow.bounds_(Rect.new(0, 270, 290, 768 - 270 ));
    
    
    //set own colorize theme
    
    Document.themes.put
    
    (\myTheme,
    
    (
    
    classColor: Color.new255(53, 74, 237),
    
    textColor: Color.new255(25, 175, 120),
    
    stringColor: Color.new255(96, 129, 158),
    
    commentColor: Color.new255(206, 27, 28),
    
    symbolColor: Color.new255(57, 154, 20),
    
    numberColor: Color.new255(157, 80, 65)
    
    )
    
    );
    
    
    //and then calling setTheme with the name:
    
    Document.setTheme('myTheme');
    
    
    //document setting(문서가 새로 만들어지거나, open 할 때의 설정)
    
    Document.initAction_({
    
    Document.current.background_(Color.new255(10, 20, 20, 230));
    
    Document.current.stringColor_(Document.themes.myTheme.textColor);
    
    Document.current.selectedBackground_(Color.new255(220, 180, 150, 60)); //selected block color
    
    Document.current.syntaxColorize;
    
    Document.current.endFrontAction_({ //문서가 뒤로 갈 때의 액션을 정해 둠
    
    Document.current.background_(Color.new255(80, 20, 30, 150));
    
    });
    
    Document.current.toFrontAction_({ //문서가 앞으로 나올 때의 액션을 정해 둠
    
    Document.current.background_(Color.new255(10, 20, 20, 230));
    
    });
    
    });
    
    
    " ".postln;
    
    " ".postln;
    
    " ".postln;
    
    " ".postln;
    
    " ".postln;
    
    " ".postln;
    
    
    //run s.meter
    
    //SCLevelIndicator.meter_Xpos = 290; //set X pos, 쓰시려면 좀 더 수정이 필요해서 일단 주석처 합니다
    
    //SCLevelIndicator.meter_Ypos = 0; //set Y pos, 쓰시려면 좀 더 수정이 필요해서 일단 주석처 합니다
    
    s.meter;
    
    
    //run FreqScope
    
    //SCFreqScopeWindow.scopeXpos = 650; //set Freq Scope's X pos, 쓰시려면 좀 더 수정이 필요해서 일단 주석처 합니다
    
    //SCFreqScopeWindow.scopeYpos = 3; //set Freq Scope's Y pos, 쓰시려면 좀 더 수정이 필요해서 일단 주석처 합니다
    
    FreqScope.new(300, 200);
    
    
    //run T-D Scope
    
    //SCStethoscope.stethXpos = 1023; //set T - D Scope's X pos, 쓰시려면 좀 더 수정이 필요해서 일단 주석처 합니다
    
    //SCStethoscope.stethYpos = 8; //set T - D Scope's Y pos, 쓰시려면 좀 더 수정이 필요해서 일단 주석처 합니다
    
    SCStethoscope.new(s, 2);
    
    
    " ".postln;
    
    " ".postln;
    
    
    
    //print welcome message
    
    ranNum = 3.rand;
    
    switch(ranNum,
    
    0, {"HOW ARE YOU, GANG IL ?".postln;},
    
    1, {"IS EVERYTHING ARIGHT ?".postln;},
    
    2, {"HOW'S THE THINGS GOING ?".postln;}
    
    );
    
    
    
    " ".postln;
    
    " ".postln;
    
    " ".postln;
    
    " ".postln;
    
    };
    
    
    
    //---------------- auto colorizing -------------------
    
    Document.globalKeyDownAction_({| doc, char, mod, unicode, keycode |
    
    if((doc.name.find("htm").isNil) and: (doc.name.find("html").isNil) and: (doc.isListener == false),
    
    {
    
    if((unicode==13) or: (unicode==32) or: (unicode==46), // Enter, Space bar, Period
    
    {
    
    doc.syntaxColorize;
    
    })
    
    });
    
    });
    
    

    아래는 간단히 용어에 대한 정리 입니다.

     

    <용어 정리>

     

    -Document

    : 슈퍼콜라이더에서 ‘문서’. 우리가 지금 보고있는 편집창.

    이것 역시 클래스로 이루어져 있고, 창을 연다는 것은 이 클래스의 인스턴스를 생성하는 셈.

    따라서 정의된 속성(Properties)을 변경하거나, 함수(Method, Function)를 이용하여 어떤 일을 시킬 수 있다.

    Document 를 선택하고 cmd + y를 눌러보자.

     

    -listener

    :Document의 메소드 중 하나. post창을 의미한다.

    클래스에 직접 적용하는 class method, 인스턴스에 적용해야 하는 instance method 는 모두 클래스의 헬프파일에 설명되고 있다.

     

    -bounds

    :GUI를 이용하는, 혹은 GUI와 관련된 클래스들은 보통 bounds라는 속성을 가지는데,

    이것은 GUI 창의 좌측 하단 모서리의 x축 상의 위치,  y축 상의 위치(화면의 아랫쪽이 좌표 0), 창의 넓이, 창의 높이 정보를 말한다.

    실제로는 대부분,

    Rect(xPos, yPos, width, height);

    이런 식으로, Rect 클래스의 인스턴스를 타입으로 요구한다.

     

    -theme

    :Document의

    classColor: Color.new255(53, 74, 237),

    textColor: Color.new255(25, 175, 120),

    stringColor: Color.new255(96, 129, 158),

    commentColor: Color.new255(206, 27, 28),

    symbolColor: Color.new255(57, 154, 20),

    numberColor: Color.new255(157, 80, 65)

     

    에 대한 속성을 짝지워 담고 있는 저장공간으로,

    슈퍼콜라이더에서 사용되는 여섯 종류의 글자들이 syntaxColorize 됐을 경우 바뀔 색을 미리 지정한다.

    Event 라는 클래스의 인스턴스이다.

     

    -initAction

    :새로운 Document를 만들거나 기존의 Document를 열었을 때에, 자동으로 실행될 행동들을 예약해 두겠다는 메소드.

     
  • mortp February 22, 2012 10:57 am 퍼머링크 | 응답  

    이번주 딱히 주제가 정해지지 않았다면, 

    슈콜 구이(Gui)환경 사용자화와 startup 파일에 대해 공부해 볼게요.

     

     

    예를들어 슈콜을 켜면 이런 식으로 짠 하고 셋팅이 되는.

    *startup 파일은 예전 도스의 “autoexec.bat” 파일과 비슷하고, 맥의 ‘start at login’과 비슷한건데요,

    슈콜을 켜자마자 할 일들을 적어주면 되는 곳입니다.

     
  • morogado January 5, 2012 7:57 pm 퍼머링크 | 응답  

    슈콜녹음2 

    
    // 2초짜리 버퍼만들기 
    
    b = Buffer.alloc(s, 44100 * 2.0, 1);   //객체  
    
    b.plot;
    b.bufnum;
    b.numFrames;
    b.close;
    b.free;
    
    // 녹음할 신스데프 
    (
    SynthDef(\recBuf,{ arg bufnum=0;
    	var in;
    	in = AudioIn.ar(1);
    	
       RecordBuf.ar(in, bufnum, doneAction:2, loop:0);
    }).play;
    )
    
    
    // 재생할 신스데프
    (
    SynthDef(\player1,{ arg out=0, bufnum=0, rate=1; 
    	var playbuf;
       playbuf = PlayBuf.ar(1,bufnum, BufRateScale.kr(bufnum) * rate, loop:0);
    	FreeSelfWhenDone.kr(playbuf);
       Out.ar(out, playbuf);
    }).play;
    )
    
    // 파일로 저장
    b.write("/Users/anibae/Desktop/bbb.wav", 'WAV', 'int24')
    
    // 신스데프 폴더  ~/Library/Application Support/Supercollider/synthdefs/
    // 신스데프 뒤에 붙는 메세지에 대해서
    // load : 파일로 만들고 서버에 보낸다.
    //  send : 파일로 만들지는 않고 보낸다.
    // play : 아예 신스를 만든다. 
    
    
     
  • morogado January 5, 2012 7:46 pm 퍼머링크 | 응답  

    슈콜녹음1 

    //하드에다 녹음하기 
    //맥의 경우 ~/Music/SuperCollider Recordings 에 자동저장됨.
    
    Server
    s.prepareForRecord("/Users/anibae/Desktop/recotest/abc.aiff");
    s.recSampleFormat = "int 16";
    s.recChannels = 1;
    //sc 지원하는 샘플포맷
    // "int8", "int16", "int24", "int32", "float", "double", "mulaw", "alaw"
    //sc 지원하는 파일포맷
    //"aiff", "next", "wav", "ircam"", "raw"
    
    
    //목소리 받기위한 신스데프 
    (
    SynthDef(\myvoice,{ arg out=0;
    	Out.ar(out,
    		AudioIn.ar(1)
    	)
    }).load(s);
    )
    
    v = Synth(\myvoice)
    v.free;
    
    // 녹음버튼을 이용하기 누르면 됨
    
    
    // 코드로 녹음하기 
    
    (
    Server.local.record;
    v = Synth(\myvoice)
    )
    
    (
    v.free;
    Server.local.stopRecording;
    )
    
    
     
  • mortp December 31, 2011 5:46 pm 퍼머링크 | 응답  

    기억적 자폭을 위한 게임의 티저 

    라 치고, 봐주시면 감사하죠.

     

    슈콜과 프로세싱, 위리모트를 이용했습니다.

    슈콜 부분 허세적이니까 허세반 갑니다-

     
  • punkt68 December 29, 2011 10:46 am 퍼머링크 | 응답  

    SC 구조 

    oop
    대략 SC 구조인데요.

    제가 스크립트기반의 프로그래밍은 SC가 처음이었었는데.

    이부분이 많이 힘들었습니다.

    물론 개념적으로 완전히 올바른도표를 만들기는 힘들어서 맞지 않는 부분도 있지만.

    약간 오해를 하더라도 이렇게 알고 있으면 삽질을 좀 줄일 수 있을것 같습니다.
    문서 해독능력도 생기고요.

    좀 더 명확히 알게 되면 주석도 더 달고 수정하려고 합니다. 일단 참고만 하시면 되겠습니다.

     
    • morogado 12월 30, 2011 1:20 오전 퍼머링크 | 응답

      네 구조설명 참 필요했는데 수고하셨습니다. 근데 제게는 좀 어려워 보이네요. 스크립트 기반이 프로그래밍이 sc3라는게 좀 이해가 안되는데 거기서 말하는 스크립트는 자바스크립트 이런 스크립트인가요? 아님 다른 의미의 스크립트라는 뜻이 또 있는지 oop 기반의 프로그래밍이 정확한 표현일듯 합니다.

      • morogado 12월 30, 2011 1:29 오전 퍼머링크 | 응답

        자바스크립트도 oop들어가고 자바도 oop인데 둘 다 다른거 같은데 약간 궁금해서요. sc3은 완전한 oop인지 자바스크립트같은 객제기반인지 자바처럼 객체지향인지… 어쩌면 객체기반이라서 좀 더 발전된 객체지향의 언어적 특성이 적은게 아닐까 싶은 혼자만의 생각이 들었습니다.

        • punkt68 12월 30, 2011 7:04 오전 퍼머링크

          객체지향 = OOP = Object Oriented Programming
          Oriented를 지향으로 번역한게 좀 미스같네요.
          객체유래?라는 말이 더 나은거 같은데.
          아니면 상속이란말을 주구장창쓰니까 객체상속이라고 하든가…
          아무튼 method상속, polymorphism 두가지 면에서 OOP라고 부르는데 문제 없어 보입니다.
          우리는 프로그래머가 아니니까. 객체기반까지 얘기하지는 말죠. 사실 방금 첨들어봤음.
          사실 다 알기 싫고… 음악은 언제쯤… 만드나… 하…. 털썩.. 삼천포로 빠졌다가 삼천포 아가씨랑 살림 차린격..

        • meetceros 12월 30, 2011 1:04 오후 퍼머링크

          스크립트 언어는 쉽게 그냥 한줄한줄 실행하는 언어라고 이해하시면 될 것 같아요. 한 번에 모두 컴파일 해서 실행하는 컴파일 언어와 달리요. SC에서 저희 한줄 코딩하면 결과가 바로 나오잖아요^^.

          객체기반과 객체 지향은 전혀(까지는 아니지만) 그냥 아무 상관없다고 보시면 되요. 객체지향은 말씀하신대로 클래스를 기반으로 상속, 오버라이딩, 오버로딩 등의 특징이 있을 때를 말하구요. (그래서 SC는 객체지향)
          자바스크립트가 객체기반 언어라는 것은 객체를 생성(객체를 생성한다는 건 메모리에 올린다, 라고 생각하시면 되요..음..)해서 사용할 수 있다는 것이고 객체지향과는 상관이 없습니다.

          객체기반언어 vs 객체지향언어 라고는 일반적으로 구분하지 않는것 같구요.. 객체지향이라면 당연히 객체기반이지 않을까 합니다..

          저도 햇갈리긴 하지만 조금 도움이 되셨으면.. 근데 저는 구조설명이 안보이네요;;;;

        • morogado 12월 30, 2011 1:25 오후 퍼머링크

          제가 객체기반 객체지향을 뭐 구분하자는 건 아니고요. 객체지향이라고 하는 sc3이 다른 객체지향과 다른 점이 많은것 같아요. 그 전에는 여러사람이 만들어서 그렇다라고 믿어왔지만 그런것만은 아닌거 같아요. 그래서 제 생각은 객체지향의 OOP구조를 가지고 있지만 뭐랄까 언어적 완전성이 떨어져서 배우기가 어려운거 같다는 이야기입니다.

          스크립트 언어스타일이기 때문에 java나 c++ 등의 완벽한 oop는 아니고 상속을 하기 때문에 자바스크립트 같은 객체기반이라고는 할수 없기때문에 구분질수는 없겠죠.

        • punkt68 12월 30, 2011 7:13 오후 퍼머링크

          @meetceros-제일 위에 oop라는 파란색 글자를 클릭하면 보입니다.
          SC가 객체지향이지만 배우기 어렵다는것은 동감입니다.
          하지만 소리가 원래 복잡한거라 완전무결한 객체지향의 세계에 담기 어려웠던게 아닐까 라고 이해되기도 합니다. 있는그대로에 순응 할 수 밖에 없는것 같습니다.

        • joynimm 1월 1, 2012 1:15 오전 퍼머링크

          저는 잘 모르지만 sc의 문법이 특별히 어려운지는 모르겠어요.
          어렵다고해도 그 원인이 sc가 oop적이지 않아서는 아닌 것 같아요.
          small talk과 ruby(sc의 구문)는
          c++이나 java 보다 근원적으로 oop적이라고 들었습니다.

          어떤분은 어린이에게 쉽게 프로그래밍을 가르키는 일을 연구하는데
          본인의 주 프로그램이 smalltalk이라고 하더라고요.배우기 쉬운 길이라는 의미겠지요.

          배인숙님이 sc 문법에 문제가 있어 보이는 예를 올리면 같이 생각해 볼 수 있을 것같아요.

        • morogado 1월 1, 2012 11:59 오전 퍼머링크

          제가 뭐 그런것까지 예를 들어 설명할수 있다면 참 좋겠지만요. sc3로 프로그래밍을 배울수 없다는 혼자만의 결론은 내리고 새해부터는 맘편하게 생각그만하고 새로운 느낌으로 sc3를 바라 볼려고요.

  • joynimm December 10, 2011 11:55 am 퍼머링크 | 응답
    태그: JITlib,   

    Just in Time (기초반 2) 

    
    신스를 만드는 방법 두가지
    1) function.play
    {SinOsc.ar !2}.play // 실행시키면
    //post창에 신스가 하나 생겼음을 나타난다.
    
    우리가 function.play로 신스를 만들라고 요청하면
    서버(신스 만드는 공장)는 만든다
    
    방금 만든 신스는 뭘까...
    스팸깡통처럼 생긴 신스가 있다고 해보자.
    한번 생기면 밖에서 조절할 수 있는 단추도 없는...
    하물며 끄는 단추도 없다...
    
    변수에 저장하면 끄거나 할 수 있다.
    x={SinOsc.ar!2}.play; 
    x.run(false)
    x.run(true)
    x.free
    x.run(true)
    
    x.release(2)//느리게 끄거나
    
    이 신스에 단추와 노브를 달아서 소리 높낮이, 크기를 조절하고 싶으면 매개변수(argument)를 
    넣어서 만들어 달라고 해야한다.
    x={|frequency=3, amp=0.2|	SinOsc.ar(frequency*100,0,amp)!2}.play
    
    x.set(\frequency,5, \amp, 1 )
    x.set(\frequency,3, \amp, 0.1 )
    
    x.release(2)
    
    요약) {SinOsc.ar}.play  라는 것은 &quot;소리를 내주세요&quot;가 아니라 신스를 만들라고 신스공장(서버)에 주문하는 것입니다.
    밖에서 조절하고 싶으면 argument를 넣어주어야 합니다.
    아규먼트는 set 메시지로 정해줍니다.
    
    2) Synth.new
    Synth.new(\default,[freq: 900])//new는 생략가능
    SynthDef라는 설계도가 신스공장에 있기 때문에 모델명(신스이름)만 불러주면 바로 만들어줍니다.
    
    많이 재사용되는 신스는 신스데프로 정의해 놓고 쓰면 편리합니다. 본질적으로 1번 방법(function.play)과 같습니다.
    
    ===========
    
    x={|nopi=440,kugi=0.05| LFSaw.ar(nopi,0,kugi)!2}.play;
    x.free;
    크기에 LFO를 걸어보자
    
    x={|nopi=440,kugi =0.1|                                  LFSaw.ar(nopi,0,SinOsc.ar(1,0,kugi))!2}.play;
    	
    x.set(\nopi,1000)
    x.set(\nopi,1100)
    x.set(\nopi,1200)
    x.set(\kugi,0.01)
    x.set(\kugi,0.2)
    이렇게 해서 만들어진 신스로는 크기에 걸린 lfo의 크기를 바꾸는 볼륨은 있어도 그 파형을 바꿀 수 없다.
    스팸캔 같이 생긴 박스에 볼륨 두개... 하나는 높이, 다른하나는 크기를 바꿀 수 있다.
    
    x={|nopi=440,kugi=0.1| 
    LFSaw.ar(nopi,0,kugi)!2}.play;
    실행하면 에러다. 아규먼트에 오실레이터를 사용할 수 없다.
    
    요점 : {SinOsc.ar}.play는 서버에게 하나의 신스를 만들어달라는 방법중에 하나이다.
    위의 신스는 아무런 단추없어서 밖에서는 조절할 수 없다.
    밖에서 조절하려면 arg를 달아야한다.
    arg를 달아서 외부에서 조종해도 박스내부의 배선은 바꿀 수 없다.
    
    굳이 하려면 이렇게 해야 하는데...
    1) Bus로 여러 신스를 연결하여 컨트롤
    Bus는 오디오신호나 컨트롤신호를 날라다 주는 것... 일단 전선으로 생각하시길...
    s.meter
    y = { Out.kr(10, SinOsc.ar(1)*400)}.play
    y = { Out.kr(11, LFNoise0.ar(4)*400)}.play
    y = { Out.kr(12, LFSaw.ar(1)*400)}.play
    y = { Out.kr(13, LFTri.ar(1)*400)}.play
    y.free
    x = {  | inputBus=10 |  LFSaw.ar(In.kr(inputBus))/10!2}.play
    
    x.set(\inputBus,10)
    x.set(\inputBus,11)
    x.set(\inputBus,12)
    x.set(\inputBus,13)
    
    2) 보다 빠르고 다이나믹하게 하려면 NodeProxy를 사용한다.(Just-in-time library)
     Proxy는 대리인이라는 실제 존재하지 않는 것을 사용하기위해 미리 자리 맡음하는 개념이다.
    
     제대로 공부하려면 꽤 양이 많지만 간단히 사용하여 코딩의 효율성을 높여보자.
     
     NodeProxy를 쉽게 사용하려면 ProxySpace로 들어가야한다.
     
     그전에 먼저 변수의 종류에 대해서 알아보자
     전역변수 : a, b, c, d,....
     로칼변수: var source...
     환경변수 : ~out (전역변수처럼 행동한다.)
    
     currentEnvironment.postln; // anEnvironment
    ~x; // access the enironment: there is nothing stored: nil
    ~x = 9; // store something
    ~x; 	// now 9 is stored
    ~x=~x + 100; // calculate with it
     currentEnvironment.postln; // anEnvironment
    
     p = ProxySpace.push(s)// proxyspace로 들어간다.
                   p.pop // 나올때는 pop
    ~out // ~를 붙이면 기존에는 환경변수가 되었으나 ProxySpace로 가면 NodeProxy로 인식된다.
    s.meter
    
    ~o.play
    ~o = {Pulse.ar([500,501])}
    
    ~o={LFSaw.ar(~f)*0.1}
    ~f={LFSaw.kr(1/5)*1199}
    p.fadeTime =1
    ~o.release
    
    ================ NodeProxy는 여러개의 오브젝트를 동시에 표현할 수도 있다.
    ~z.play
    ~z[0..3] = [ {SinOsc.ar(220) * 0.1 },
     { SinOsc.ar(220*2) * 0.08 }, 
     { SinOsc.ar(220*3) * 0.08 }, 
     { SinOsc.ar(220*4) * 0.04 }];
    
    ~z.stop
    ~z.play
    ~z.pause
    ~z.resume
    
    ~z[0]=nil
    ~z[1]=nil
    ~z[2]=nil
    ~z[3]=nil
    ~z=nil
    z.play
    ================시간 맞추기
    ~x.play
    ~y.play
    
    ~x={Pulse.ar(2)*SinOsc.ar(440)/10}
    ~y={Pulse.ar(3)*SinOsc.ar(880)/10}
    ==== 안맞아 시간이...
    ~x.stop;~y.stop
    ~x.clock = TempoClock.default; ~x.quant = 1.0;
    ~y.clock = TempoClock.default; ~y.quant = 1.0;
    위 실행후 다시하면 맞아...
    //p.clock = TempoClock.default; p.quant = 1.0; 이걸실행하면 전체 space에서 맞춰진다... 시간이...
    p.clear; // 모두지우기.
    
    //======= offset을 줄수도 잇다 [quant,offset]
    ~z.play; ~y.play;
    ~z = { Ringz.ar(Impulse.ar(2), exprand(300, 3400 ! 2), 0.08).dup * 0.2 };
    ~y.quant = [1, 0.3]; // offset of 0.3, quant of 1.0
    ~y = { Ringz.ar(Impulse.ar(1), 600, 0.05).dup };
    ~y.quant = [2, 1/3]; // offset of 1/3, quant of 2.0
    ~y = { Ringz.ar(Impulse.ar(0.5), 600, 0.05).dup };
    //==================================본인자체를 참조하기
    ~a.play// 
    ~a = { SinOsc.ar(~a.ar * 700 * 10+ [100, 102]*~c, 0, 0.1) };
    ~c=1
    ~c ={MouseX.kr(0.1, 10.10)}
    ~m={LFSaw.ar(0.1,mul:3.3).round(0.5)+(SinOsc.ar(0.003)*7)}
    ~a= { SinOsc.ar(~a.ar * 6000 * MouseX.kr(1, 2.10) + [100, 104], 0, 0.1) };//기존방법으로는 에러난다.
    p.pop
     
    
    
     
  • morogado December 1, 2011 6:21 pm 퍼머링크 | 응답  

    pbind 하논1번 

    숙제라도 올리겠습니다. ㅎㅎ

    (
    SynthDef(\bis1, {arg freq=440;
    	var osc1, osc2, env, signal;
       osc1 = SinOsc.ar(freq,0,0.5);
       osc2 = SinOsc.ar(10,0,0.5);
       env = EnvGen.kr(Env.perc(0.1),doneAction:2);
       signal = (osc1*osc2)*env;
       Out.ar(0,signal!2);
       }).play;         		
    )
    
    
    (
    Pseq([
     	Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([0, 2 , 3, 4, 5, 4, 3, 2], 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([0, 2 , 3, 4, 5, 4, 3, 2]+1, 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([0, 2 , 3, 4, 5, 4, 3, 2]+2, 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([0, 2 , 3, 4, 5, 4, 3, 2]+3, 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([0, 2 , 3, 4, 5, 4, 3, 2]+4, 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([0, 2 , 3, 4, 5, 4, 3, 2]+5, 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([0, 2 , 3, 4, 5, 4, 3, 2]+6, 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([6, 4, 3, 2, 1, 2, 3, 4]+12, 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([6, 4, 3, 2, 1, 2, 3, 4]+12-1, 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([6, 4, 3, 2, 1, 2, 3, 4]+12-2, 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([6, 4, 3, 2, 1, 2, 3, 4]+12-3, 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([6, 4, 3, 2, 1, 2, 3, 4]+12-4, 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([6, 4, 3, 2, 1, 2, 3, 4]+12-5, 1)),
         Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([6, 4, 3, 2, 1, 2, 3, 4]+12-6, 1))
    
    ], inf).play;
    )
    
    
     
    • joynimm 12월 1, 2011 7:13 오후 퍼머링크 | 응답

      참잘하셨습니다.

      Pbindf를 써보셔도 됩니다.

      +12를 쓰신이유는 옥타브를 쓰려 했던것 같은데
      \degree에서 옥타브는 +7입니다.
      \octave 키를 이용하셔도 됩니다.

      아래는 위의 코드롤 고쳐 넣은 예제입니다.

      (
      SynthDef(\bis1, {arg freq=440;
      	var osc1, osc2, env, signal;
         osc1 = SinOsc.ar(freq,0,0.5);
         osc2 = SinOsc.ar(10,0,0.5);
         env = EnvGen.kr(Env.perc(0.1),doneAction:2);
         signal = (osc1*osc2)*env;
         Out.ar(0,signal!2);
         }).play;         		
      )
       a=	Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([1,3,4,5,6,5,4,3]-1, 1));
       b=  Pbind(\instrument, \bis1,  \dur, 0.2, \degree, Pseq([5,3,2,1,0,1,2,3]-1, 1), \octave, 7);
      
      a.play
      b.play
      
      (Pseq([
       Pbindf(a, \mtranspose, 0)
      ,Pbindf(a, \mtranspose, 1)
      ,Pbindf(a, \mtranspose, 2)
      ,Pbindf(a, \mtranspose, 3)
      ,Pbindf(a, \mtranspose, 4)
      ,Pbindf(a, \mtranspose, 5)
      ,Pbindf(a, \mtranspose, 6)
      ,Pbindf(b, \mtranspose, 0)
      ,Pbindf(b, \mtranspose, -1)
      ,Pbindf(b, \mtranspose, -2)
      ,Pbindf(b, \mtranspose, -3)
      ,Pbindf(b, \mtranspose, -4)
      ,Pbindf(b, \mtranspose, -5)
      ,Pbindf(b, \mtranspose, -6)
      ],inf).play
      )
      
c
새 글 작성
j
다음 글/다음 댓글
k
이전 글/이전 댓글
r
응답
e
편집
o
댓글 표시/숨기기
t
상위로 가기
l
로그인하기
h
도움말 표시/숨기기
shift + esc
취소