2007.3.28.
@Alchemusica ̃foCXǗɂāB
@Iɂ͂鐮lŃfoCX肷̂悢BA[U[͂̐l͌A܂łfoCXł̊ǗƂȂB̖肪݂B
(1) CoreMIDI  UniqueID Ƃ̐lƂ̑Ή͂ǂ邩B
(2) CoreMIDI ̃foCX Alchemusica Ƃ͊ւ薳ύX邱ƂB̃Abvf[gǂ邩B
(3) tɁACoreMIDI œOfoCXňقȂ UniqueID Ƃ蓾B̑Ήǂ邩B
(4) CoreMIDI ̗^mȂfoCX MIDI t@CŎw肳邱Ƃ蓾B̂Ƃ͂ǂ邩B
(5) Alchemusica Ń[U[Cӂ̃foCXw肷邱ƂłB̂Ƃ͂ǂ邩B

2007.4.1.
@OtBbNEBhẼI[gXN[ɂāB
@GraphicClientView, GraphicRulerView AׂĂ GraphicClientView ̉ƁAΉ Client/Ruler ̑g̏c͑ĂȂĂ͂ȂȂBǂ邩H
(1) ̕ύX́A̎ɋNB
 (a) ҏWɂăV[PX̒ςB
 (b) XN[o[삳ꂽB
 (c) ǂꂩ Client Ń}EXhbOɂ鉡XN[NB
 (d) tɃ^CCWP[^̈ʒuʂ͂ݏoB
 (e) EBhȆ傫ύXꂽB
 (f) Shrink/expand {^ꂽB
 (g) ǂꂩ Client Ń}EXhbOɂg^kNB
(2) c̕ύX́A̎ɋNB
 (a) ҏWɂĒl̏ςiʂ͋NȂjB
 (b) cXN[o[삳ꂽB
 (c) Client ܂ Ruler Ń}EXhbOɂcXN[NB
 (d) EBhȆ傫ύXꂽB
 (e) cShrink/expand {^ꂽijB
 (f) Client ܂ Ruler Ń}EXhbOɂg^kNB

2007.5.10.
@OtBbNEBhEł̕ҏWɂāB͂߂ĕsSB
(1) ҂[h
@CL[Ȃ
@@^C`[gFI[hƓB
@@sAm[FBNbNȂ猈܂̉AhbOȂ炻̒̉BAłɂ鉹̏ŃhbOJnƂ́AJnʒuɂĉ̒EEʒu̕ύXɂȂB̉łɑIĂƂ́AIĂ鉹ׂĂɑ΂ēsBȊOőIĂCxg͕ωȂB
@@Xgbv`[gFNbNȂPCxg̑}AhbOȂTu[hj[ɏ]ăCxg}܂͒l̕ύXBAłɑ݂Xgbv̏izbgX|bgA܂͉_jŃhbOJnƂ́ÃCxg̈ʒuElύXB̃CxgIĂƂ́AIĂ铯̃CxgׂĂɑ΂ēsBΏۈȊȎICxg͕ωȂB
@VtgL[
@@^C`[gFCL[ȂƓB
@@sAm[FCL[ȂƓȂ݂IȂBƂ͏IɒǉAhbÔƂ݂͂̉̑IɒǉĈꏏɃhbȎΏۂɂȂBȊOőIĂCxg͕ωȂB
@@Xgbv`[gFNbN͉ȂBhbOȂIꂽCxĝݒl̕ύXBTu[hj[ set Ȃ牽ȂB
@R}hL[
@@ׂāFhbOŔ͈͊gBNbNiVtg{R}h{NbNHjŒÕY[Ԃɖ߂B
(2) I[h
@CL[Ȃ
@@^C`[gF̈ʒu܂͔͈͂uҏẂ͈vɂB݂̑I͉B
@@sAm[AXgbv`[gFlpň͂܂ꂽ͈͂ɓĂCxgIBIꂽCxgׂĊ܂ޔ͈͂uҏẂ͈vɂȂBAłɑ݂Cxg̏ŃNbN^hbOƂ͂҂[hƓsB
@VtgL[
@@^C`[gFihbOj݂̑IAVIꂽ͈͂܂߂ĐVȕҏW͈͂ƂB
@@sAm[AXgbv`[gF݂̑Iɑ΂āAlpň͂܂ꂽ͈͂̃CxgtđIi]Hǂ炪HjҏW͈͂́AVɑIꂽCxgׂĂ܂ޔ͈͂ɂȂB
@R}hL[
@@ׂāF҂[hƓB
(3) ACr[[h
@I[hƊ{Iɂ͓AԎ̂݃}EXʒuFA͑SIƂȂB

@ȂAҏW͈͂ύXꂽƂ́AtJnʒüʒuɕύXBij
@IύXꂽƂ́AȎIoĂĖ߂悤ɂBij

2007.5.11. sAm[̓ACr[[hĈꉞSijB
2007.5.12. ACr[[hBҏWƂ͑S͂BҏW͈͂̕ύX֌WB

@IύX̃CxgXgEBhE^OtBbNEBhE̘Ag܂ĂȂBǂׂH@SelectionChanged  EditingRangeChanged  notification ܂݌vĂȂ炵B
(1) MyDocument  setSelection ́AI editing range Zbg/ύXׂłB
(2) MyDocument  setEditingRange ́AsetSelection ŃZbgꂽ editing range Ɋ֌WȂʂ editing range ZbĝɎgB
(3) OtBbNEBhE͕`掞 selection QƂ邽߁Aĕ`悷ΎIɐ selection `悳BACxgXgEBhE͖I selection ZbgȂ΂ȂȂBiMyTableView  reloadData I[o[Cĥ͗\낤H 10.3 ȍ~Ŏg selectRowIndexes:byExtendingSelection: g΂łȂ̂ł́BłAIύX邲Ƃ selection Zbg܂悳Bj
(4) IύX undo ƃJbvĎǂB
  (a) MyDocument  NSMutableArray *selectionStack; int selectionStackPointer; NSMutableDictionary *selectionQueue; ̂R̃oǉB
  (b) selectionQueue ɂ́Ã݂Cxg[v̒őIύXꂽgbNɂāAgbNԍL[AȎIlƂĊi[BAgbNŉxIύXꂽꍇ́Aŏ̕ύXL^B
  (c) ɁANotificationQueue  selectionWillChange  Notification i[Asender Ƃ coalesce B
  (d) Cxg[vIAselectionWillChange  Notification iPjMBMyDocument ͎ł Notification ܂āAselectionQueue  selectionStack ɐς selectionStackPointer i߂B̌AselectionDidChange  Notification 𔭐MBCxgXgEBhE͂ Notification ܂ selection Abvf[gB̑̃EBhE\Abvf[gB
  (e) editing range ́Aselection ̕ύXɂÖقɕύXƂƁAIɕύXƂƂB selectionWillChange ̃nhiMyDocument ɂjŏ邱ƂłBȂ킿AselectionQueue ̒ editing range ̃Gg邱ƂɂAI editing range ύXꂽƂ͂̎_ŌÂ editing range  selectionQueue ɓBAselection ύXƂ editing range  selectionQueue ɂ͓ȂBselectionWillChange ̃nhł́Aediting range Gg̗LɂďU蕪邱ƂłBȂ킿Aediting range GgȂΑI editing range vZăZbgAÂ editing range  selectionQueue ɓBediting range Ggłɂ΍ČvZ͕KvȂB
  (f) CxgҏWsꂽƂ́Aselection  undo X^bN̓NAB̂Ƃ́AselectionQueue ɓȃL[i@"invalid" ȂǁjŃGg邱ƂŃtO𗧂ĂĂAselectionWillChange ̃nhŃX^bNNȀsBAҏWɂƂȂĐV selection ZbgĂ\̂ŁAediting range ̍ČvZ͍sKv邩mȂBediting range IɕύXĂ炸Aǂꂩ̃gbN selection cĂ΍ČvZAȊO͕ύXȂAƂł悳BiACxg}ɂ͂̃CxgI邩ÃCxg߂͈͂ editing range ƂĐݒ肷悤ɂׂłBjƋCςB̂Ƃ editing range ͍ČvZȂƂɂB

2007.5.16. BAҏW͈͂ undo ƁAtJnʒu̕ύX͖BtJnʒu͖ɕύXȂH@^C`[gr[ option+NbNƂAȂǂłǂH
@ƕςȋ邱ƂBႦ΁AuIXeBi[gv̍ŏ̐^C`[gőIAVtgNbNđI͈͂ύXƁA10.0.0 ܂ŕҏW͈͂LтĂ܂BR_N^[gbNƊ֌WĂ炵AڍוsB
@gbNɂ܂IƂACxgXgEBhEőIύXȂ̃gbN̑Iׂ͉낤HiOtBbNEBhEłŁAtH[JXgbNȊÕgbN̑Iׂ͉ۂHjOtBbNEBhEł́A\ĂgbN̓tH[JX̗LɊւ炸I邪A\ĂȂgbN͉ȂB͍BVI邽߂ɌÂIƂ́ASgbNɂđIׂ낤B 2007.5.17. B


2007.5.17.
@Rs[Ey[Xgɂčl@By[Xg{[h́AJX^f[^ێieLXgłGLX|[gł֗A͂ƂōljBNSPasteboard ɏ߂̂ NSData, plist, NSString Ȃ̂ŁAI͈͂VACY NSData ɏoĂ NSPasteboard ɏށB
@VACY SMF gƎvĂAƕGɉ߂邫炢Bf[^̂܂܃VACYȒPH@iSMF ̕RpNgł͂邪BjƂɂAMDSequenceSerialize.c  MDSequenceSerializeWithSelection(), MDSequenceUnserialize() ֐쐬邱ƁB
@MDSequence ̏FgbNAegbÑRs[ɂgbNԍB
@MDTrack ̏FgbNAstart tick, last tickB
@MDEvent ̏FMDEvent f[^̂́AMessage Ƃ͂̓eB
  'MDSQ' (Int32), size (Int64), numTracks (Int32), originalTrackNumbers (Int32 * numTracks);
  'MDTR' (Int32), size (Int64), trackName (Int64), startTick (Int32), lastTick (Int32), numEvents (Int32), events (MDEvent * numEvents), data (arbitrary length);  gbNJԂ
  'size' ́A'MDxx', 'size' tB[h܂߂ȂubNTCYB̃GfBA̓lCeBuGfBAƂ邪A'MDxx' ͂̂܂܂̏Bchar[4] ƂĎ΂悩낤B
  data ւ̃|C^́AMDTR ubN̐擪o (trackName) ̃AhXƂ̍Ƃĕ\B

@ς SMF x[Xɂ悢BRpNgƁAR[hpł郁bg͑傫BAL[̃m[gdȂĂ鎞Ƀm[gI^It̑ΉӓIɌ܂ȂȂ̂ƂȂƂȂB
EoFQڂ̃m[g̒OɁAȃ^Cxg (duration) B
Eǂ݂ގFm[gItƑΉĂȂm[gI "kMDEventInternalNoteOn" ɂB܂ł̎ł́Am[gItʃgbNɂ܂Ƃ߂Ă MDTrackMatchNoteOff() ĂяoĂASMF ǂ݂Ȃm[gIto邽тɃgbNɃXLăm[gIT悤ɂBʃgbNvȂȂ̂Ń͂낤Bx債ĕςȂ̂ł́HiقƂǂ̏ꍇAm[gI̓m[gIt̂߂ɂjʏ̃m[gI duration = 0  InternalNoteOn Ƃ邪AO duration ^Cxgm[gI͂ duration ێĂBm[gITAduration != 0  InternalNoteOn ɂĂ duration `FbNB
 2007.5.22. ꉞBA܂ MDTrackMatchNoteOffInTrack()i֐ςj͎cĂB܂Am[gItgbNiKvȂ̂ɁjAP[gĂ̂ŁÂ͐KvB2007.5.23. B

@y[Xg{[h̃f[^̓eȒPɔcłd|KvB^CxgŉނƂl̂Ay[Xg{[h̃f[^^CvƂ MySequencePBoardType, MyCatalogPBoardType ̂Qނ錾ĂAMySequencePBoardType ɃV[PXf[^̂́AMyCatalogPBoardType Ƀf[^e̊TvĂ΂悳Bf[^e̊Tv́AgbNiR_N^[gbN܂ށjAegbÑIWigbNԍiR_N^[OjARs[Ƃ̕ҏẂ͈iV[PX̒ł͂ȂBm[gIt͕ҏW͈͂̏I_ɂ\ȀꍇҏW͈͂̏I_̓V[PX̒ZBjegbÑCxgAMIDICxgAIWĩgbNi32x܂ŁjB UTF8 ƂĕsK؂ȏꏊŐ؂Ă܂ȂƂǂ邩HNSString  rangeOfComposedCharacterSequenceAtIndex: \bhg΂悢B܂AƂ肠񂵂łB

@y[Xg̎Ay[Xg{[h̃f[^̂ǂ̃gbNy[Xĝǂ̃gbNɑ}邩B킩₷@͂邾낤H

(1) y[Xg悪CxgXgEBhȄꍇB
@y[Xg{[h̃f[^̓R_N^[gbNȊO̒PgbNłȂ΂ȂȂBłȂꍇ́AxoāAǂ̃gbÑf[^y[Xg邩IiIjB
@y[Xg悪R_N^[gbN̏ꍇ́Ay[Xg{[hɃR_N^[gbN܂܂ĂȂ΂ȂȂBȊÕgbN͒PɖB

(2) y[Xg悪OtBbNEBhȄꍇB
@tH[JXgbN̐y[Xg{[h̃gbNȏłȂ΂ȂȂBAR_N^[gbN͏ɃR_N^[gbNɃy[XgBiOtBbNEBhEɊ܂܂Ă邩ǂɂ͊ւȂjB
@ugbNIăy[XgvIԂƁAǂ̃gbNɂǂ̃gbNy[Xg邩IԂƂłB

2007.5.24.
@AOtBbNEBhECEBhEɂ񂶂ȂH@̃gbNXggΌ݂̃gbNXgEBhE̋@\܂߂邱ƂłB̕I肷By[Xg̐݌v₱̂AOtBbNEBhEɁu܂܂vgbNςł_ɂȂĂB

@傫ȕύXɂȂ肻Ȃ̂ŁA_ł̃XibvVbgɃ^O tag_20070524 ĂB

2007.5.25.
@ColorCell ̃TuNXŖ蔭BCX^Xϐ colorValue ǉăobNOEh̐Fێ悤ɂƂAZNbN BAD ACCESS ŗ悤ɂȂĂ܂BNSZombieEnabled ϐgăfobKŒǂƂAcolorValue d[XĂ邱Ƃ킩B́AZNbNɓ NSCell Rs[邽߂ŁA̎ɃCX^XϐPȂ|C^ƂăRs[Aretain JEgPȂԂɂȂĂ߂BColorCell  copyWithZone I[o[Ch colorValue  retain 邱ƂŉBhttp://developer.apple.com/documentation/Cocoa/Conceptual/ControlCell/Tasks/SubclassingNSCell.html ɊmɏĂBhLg͋X܂œǂ܂Ƃ̂ȂB

2007.5.31.
@OtBbNEBhẼgbNXg̐݌vB
(1) ܂ł̃gbNEBhE̋@\𐷂荞ށBSgbÑXg\BEditable, hide, record, mute, solo ͂̃ZNbNăgO邩A܂̓gbNIăwb_ZNbNĕύXBHide ̃gbN͕ȂǂׂăO[\ɂȂB
(2) Editable  hide ͂ł悢Amute, solo ͏o̓foCX^`lwƗ׍Ă悢Bimute  solo ͗KvH@ł悢̂ł́Hj
(3) Record ́A^^ĐEBhEŎw肷B
(4) gbNXg̏̃Xy[Xɘ^EĐ{^zuĂBꂾƑS̃EBhEɂ܂Ƃ܂̂ł肷B
(5) ^{^ƁAV[g~ėă_CAO[hɂȂAƂ̂͂ǂH@ꂾƎRɘ^̕ҏW֎~ł邵A^̕GȐݒip`CJEgCAv[XI[o[_uA̓foCX͂ǂꂩA^͂ǂꂩAȂǁjP̃_CAOɏWł̂͂킩₷C^[tFCXȂ̂ł͂ȂB
(6) P̃hLg̘^EĐ͑̃hLg̘^EĐ͋֎~悢B܂ł̓vCEBhEPȂ玩RɂȂAhLgƂɍĐ{^ƓdĐȂ悤ɔzȂƂȂBihLg𓯎ɍĐł炻͂ŖʔƂ邪AőɎgȂ@\̂߂Ɏdl𕡎Ĝ͂܂D܂Ȃ낤Bj

2007.6.10.
@^{^͂܂ĂȂAȊO͂łBEditable ̓gbNF̃Zɂ҂ACRŕ\Avisible, mute ͂ꂼڂ̃ACRAXs[J[ACRŕ\Bsolo @\͂ȂB
@hLg̓Đ͍̂Ƃ\Bɋ֎~KvȂ悤ȋCĂB
@OtBbNEBhECEBhEɂȂBtEBhEAgbNXgEBhE͂͂svBANɃj[o[̏ԂɂȂĂ܂̂ŁAI[v_CAOoAVKhLgJȂƂȂB͖Bi^{^悾Bj

2007.7.8.
@^{^BꉞI[o[_u^v[XBWait-for-note ̓_CAOőI͂ł邪܂@\ȂBJEgItBStop tick ͎A^~Đp邱ƂłȂBł悤ɂȂB

@XgEBhE̓삪낢남B
(1) CxgPIă^[L[ƕҏWJnł邪A̎ɉ}Cxg tick IꂽCxg̎̃Cxg tick ɂȂB͍B
(2) end-of-track ̍sIłȂB̂߁AgbN}jAŕҏWłȂB܂ACxgP܂܂ȂVKgbNɃCxg}łȂB͒vIB
(3) EJ[\L[ׂ͗̃ZɈړ̂ł͂ȂAZ̒̃eLXgҏWɒʏʂgpłׂ낤B
(4) ^[L[ƎIɐVKCxg}̂͂ƕsցB
(5) ㉺J[\L[gƏ㉺̍sɈړł̂͂̂AҏW[h甲Ă܂̂ŕsցB
(6) j[܂̓R}hL[V[gJbgŐVKCxg̑}łׂB

(1): VKCxǵAIꂽCxg̒ɁÃCxgƓtickœB
(2): end-of-track s̑IBA폜͂łAҏW tick l̕ύX݂̂Bend-of-track sIĂ鎞ɐVKCxg}ƁAend-of-track ̒Oɑ}Aend-of-track  tick lɏ]ĕύXiʏ +1, m[gCxg}ꂽꍇ͂ duration vXjB
(3): EJ[\L[͒ʏ̃eLXgҏWʂɎgB
(4): ^[L[͉̃Zւ̈ړAVtg{^[͏̃Zւ̈ړBR}h{^[ŐVKCxg̑}BG^[L[ŕҏW[h甲B
(5): ㉺J[\L[́AeLXg̐擪^ւ̈ړB
(6): R}h{I ŁA݂̕ҏWtickɐVKCxg}B
(7): Cxg tick ύXʃCxg̏ꏊړƂÃCxg̒Ɂu`CxgveBbNŕłƂ͂̃CxgꏏɈړB܂Atick m̑Ɠɏ㉺̃ZֈړꍇAړÖʒȕ㉺Ɉړ̂ƂB

@R}h{^[܂łȂAȊO͈ꉞBA^[ŉ̃ZAVtg{^[ŏ̃Zւ̈ړƂdl͔ȁB

2007.7.12.
@OtBbNEBhEŁAmyPlayingView, myMainView, myTableView ̂ꂩɃtH[JXO悤ɂBtH[JXOĂƂ͂ view  firstResponderBcopy/cut/paste j[R}h tableView  mainView Ƃł͈Ⴄ\Ȃ̂ŁAΉt₷B

2007.7.13.
@悢Rs[^y[Xg̎B
yRs[z
(0) ׂẴEBhEŁA݂̕ҏW͈͂y[Xg{[hɋL^B
(1) XgEBhEł́ÃgbN̑ICxgRs[B
(2) OtBbNEBhẼgbNXgł́AIꂽgbN̑SCxgRs[B
(3) OtBbNEBhẼOtr[ł́AׂẴgbN̑IꂽCxgRs[B
iȂgbN܂ށj
yy[Xgz
(0) ׂẴEBhEŁAy[Xg{[h̕ҏW͈͂̐擪u݂̕ҏẂ͈v̐擪ɂȂ悤ɃCxgړBʂ̃y[Xg̏ꍇ́Ay[Xg{[h̕ҏW͈͂Ɋ܂܂Cxg폜B}[W̏ꍇ͍폜ȂBR_N^[gbNp̃Cxgie|AqASMPTEA}[J[j͎IɃR_N^[gbNɈړB܂AR_N^[gbNMIDICxg}悤ƂƌxoAy[Xg͍sȂB
(1) XgEBhEł́Ay[Xg{[h̓ePgbNłꍇɌy[XgłBy[Xg{[h̓egbN̏ꍇ͌x_CAOoAy[Xg͍sȂB
(2) gbNXgł́AgbNIĂꍇ͑IgbNƃy[Xg{[h̃gbN擪Ήăy[XgsBy[Xg{[h̃gbN]ꍇ͐VgbN쐬āAɃy[XgBy[Xg{[h̃gbNȂꍇ͓Ɍx͂ȂB(3) OtBbNr[ł́AҏW\ȃgbNƃy[Xg{[h̃gbN擪Ήăy[XgsBȊO̎dl (2) ƓB

MySequencePBoardType: NSMutableData ɃRs[Cxg SMF ƂďoB
MySeqCatalogPBoardType: ȉ̃f[^oCiŏށB
  wb_Fwb_ (4 bytes, wb_g͊܂߂Ȃ), gbN (4 bytes), ҏW͈ (4 bytes, 4 bytes)
  egbNFf[^ (4 bytes, f[^g͊܂߂Ȃ), IWigbNԍ (4 bytes), IWigbN (64 bytes), Cxg (4 bytes), MIDICxg (4 bytes)
@gbNԂ񂾂JԂB
MDCatalog, MDCatalogTrack : ̃f[^\ɑΉ typedefBMDSequence.h Œ`B

2007.7.15.
@ꉞłB0.5d1 ƂČJB

2007.7.15.
@OtBbNEBhEŁAVtg{NbNihbOjȂǂ̓ɂāBI[ĥƂAVtg{hbO͊{Iɂ́ȗ݂IɐVI͈͂vƂ̂AMac OS X ̓ƂĂ͂̓R}h{NbNihbOj̓ɋ߂AVtg{hbOiNbNj́ȗ݂IƐVȃ}EXʒuŒ`͈͓ɂׂ̂đIvƂ̕D܂̂ł͂ȂB́AgbŃuقƂǑS̃CxgvI悤ƎvāA^C`[gr[ōŏ̕NbNAŌ̕ɃXN[ăVtg{NbN̂AIȂB
@悤ƎvƁAȗ݂IƐVȃ}EXʒuŒ`͈́vǂ`邩ƂȂBAI͈͂`Ɍ肵Ă܂΁AقǓ͂ȂBŏ̃}EX_EŃVtgL[Ă΁Au̎_ł̑Í͈v\`vZA̋`ƌ݂̃}EXJ[\̈ʒuIׂ͈͂̋`vZāA̓I͈͂Ƃ΂悢B͕s\ł͂ȂȁB
@A͂藝ɂdlɂȂ肻̂ŁAVtg{hbO̎dl͌̂܂܂ƂA^C`[gr[ŃR}h{hbOƂr̃CxgꋓɑI悤ɂB̕pIł킩₷dlƎvB
@ۂɎgĂ݂ƂǂĂuVtg{NbNvāuAr͑IȂ́H@AR}h{NbNBvƋCÂĂ蒼ƂɂȂĂ܂B͂ςPȁBƁA`IƂAc̑I͈͂ rulerView ɕ\mȂB

2007.7.16.
@OtBbNEBhEł̓̓NI^CYB

2007.7.16.
@sAm[r[ł̃Rs[́uҏWgbN̑ICxgvɌ肷邱ƂɂBŁAɁuRs[ꂽgbNvuҏWgbN̐vƂȂBgbN̑I͂킩ɂɂȂ肪Ȃ̂ŁAǂ̃gbNCxgRs[邩IɂȂ̂͗ǂB

2007.7.16.
@e[ur[ł̑IύX̓삪݂̂CɂȂĂBreloadClientViews KvȏɌĂяoĂ悤BreloadClientViews ͔ɏdȂ̂ŁAMainView h[钼OɈxĂяo悤ɂׂBɉeoȕύXȂ̂ŐTdɁB 2008.1.1. ꉞCB啔 reloadClientViews  setNeedsReloadClientViews ɕύXAsetNeedsReloadClientViews ł NSNotificationQueue  notification  NSPostWhenIdle [hŃ|Xg悤ɂBŁAAChԂɂȂɈx reloadClientViews sB

2008.1.6.
@IɃI[fBI^Ă݂BCoreAudio ԕ׋ȂƂȁB
/Developer/Examples/CoreAudio/Services/AudioFileTools/AudioFileTools.xcodeproj ܂ǂł݂B
@^ CAAudioFileRecorder.cpp ɂĂB

  CAAudioFileRecorder::CAAudioFileRecorder() ł͎̏ĂB
EFindNextComponent() ŁAtype = kAudioUnitType_Output, subType = kAudioUnitSubType_HALOutput, manufacture = kAudioUnitManufacturer_Apple ł Component B
EOpenAComponent() ł Component J mInputUnit Ɋi[BmInputUnit  AudioUnit ^̕ϐ (AudioUnit * ł͂Ȃ̂Œ)B
EAudioUnitSetProperty()  output  disable, input  enable ɂB
EftHg̓foCX擾āAmInputDevice  kAudioOutputUnitProperty_CurrentDevice ƂăZbgBi悭킩ȂHjmInputDevice  AudioDeviceID ^B
ER[obN֐ZbgBłCAAudioFileRecorder::InputProc()B
En[hEFAtH[}bg擾BCAStreamBasicDescription ^A AudioStreamBasicDescription ̃bp[NXB

CAAudioFileRecorder::SetFile()
EfBNg (parentFSRef), t@C (filename), t@C^Cv (AudioFileTypeID filetype), tH[}bg (CAStreamBasicDescription), CAEg (CAAudioChannelLayout) w肵ČĂяoBCAAudioFileWriter::SetFile() ł̃p[^ݒ肷邪AIO tH[}bg͂Pt[̃`lƃTv[gȊO "canonical" ȐݒɕύXB(CAStreamBasicDescription::SetCanonical()) ̓Iɂ́Anon-interleave, linear PCM, 32 bit float ȂǁB
....

@ƕGč܁BRecordAudioToFile ̕ȒPȂ̂ŁA炩U߂悤B

@^ main.cpp  StartRecording() Ŏn܂B

EDCAudioFileRecorder ^̐VCX^XADCAudioFileRecorder::Configure() ŏݒAStart() Ř^JnAStop() ŏIB

EDCAudioFileRecorder::Configure(const FSRef inParentDirectory, const CFStringRef inFileName, AudioStreamBasicDescription *inASBD)
@ConfigureAU()  AudioUnit ̏AConfigureOutputFile()  AudioFile ̏B

EConfigureAU()

- AudioOutputUnit 擾BFindNextComponent, OpenComponent gAtype = output, subtype = HALOutput, manufacturer = Apple  Autio Unit 擾B
- AudioOutputUnitinput LAoutput 𖳌ɂB
- AudioHardwareGetProperty ŃftHg̓foCX擾B
- AU ɃftHg̓foCXݒB
- R[obN֐ݒB
- n[hEFAfoCXtH[}bg擾
- tH[}bgCiGfBAˑȂ̂ŒӁIj
- AU ̏o̓tH[}bgw
- AU  I/O obt@̃Tv擾
- AU 
- ̃I[fBIobt@AP[g (AudioBufferList ^)

EConfigureOutputFile()
  ExtAudioFile... Ƃ֐gāAt@C̍쐬EtH[}bgwEmono->stereoϊE񓯊݂̏sĂB

EAudioInputProc()
@AudioUnit ̃R[obN֐BAudioUnitRender() ŃI[fBIf[^擾āAExtAudioFileWriteAsync() ŏłBOŃXbhǗȂĂ̂ŊyI

@ CAPlayThrough ́B͓͂Əo͂̃foCXꂼ|bvAbvXgŕ\邪AAudioHardwareGetPropertyInfo/AudioHardwareGetPropertygĂBĂ݂ƁA Jack Router ƏoĂB

@Alchemusica ł̘^@\̎āB
(0) j[ "Record Audio..." B{̓I[fBIgbNɎnŃI[fBICxgׂ悤ɂׂAƂ肠ƂƂŁB
(1) t@C Alchemusica project ƂĕۑĂȂ΁Aۑ悤ɎwďIBvWFNgfBNg "Audio" fBNg aiff `ŕۑBt@ĆAu^JneBbN-ʂԍ.aiffvB
(2) _CAOoāAI[fBI͂ƃX[o͐w肳B̂ƂA|bvAbvj[ CAPlayThrough ̃R[hQlɂB
(3) "Start Recording" {^ꂽAAudioUnit, AudioFile āAMIDItJnA^JnB

MDAudio_MacOSX.c ɘ^֌W̃R[hB(2008.1.6.)

@vWFNgfBNgɃt@CۑƁAvWFNgۑɏ㏑ďĂ܂ƂɋCB^_CAOǂāAt@Cw肷悤ɂB(2008.2.13.)

2008.2.20.
@XgEBhE̎gSnC}C`BȂƂB_́F
(1) Cӂ̃eBbNʒuɃCxg}łȂBOtBbNEBhEȂǂŎw肵u݂̕ҏWʒuvɑ}ł悤ɂׂB
(2) eBbNҏWƃCxg̍sʒuςĂ܂̂iނ𓾂ȂƂ͌jgɂB
(3) ςŏɑ}̂́uvCxgł񂶂ȂH@̂ÃCxg𕡐 "Duplicate" R}hA"Insert multiple events..." R}hi̓_CAOōׂw肪ł悤ɂjpӂΕ֗ȂB
(4) MidiPolish `́uCxg炷v@\ƎĂ邪AIꂽCxgw肳ꂽeBbNԊuŒuĩCxg͓ȂjƂR}hĂ悳B

2008.2.27.
@VKCxg̑}B
(1) CxgIĂ鎞́ÃCxgƓeBbNl̐VCxgIĂs̒ɑ}ÃCxgҏW郂[hɓBAIĂ̂ end-of-track ̎́ÃeBbNl̃Cxg end-of-track ̒Oɑ}AҏW[hɓB
(2) CxgIĂȂ́Au݂̕ҏWʒuv̊JneBbNɐVKCxg쐬ÃCxgҏW郂[hɓieBbNʒuɃCxg݂鎞́Ǎɑ}jB݂̕ҏWʒuw肳ĂȂ́AgbN̐擪ɃeBbNOŐVKCxg}B́uҏWʒu1.1.0vƎw肵Ƃ͓삪قȂBeBbNOɃCxg݂ĂƂAҏWʒuwȂ炻̑OɐVKCxg}AҏWʒu1.1.0Ǝw肷ƊCxǧɐVKCxg}B

2008.2.28.
@Cxg̑I\邽߂ɏBʏ̕\ɂĂ͂łɑI\lĂ邪AҏWB
(1) VKɃCxgƂÁ݂uOɑ}CxgṽRs[邪Aꂪ\̃Cxg̏ꍇ͋CxgB
(2) ŁAҏWJñCxg͏ɌĂ邪Akind/code ύXƔ\̃Cxgɕς\B̎͌x_CAOoA[U[u\łnjvƗꍇ́ÃCxgm肵Ĕ\ɂAs̓JʒũZŕҏŴ悤ɍƂ𑱍sB
(3) łɁAeBbNύXĕҏW̃Cxg̍sʒuωƂ̓ƒ`Bɕʂ̃ZɈړ鎞́ACxgŕҏW𑱂Bɂړ鎞́Asʒuω㓯Z̕ҏWԂɈxƂǂ܂āÃANVŕʂ̃ZɈڂ̂悢̂ł́H@xԂɂȂ邩ȁBAɂړ鎞́AuCxg̈ʒuωȂꍇɈړĂł낤ZvɈړAƂí݂jdlł悢݂B

2008.3.1.
@Cxg̑Iǂ邩ACxgҏWEBhEƓ悤ȃEBhEāAŃCxg^CvׂƂlŐi߂ĂBȂƁACxg^Cv̕ҏW̓CxgEBhEƋʂ̃R[hg悢̂ŁAEventKindTextFieldCell ƂNX ListWindowController R[h𕪗ĂBƖʓ|Ȃ̂́F
(1) nib  NSTableView  dataCell Ƃ EventKindTextFieldCell NXw肵ƂAǂ̃^C~Ołǂ̃CjVCUĂ΂̂悭킩ȂBEventKindTextFieldCell NXŁAƗ nib ReLXgj[ǂݍ݂̂Aǂɏ炢̂킩ȂBdȂ̂ŁAmenu \bh㏑A܂ nib ǂݍłȂ΂œǂނƂɂB܂ȂdȂB
(2) dataCell  menu ݒ肵ł NSTableView ReLXgj[ȂBNSTableView  menuForEvent: I[o[ChȂƂȂB
(3) j[R}h̃ANV EventKindTextFieldCell NXŎł邪Al setStringValue: ȂǂŐݒ肵Ă NSTableView ɓ`ȂBcell  controlView \bhgĎ NSTableView ̒ɂ邩ǂׁAȂ dataSource  setObjectValue n\bhĂԕKvB̂ƂAsEJʒȕ cell ͎ĂȂ̂ŁANSCell  menuForEvent:inRect:ofView \bhI[o[Chă}EX{^ꂽʒuoĂȂƂȂB
(4) ReLXgj[oۂɁA̍sIKvB NSTableView  menuForEvent: ŎΗǂ悤ijB

2008.3.4.
@Cxg̑IA͂p̃_CAO𐮔g₷Ȃ̂ŁABEventFilterPanel ŁACocoa binding gĂB݁A^CxgƃRg[Cxg̓e[ur[ɑS̃GgāAKvȂ̂`FbN悤ɂȂĂ邪A͂ȂgɂB"+", "-" ŕKvȂׂ̂Ԃg₷낤B

2008.3.8.
@ꉞ 0.5d3 ƂČJBꎞAI[fBI^iK 0.6 ɏグ悤ƎvĂ̂AȑOɏ[h}bvƁuhLgvƂ낵ƂĂāAƂĂ 0.6 Ƃďô͖Ȃ̂ŁA0.5d3 ƂB
@hLgA낢ׂҏW@\[B́A낻}N@\ȂƎvĂ肵āc

@}N@\Aǂ̌ɂ邩ȂBSONAR  Cal  lisp x[X̂悤Łî cakewalk ̃}N̓X^bNx[XȁjA܂̂ł͂Ȃ̂AIuWFNgwƑgݍ킹悤ƂƁAƋLq@ႲႵĂBƃJbR܂葽̂͂߂ǂBPython ƂĂ͂̂ACfgɈˑĂ̂߂ǂBRuby ͑gݍ݂ʓ|Bς莩OōȂƂ傤Ȃ̂Ȃc

@MacRuby (http://trac.macosforge.org/projects/ruby/wiki/MacRuby) ĖʔBIuWFNg̎ Objective-C ɔCāAC^v^ Ruby 1.9 ɏĂB̃Av[`ȂAقǓȂVꂪł񂶂ȂH

@ɂȂ̂́A^CŃ\bhTƁAђ`邱ƁB-> Objective C ̃^C֐͂JĂ邩AȂƂȂ񂶂ȂB

2008.3.20.
@낢뒲ׂĂ݂ƂARuby ̑gݍ݂͕s\ł͂Ȃ݂Bu܂gݍ݂ɂ͌ĂȂvƂŏĂ͂邪A@͂BĂ݂悤H

@ł̃C[WBƂ΁Aexpression  volume ɍւȂAȕɏ΂悢낤B

selectedTracks.each { |n|
  ptr = pointerForTrack(n)
  while (ptr.nextInSelection)
    if ptr.kind == :control && ptr.code == 11
      ptr.code = 7
    end
  end
}

VALUE rb_eval_string_wrap(const char *str, int *state) Ƃ֐găXNvgs΁AW[ŎŝŃl[Xy[XȂB܂͂񂾂ǁA̗Ⴞ ptr Ƃ͂̂܂܎cĂ܂̂ȁH@Iネ[JϐNAƊ̂BׂƂ낾Ƃ肠͂B
ł{́Aũ݂hLgv self ƂāAselectedTracks Ȃǂ "self.selectedTracks" Ɖ߂ׂ̂B񂱂ȕɂΉ͂邪F
def newmacro
  selectedTacks.each { |n|
  ...
  }
end
OȂƂȂ̂ɖʓ|B

instance_eval g΂񂾁Bũ݂hLgv doc ƂƁF
doc.instance_eval("
  selectedTracks.each { |n|
  ...
  }
")
 doc = self ̃ReLXgŎsłB

@j[R}hɌvOCIȃXNvgƁAĝĂɂ}Nʈɂ邩B
vOCXNvǵAÖق "class MRDocument ... end" ̒ŎsB}ŃAÖق "def MRDocument.XXXX ... end" ̒ł񃁃\bhƂĒ`A"document.XXXX" ŎsBIA\bh XXXX ͂ɍ폜BAÕ}NێĂĂʂɍ\ȂAg͂ȂƎvB

@Ⴄ̂ƍȁBׂă\bh`̌`ɂāAuj[R}hvƃ\bh֌WÂ悤ɂǂH

@ivOChLgƂ̃}NjF
def hoge
  ...
end
register_menu("menu command name", :hoge)

@vOC "class MRDocument ... end" ̒ŎsBAhLgt̃}N "doc.instance_eval" ̒ŎsB҂ł́Adef ͓ك\bh̒`Ƃē͂B
@āAO҂ "MRDocument.instance_eval" ŎsĂʂɂȂH

  Ȃ݂ɁAregister_menu ́AMRDocument ̃NX\bhƒʏ̃\bh̗ƂĒ`ĂBNX\bh́̕uׂẴhLgɑ΂ēK\ȃR}ho^vAʏ탁\bh́̕ũhLĝ݂ɑ΂ēK\ȃR}ho^vƂႢB

@j[IꂽAMRDocument ̃CX^Xɑ΂Ẵj[R}hɑΉ郁\bh₢킹A΂̃\bhĂяoB

@MRDocument ̃CX^X MyDocument ɕێKvȁiك\bh̓CX^Xɕێ邽߁jB͂ƌ炵BMRDocument ̃NXϐƂāuShLg܂ޔzvP`Ăǂ낤BMRDocument <-> MyDocument ̑ݕῗȂɂイ͋NȂ͂炱łIɂ͏\BɁAMyDocument ̃RXgN^ MRDocument IuWFNgAdealloc ŉ悤ɂ΂̂ł́BȂ MyDocument ̓ MRDocument ւ̃|C^LbVĂĂɖɂ͂ȂȂB
@MRDocument  MyDocument  retain ĂƁAMRDocument jȂ MyDocument ͌ release ȂƂɂȂB͂Ɩ肾ȁBRuby IuWFNg͉ivɐcĂ܂\邩ARuby IuWFNg Cocoa IuWFNg retain ̂͂ȂׂȂƂȂB
@MRDocument  MyDocument ƂPFPőΉA MyDocument ɑ΂Ă͏ɓ MRDocument gB̂߁AMyDocument ̃RXgN^ŐV MRDocument IuWFNg쐬āAϐ $mr_documents wzɊi[BMyDocument  dealloc ł́ÃIuWFNgw|C^ NULL ɍւāA$mr_documents 珜B


C Ŏׂ\bhꗗB
NX MRDocument
  document(name)        łɊJĂ name ƂÕhLg擾Bname ̓t@CłĂ\ȂB
  name                  hLg̖O擾B
  new                   VhLgB
  open(fname)           t@C fname hLgƂĊJB
  save                  hLgۑB
  save_as(fname, flag)  hLgʖŕۑBflag  true ȂA㏑mF_CAOoȂB
  revert(flag)          hLgŌɕۑꂽԂɖ߂Bflag  true ȂAmF_CAOoȂB
  track(n)              n Ԗڂ̃gbNin = 0 ̓R_N^[gbNj𓾂B
  insert_track(track, n) gbN track  n Ԗڂ̃gbNƂđ}B
  delete_track(n)       n Ԗڂ̃gbN폜B
  tick_to_time(tick)    tick ΎԁibPʂ FloatjɕϊB
  time_to_tick(time)    ΎԂ tick ɕϊB
  tick_to_measure(tick) tick  bar/beat/subtick ɕϊBbar/beat  1 Asubtick  0 n܂BR̐̔zԂB
  measure_to_tick(ary)  bar/beat/subtick  tick ɕϊBary  bar, beat, subtick ̔zB
  duration              V[PX̒ tick PʂŕԂB

NX MRTrack
@MRTrack  MDTrack ւ̃|C^ێ邪A MyDocument ւ̃|C^ێBMyDocument ł́AregisterDocumentTrackInfo/unregisterDocumentTrackInfo NX\bhɂAMyDocument/MDTrack/trackNumber ̑ΉtǗĂB̃\bhp MyDocumentTrackInfo \̂ւ̃|C^o^ĂƁAMyDocument ̃\bhŃgbN̑}^폜sAMyDocument/MDTrack/trackNumber ̑Ήt͕KȂ悤ɕۏ؂ĂB
@MyDocument  nil łȂɂ́AMyDocument ̕ύX𔺂 MRTrack ̑͌Iɂ MyDocument ʂčsB
@MRTrack  MDTrack  retain AGC ŉꂽ release B

  initialize(doc, n)    MRDocument doc ̃gbN n ɑΉ MRTrack IuWFNgԂBdoc == nil i܂ doc ȗjȂ΁AVKgbN쐬B
  pointer               ̃gbNw MRPointer IuWFNgԂB
  count                 gbNɊ܂܂Cxg̑ԂB
  count_midi            gbNɊ܂܂ MIDI Cxg̐B
  count_sysex           gbNɊ܂܂ sysex Cxg̐B
  count_meta            gbNɊ܂܂郁^Cxg̐B
  duration              gbÑf[V tick PʂŕԂB
  duration=             gbÑf[VύXB̃Cxg̍őeBbNl傫Ȓlw肵Ȃ΃G[ɂȂB
  channel               gbN MIDI o̓`lB
  channel=              gbN MIDI o̓`lύX (1-16 ̐l)
  device                gbN̏o̓foCXB
  device=               gbN̏o̓foCXύXB݂ȂfoCXw肵Ă\ȂB
  name                  gbNB
  name=                 gbNύXB

NX MRPointer
@MRPointer  MDPointer ւ̃|C^ێ邪A MyDocument, MDTrack ւ̃|C^ێBiMDPointer  MDTrack ւ̃|C^Ă̂ŁAdɎƂɂȂjBMDPointer  retain 邪AMyDocument, MDTrack  retain AQƂ̂݁B
@MyDocument  nil łȂɂ́AMyDocument ̕ύX𔺂 MRPointer ւ̑͌Iɂ MyDocument ʂčsB

  initialize(doc, n)    MRDocument doc ̃gbN n ̃Cxgw|C^Bdoc  nil An Ȃ΁Aǂ̃hLgɂȂ_~[gbNVɍ쐬āAɑ΂|C^B
  initialize_copy(ptr)  MRPointer ptr ƓgbNEꏊwV|C^B
  position              |C^̎wʒuB-1 ́u擪OvwB
  position=             |C^ړB̉Eӂ̒lԂ (Ruby ̎dl)
  move_to               |C^ړBCxg݂ȂꏊɈړ false, ȊO true ԂB
  move_by               |C^݂̈ʒȗΒlňړBCxg݂ȂꏊɈړ false, ȊO true ԂB
  count                 wĂgbN܂ރCxgB
  top                   |C^u擪OvɈړBposition=(-1) ƓB
  bottom                |C^u̎vɈړBpotision=(count) ƓB
  next                  ̈ʒuɈړBgbŃu̎vɒBUAȊO͐^ԂB
  last                  ÖʒuɈړBgbŃu擪̑OvɒBUAȊO͐^ԂB
  next_in_selection     I͈͂LłȂAIĂ鎟̈ʒuɈړBΉCxgȂΌ݂̈ʒuɂƂǂ܂AUԂBȊO͐^ԂB
  last_in_selection     I͈͂LłȂAIĂÖʒuɈړBΉCxgȂΌ݂̈ʒuɂƂǂ܂AUԂBȊO͐^ԂB
  jump_to_tick(tick)    tick 菬ȂeBbNlŏ̃Cxg̈ʒuɈړB̂悤ȃCxg݂Ȃ΁u̎vɈړAUԂ
  kind                  Cxg̎ށBȉ̃V{ŕ\B:null, :meta, :tempo, :time_signature, :key, :smpte, :port, :text, :message, :program, :note, :control, :pitch_bend, :channel_pressure, :key_pressure, :sysex, :sysex_cont
  code                  Cxg̃R[h
  data                  Cxg̃f[^B:text ͕A:sysex, :sysex_cont, :smpte, :time_signature ͐l̔zBptr->data[n] = m Ƃǂ͗vB
  duration              m[gCxg̃f[VB
  on_velocity           m[gIFVeBB
  off_velocity          m[gItFVeBB
  
2008.4.6.
@LR}ḧꕔāAꉞ̂悤ȃXNvg삷悤ɂ͂ȂB

#  Raise all notes of track 1 by one half-tone
  pt = pointer(1)
  while pt.next
    puts "position = #{pt.position}, kind = #{pt.kind}, code = #{pt.code}"
	if pt.kind == :note
	  pt.code += 1
	end
  end

@AhD삷悤ɂ̂Apt.code = X łP̃CxgύX邽т MyDocument ɕύXbZ[W𑗂Ă̂ł́AAhDobt@炢ƂɂȂĂ܂BXNvgقǂ̏Ȃ̂A̃CxgCɕύX悤Ƃ\B߂āA̕ύX͂܂Ƃ߂ modifyCodes:ofMultipleEventsAt:inTrack:mode: Ȃǂŏׂ낤BȂR[fBO͖ʓ|AMRPointer ɕύX̃LbVێAԂ̓LbVɂ߂āA^C~O MyDocument ɃbZ[W𑗂悤ɂĂ݂BꉞRpC͒ʂē͂Ă悤ALbVOĂ邩ǂ͖mFB code  data ɂĂ͊mFB(2008.4.7.)

  tick ̕ύXɂẮAmodifyTick:ofMultipleEventsAt:inTrack:mode:destinationPositions: ͕ύX tick ɂȂĂ邱Ƃv̂łƖB MDTrackChangeTick() CĂ̐蕥B Cxg̏ςƂ undo ܂ȂBdestinationPositions  MDPointSetObject ŗ^Ă邩炢Ȃ̂ŁA position ̔złȂƂȂBvCB\ςB
(1) ^[Qbg̃CxgʃgbNɒo tick ύXB
(2) destinationPosition == nil ̎́F
(2-1) new2old[] Ƃ int ̔zpӂA0..count-1 ̐icount ̓^[QbgCxg̐jB tick ̏ɂȂ悤\[gB
(2-2) old2new[] ƂzpӂAold2new[new2old[i]] = i ƂȂ悤ɂB
(2-3) i = 0..count-1 ɑ΂āA^[Qbg new2old[i] Ԗڂ̈ʒu߂Bꂪ undo  destinationPositions ɂȂB
(2-3) i = 0..count-1 ɑ΂āAnew2old[i] Ԗڂ̌Â tick l߂Bꂪ undo  tick ̔zɂȂB
(2-4) new2old[] 𗘗păCxg̔z\[gB
(2-5) ʃgbNƂ̃gbNɃ}[WB}[Wʒu MDPointSet  undo ̃^[QbgCxgw肷B
(3) destinationPosition != nil ̎́F
(3-1) new2old[] Ƃ int ̔zpӂA0..count-1 ̐B destinationPosition ̏ɂȂ悤Ƀ\[gB
(3-2) (2-2) ƓB
(3-3) (2-3) ƓB
(3-4) (2-4) ƓB
(3-5) ʃgbNƂ̃gbNɃ}[WB}[ẄʒuƂāAdestinationPosition ̓_ׂĊ܂ MDPointSet w肷B MDPointSet  undo ̃^[QbgCxgw肷B
cɕGAʂ̂łȂƂR[fBOł̂ł́B
 2007.4.10. Ă݂B܂ӒneXg͂ĂȂACxgStɂXNvg삵Aundo 悤Ȃ̂ŁAĂȊB

@łɃCxgXgEBhEŕsB(2008.04.12.)
(1) VKgbNɃy[XgƂAҏWʒuw肵Ȃ΃Rs[̂Ɠ tick l̂ƂɃy[XgׂȂ̂ɁAŏ̃y[Xgł 1.1.0 Ƀy[XgĂ܂Bx undo Ăxy[XgƐy[XgB MyDocument  init  startEditingRange, endEditingRange  kMDNegativeTick ŏ邱ƂŏCB
(2) gbN̂ƂÃgbNJƌȂBB
(3) gbN폜炻̃EBhE͎IɕׂBB
(4) i̓CxgXgEBhEɌȂjNbv{[hy[Xgi}[Wj́AV}ꂽCxgIĂׂ낤BB
(5) ICxg폜 undo Ŗ߂ꍇA폜_ŖIA߂ƂIɂȂB߂CxgIׂǂH@ʂ͑IȂ݂Ȃ̂ŁAł悢C邪Ay[XgCxgIĂ邱ƂlƁAundo Ŗ߂CxgIĂƕ֗ȂBdeleteMultipleEventsAt:fromTrack:  	[[[self undoManager] prepareWithInvocationTarget: self] insertMultipleEvents: trackObj at: pointSet toTrack: trackNo selectInsertedEvents: NO]; ̍Ō NO  YES ɕςΑI悤ɂȂBǂˁH

2008.4.13.
@Ruby XNvgAlΘbIɓ_CAOJ悤ɂ邱ƁB
  
  d = MRDialog.new
  n = d.item(type, hash)
    #  type: "textfield", "radio", "checkbox", "popup"
    #  format: for textfield - "i0:50", "f0.0:1.0", "s20", etc.
    #          for radio, popup - an array of strings
    #          for checkbox - none
    #  If a block is given, it will be executed whenever an action is invoked
  d.enable(n)     #  enable
  d.disable(n)
  d.set_value(n, value)
  d.value(n)
  d.set_attr(n, key, value[, key2, value2, ...])
  d.attr(n, key)
  d.run  #  Returns true if and only if "OK" is pressed

@_CAO MRDialog ^̃IuWFNgŁAeACe̓CX^Xϐ _items ɔzvfƂĊi[i@Ŏn܂ĂȂ Ruby XNvg̃ANZX͕sjBeACe\f[^̑́A:type, :title, :format, :block, :x, :y, :width, :height Ȃǂ̃L[ŃANZXłB̓ǂݏo attr, Zbg set_attr \bhgB

  d.layout(M, N, i11, ..., i1N, i21, ..., i2N, ..., iM1, ..., iMN [, options])
   NSView Ai11,...,iMN ŕ\ACe NSView ̃Tur[ƂAe[uCAEgBNSView ̃TCYׂ͂ẴACe܂悤ɐݒ肳B_CAÕTCÝANSView  OK, Cancel {^܂悤ɕύXiA͍ŏ̒l菬͂ȂȂjBNSView \ԂB

@Ȃ̂ǂ낤B
  hash = MRDialog.run {
    #  V MRDialog Aȉ̃ACe`āAŌɃ_CAOsA
    #  I MRDialog jāAOK {^ꂽȂҏW\ACe̒l
    #  ܂ރnbVԂACancel Ȃ nil ԂB
    layout(n, m, item(...), ..., item(...))
  }
  
XgEBhE֌W̃oOQ_F
@ҏWʒu 1.2.0 ɐݒ肵ăXgEBhEŐVKCxg}ƁA擪Cxg 1.1.0 ɈړĂ܂ƂB͌sB̌𒼂Ă邤ɁA̂܂ɂČȂȂB
@VKCxg}AeBbN_uNbNĕҏW[hɂāA^uŉẼJɈړĂAEJ̕ҏW[hɂȂ炸ÃCxgIĂ TableView tH[JXĂȂԂɂȂĂ܂BꉞBXNvgΉ̂ modify track notification 啝ɂ̂A̕p炵Bnotification ܂Ƃ߂ idle time ɑ悤ɂ̂ÃׂJňҏW𑱂鎞́AҏW[hɓO notification 𑗂ĂȂƂ܂ȂB̎̕s͍邩ȂB

@SMF ǂݍ񂾂ƂAgbNO non-meta CxgĂĂ̂܂ܒʂĂ܂B͕ʃgbNɕׂB

2009.8.27.
@vԂɎĂ݂BMolby ̃\[X Ruby ֘ÃR[h𗬗pāARuby R\[悤ɂȂB
@C^vg̎ŔYł̂A1.8.7 ÓIN邱ƂɂĂ݂BꂾƁA10.4 ł rb_add_event_hook gBAgCugȂȂ邪AQ͂Ȃ낤Brb_add_event_hook ŃR[obN֐o^ATOɂPC^vg`FbNB{ setitimer ݂ȋ@\gX}[gAMIDI I[fBIƊƖʓ|B
@̎ƁA"while 1; end" Ƃ[v͎~߂ȂB Ruby ̎dlȂ̂ŎdȂAȂ񂩂݂ƂȂȁB

2009.8.29.
@Ruby1.8.7 ărhĂ݂B܂Awhile/until ŃCxgtbNĂ΂悤ɏCB

--- eval_org.c  2009-03-23 18:28:31.000000000 +0900
+++ eval.c      2009-08-29 21:00:48.000000000 +0900
@@ -3145,6 +3145,9 @@
                goto while_out;
            do {
              while_redo:
+                   EXEC_EVENT_HOOK(RUBY_EVENT_LINE, node, self,
+                                   ruby_frame->last_func,
+                                   ruby_frame->last_class); /* 20090829 TN */
                rb_eval(self, node->nd_body);
              while_next:
                ;
@@ -3180,6 +3183,9 @@
                goto until_out;
            do {
              until_redo:
+                   EXEC_EVENT_HOOK(RUBY_EVENT_LINE, node, self,
+                                   ruby_frame->last_func,
+                                   ruby_frame->last_class); /* 20090829 TN */
                rb_eval(self, node->nd_body);
              until_next:
                ;

@ŁÃR}h universal binary ƂărhB

CFLAGS='-isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.4 -arch i386 -arch ppc -O2' ./configure --disable-shared --disable-thread

@̂܂܂ƁAalloca d`̌x̑ΏۂɂȂĖʓ|Ȃ̂ŁAconfig.h ̈ȉ̍s폜B
#define alloca alloca

@Xcode ŁACN[hACũfBNgƂ Ruby rhfBNgANIvV -lruby-static ΁A߂ł Ruby X^eBbNN邱ƂłB

2009.8.31.
@j[𐮗BXNvgj[̃R}h validate ł悤ɂB"validate_R}h" Ƃ\bh`Ă΁AĂяoāA߂l true Ȃ烁j[ validate B`ĂȂ΂܂łƓliR}h MRDocument ̒ʏ탁\bh̏ꍇ̓hLgJĂ valid, NX\bh̏ꍇ͏ validjBA`FbN͂ĂȂB
yTODOz
MRDocument  each_editable_track, each_selected_track ǉBi2009.9.1. j
Ruby NX MRPointSet Bi2009.9.7. j
MRPointer  kind, code, tick, data1, data2, noteon_vel, noteoff_vel, duration, tempo, data3, message, smpte ̓ǂݏ\ɂB݂ data łׂĂ̑Ă邪AĂ̕H  duration, velocity, release_velocity 悤Bi2009.9.11.j
MRTrack ̃\bhƂāAshift_tick(delta, pointset), modify_tick(array, pointset), selection, selection=, merge(track[, pointset]), unmerge(pointset), extract(pointset), add(event, ...) Badd ̈ event ͔zŁA[0, 60, 480, 64, 0] (tick, note, duration, on-vel, off-vel), [240, :control, 11, 120] ȂǁB
i2009.9.12. shift_tick, modify_tick, selection, selection= B10.31. shift_tick, modify_tick ͂߂Bj
insert_at(events, pointset) ȂĂ̂ĂA܂gȂBmerge(MRTrack.new(event, ...), pointset) ł̂ŁAɎȂĂB
 shift selection  Ruby ŎB
dvȃR}h Ruby ŎāAEvents j[Œ`B
Merge R}hADelete Selected Tracks, Open Selected Tracks as Event List 𐳂 validateB
deltacount ̎dlύXBCxgςȂ悤ɂB
GraphicWindowControllers  sortedTrackNumbers, visibleTrackCount 폜B
Time Manager ֌W̃R[ƂB "deprecated" ̌xo悤ɂȂĂ܂B

2009.9.14.
@MRPointer ̃LbVO͉Ɩ肪肻ȊBpt.code = X ȂǂɂĂ͒ MyDocument ύX邱ƂɂāAɁuCxg܂Ƃ߂ĕҏWv\bh MRTrack ŎǂB
  modify_tick(pointset, delta)
  modify_tick(pointset, enum)
  modify_tick(pointset) block |pt, i|
  modify_code(pointset, code)
  modify_code(pointset) block |pt, i|
  modify_data(pointset, data)
  modify_data(pointset) block |pt, i|
  modify_velocity(pointset, vel)
  modify_velocity(pointset) block |pt, i|
  modify_release_velocity(pointset, rvel)
  modify_release_velocity(pointset) block |pt, i|
  ꂼApointset  nil ȂΌ݂ selection gB
i2009.9.14. MRPointer ̃LbVOȂBF̒ln yield  rb_yield_values(n, arg1, arg2, ...) ƏB9.15. modify_tick, modify_code B
  2009.10.31. jύXBQƁBj

2009.9.17.
@C}C`gɂBMRPointSet  MRTrack Ɗ֌WÂBMREventSet ƂāAmodify_{tick|code|data}  MREventSet ̃\bhƂĎB
  eventset.modify_tick(delta)
  eventset.modify_tick(array)
  eventset.modify_tick { |pt, i| ... }
  modify_code, modify_data, modify_velocity, modify_release_velocity, modify_duration lB
@eventset.each { |pt| ... }     #  pointset ƎdlႤA炩ɂ̕g₷Bcollect ƂgBAA pt g񂳂_͒ӂKvB
  eventset.reverse_each { |pt| ... }  #  Enumerable  reverse_each ͎gȂi pt g񂳂邽߁j
  eventset.select { |pt| ... }   #  eventset ̒ŃubN^Ԃ̂琬iVjWԂ
  eventset.reject! { |pt| ... }  #  eventset ̒ubN^Ԃ̂菜
  track.eventset                  #  ̃Cxg̏W
  track.eventset(nil)             #  ̃CxgW
  track.eventset(pointset)        #  ʒũCxg̏W (eventset ̐egbN track łȂĂ܂Ȃj
  track.eventset { |pt| ... }  #  ubN^ԂCxg̏W
  track.selection   #  eventset Ԃ
  track.selection=  #  Eӂ͒PȂ pointset ł悢
 (2009.10.31. ̃\bhBj

2009.9.22.
@C^vg`FbNvpɂɌĂ΂Ă邱Ƃ킩̂ŁAsetitimer/sigaction gĖTO~bƂɂPĂԂ悤ɂBŃXNvg̎s͂ȂyȂBMIDI/I[fBIƂ̊͖mFB

2009.9.23.
@߂Ⴍʓ|ȕsBrb_newobj ܂ɎsABAD ACCESS ŗĂ܂BׂĂ݂ƁAǂ GC Ɂut@CiCUv`IuWFNg͒ډꂸA Ruby ReLXgXCb`̃^C~Oŉ悤ŁAGC ŁuvƎvĂIuWFNgׂ͂Ă̎̃IuWFNgꍇARZ͎cĂ炸 BAD ACCESS ɂȂĂ܂AƂXg[[炵B͂Ȃ荢A gc_sweep  add_heap() ĂԂƂ̏ freelist == 0 Ƃ̂ꂽBꉞĂ݂B

--- ruby-1.8.7-p160/gc.c	2009-03-27 19:25:23.000000000 +0900
+++ ruby-1.8.7-p160-tn/gc.c	2009-09-23 21:16:13.000000000 +0900
@@ -1215,7 +1215,7 @@
 	if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT;
     }
     malloc_increase = 0;
-    if (freed < free_min) {
+    if (freed < free_min || freelist == 0) {
 	add_heap();
     }
     during_gc = 0;

2009.10.31.
@MRDocument -> MRSequence ɉA܂[U[猩NX "MR" 菜BNX́ASequence/Track/Pointer/EventSet/PointSetB܂񂶂ȂB
  MRSequence.delete_track ĂāAȖɋCBMyDocument gbN폜ƁÃgbN undo obt@ɓ邪ADocument Ƃ̊֌W͂悤ɌB̏ꍇÂ悤Ȗ肪NB(self == MRSequence IuWFNgƂ)
  tr = self.track(1)   #  track 1 L[v
  self.delete_track(1) #  track 1 폜Aundo obt@ɓ
  tr.all_events.modify_tick(1000)  #  tr ҏWBundo obt@̃gbN MyDocument ̒mȂԂɕύXĂ܂

  ΍ƂāA-[MyDocument deleteTrackAt:] ɎāA폜gbNǂ悻ŎgĂiDocumentTrackInfo o^ĂjƂɂ MDTrackNewFromTrack() ŕ̂ undo obt@ɏ悹邱ƂɂB܂@ł͂ȂAꉞ낤B 

2009.11.1.
@ƂႲɂȂĂ̂ŁA܂łɎ Ruby R}h𐮗B

PointSet
clear, initialize, initialize_copy, length, size, member?, include?, each, [], add, <<, delete, reverse, merge, subtract, union, difference, intersection, sym_difference, convolute, deconvolute, offset, +, |, -, &, ^, range_at, inspect, to_s, [] (class method)

EventSet
initialize, track, eot_selected, track=, eot_selected=, each, reverse_each, each_with_index, reverse_each_with_index, select, reject!, modify_tick, modify_code, modify_data, modify_velocity, modify_release_velocity, modify_duration

Kernel
check_interrupt, get_interrupt_flag, set_interrupt_flag, show_progress_panel, hide_progress_panel, set_progress_value, set_progress_message, register_menu, get_global_settings, set_global_settings, execute_script

Sequence
tick_to_time, time_to_tick, tick_to_measure, measure_to_tick, tick_for_selection, duration, track, number_of_tracks, ntracks, each_track, each_editable_track, each_selected_track, insert_track, delete_track, current (class method)

Track
initialize, duration, duration=, count, nevents, count_midi, nmidievents, count_sysex, nsysexevents, count_meta, nmetaevents, pointer, event, channel, channel=, device, device=, name, name=, selection, selection=, eventset, all_events, selected?, editable?, each, each_selected, each_in, reverse_each, reverse_each_selected, reverse_each_in, merge, copy, cut, add, <<

Pointer
initialize, initialize_copy, position, position=, move_to, move_by, track, top, bottom, next, last, next_in_selection, last_in_selection, jump_to_tick, kind, kind=, code, code=, data, data=, tick, tick=, duration, duration=, velocity, velocity=, release_velocity, release_velocity=, selected?

RubyDialog
initialize, run, item, layout, _items, set_attr, attr

2009.11.3.
@I[fBIf[^̘^Ă݂āu܂̎gɂɁv͂Ă܂BI[fBIX[ȂA̓xłȂA{Ƀf[^t@Cɏł邾B傢ȂƂƂȁBƂ肠A
E͐M̃x Level Indicator ŕ\B
E̓x̒{[łł悤ɂBiS`lʂł悢j
EPlay thru ̎B
̂R͍ŒȁB

@SʓI Core Audio ݌v̂AƂ肠F
EMDPlayerInitMIDIDevices ŃO[o AUGraph ĂāA AUStereoMixer gĂiQ DLS Synth ~bNX邽߁jBV[PX̃I[fBIóij play thru ͂ɓ΂B-> MDAudioInitialize() (MDAudio_MacOSX.c) ɈړB
EÕI[fBI͂ AUMixer ɓ̂͂܂ȂB͂Əo͂ aggregate device ΂݂ǁAsampling rate łȂƂȂ炵A낢sRȂƂN肻B
ECAPlayThrough TvR[hQlɂāA悤ɂ΂͂B{Iɂ́AI[fBI͂̃f[^ǂݍ񂾂AOobt@ɗߍށi^ȂłɃt@CɏށjBAAUMixer ̈iO AUVariSpeed(?) ܂āÃR[obNŃOobt@̃f[^Ƃ肱ށB͂Əo͓͂ĂȂ\邩iϓ邱Ƃ邩jAǂǂ񓯊邱Ƃ邽߂ varispeed unit B-> varispeed unit  10.5 ȍ~B͎gȂBTvO[g킹āAuÔÂvЂ痬߂΂̂HOobt@͕K{݂BHAL ̓f[^ "push" Amixer Ȃǂ̓f[^ "pull" B̊Ԃɂ̓obt@KvB܂Ă݂ΓRB
Ef CARingBuffer ̋@\悤B

2010.6.12.
@Kontakt 4 ՓĂ܂ijBI[fBIȂƁB
@̓xƕ\܂łĂȂ̂ŁAƂB

2010.6.18.
@I[fBI^Ōs̃NbV悤ɂȂĂ܂BI[fBIM܂悭łĂȂ̂ŁAԂ񉽂ԈƂĂ񂾂낤BĂ݂B

ygĂ AudioUnit Ȃǁz
@O gAudio (MDAudio) ̃oB
  AUNode synth, synth2; VZB
  AUNode mixer; ~LT[B
  AUNode varispeed; TvOxjbgBgpB
  AUNode output; o̓jbgB
  AUGraph graph; M̂߂ AUGraphB̂悤ɌĂB
  synth  0
  synth2 1 mixer c output
         @@2
  AudioUnit mixerUnit, outputUnit;  mixer, output ̒gB
  MusicDevice musicDevice, musicDevice2;  synth, synth2 ̒gB
  AudioUnit inputUnit; ̓foCXi}CNAĆASoundFlower ȂǁjB graph ɂ͂Ȃ炸AR[obN֐ sMDAudioInputProc găOobt@ɐM𑗂B
  mixer  bus 2 ɂ AUNode ͂ȂĂ炸Amixer ɐݒ肳ꂽR[obN֐ (sMDAudioOutputProc) 烊Oobt@oRŐM擾B
  mixer ̏o͂ output ̓͂ȂĂ炸Aoutput ͂̃R[obN֐ AudioUnitRender(mixerUnit, ..., ioData) Ăяoăf[^擾B֐ŁAI[fBI^̃t@Cւ̏oƁAPlay Thru tOւ̑ΉiPlay Thru ItȂf[^nȂjsB
  
yI[fBItH[}bgɂĐz
ECoreAudio ̓tH[}bǵA32 bit float, non-interleavedB
EOfoCX̓͂ AUHAL ʂBAUHAL  AudioConverter Ă̂ŁAAUHAL ̏õtH[}bgw肷邱ƂłB(Cf. Apple Technical Note 2091)
	CHECK_ERR(err, AudioUnitSetProperty(gAudio->inputUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &gAudio->preferredFormat, sizeof(AudioStreamBasicDescription)));
iSԖڂ̈AAUHAL ͓͗poX 0Ao͗poX 1 ƌ܂ĂBj
EStereoMixer ̓Eoׂ͂ētH[}bgłȂƂȂB
Eoutput ̓tH[}bgw肪ł݂imFjB
EI[fBI^ ExtAudioFile gBA AudioConverter ĂBt@CɏotH[}bg ExtAudioFileCreateNew() Ŏw肷BI[fBIM ExtAudioFileWriteAsync() œnA̎̃tH[}bĝ͎悤Ɏw肷B
	err = ExtAudioFileSetProperty(gAudio->audioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &gAudio->preferredFormat);
ȉꂳĂȂ̂Ŗʓ|BRpCɃ`FbN̂ŊԈႦ炷ɋC͂̂Bj

2010.6.20.
@[J svn Ńo[WǗĊJB
mkdir ~/svnroot
svnadmin create ~/svnroot/Alchemusica
svn mkdir ~/svnroot/Alchemusica/trunk -m "Creating trunk"
svn mkdir ~/svnroot/Alchemusica/tags -m "Creating tags"
svn mkdir ~/svnroot/Alchemusica/branches -m "Creating branches"
cd ~/Development/Alchemusica
(build ȂǁAsvn |Wgɓo^Kv̂Ȃt@C폜)
svn import . file:///Users/******/svnroot/Alchemusica/trunk -m "initial import"
cd ~/Development
mv Alchemusica was_Alchemusica
svn co file:///Users/******/svnroot/Alchemusica/trunk Alchemusica

@I[fBI֌WAꉞ肵݂B
ׂƁF
EVZo͂I[fBIMƓɂB
EAudioUnit ̃vOCǂݍ߂悤Ɂc
@ ꉞ݃CXg[Ă MusicDevice vOC̓Xgł悤ɂȂB
@QlFhttp://quickdekay.net/Software/Tutorials/Components/
@ɂĂAClassic Mac OS łŊNAĂ NewHandle() Ƃ HLock() ȂĊ֐g@Ƃ͎vȂB Component Manager ̂OÏ╨ȂB
EAudioUnit  Custom View \ł悤ɂB
Cf. http://developer.apple.com/mac/library/technotes/tn2007/tn2213.html
@[ACarbon Eventc߂cȂōXȂ̂ƂȂȂ̂c
@Ȃ݂ɁAKontakt  Cocoa View ĂBVitous Philharmonik  Carbon View B
EKontakt ŎĂƂAView [hĂrŃoXG[ŗBCocoa View ł Carbon View łȂBȃeXgR[hƍČȂBɔY񂾂A Xcode ̃^[QbgV蒼ƗȂȂBȂȂ񂾁c

2011.3.20.
@}CN͂Ȃǂ@\ĂȂ̂𔭌BP́AAUHAL AP[gƂ desc.componentFlags, desc.componentFlagsMask [NAĂȂ߂ɃS~cĂƁBP́AsMDAudioAllocateMyBufferList Ńobt@AP[gƂɁAobt@TCY (ip->bufferSizeFrames) ZbgĂȂƁB

2011.8.22.
EԎg undo BȌԂɖ߂炸ȂOɊg債̏Ԃɖ߂Ă܂BC
EXgbv`[gŕҏWI悤ɂBǂ̉ҏWĂ邩mF̂ŁBBVtg{ҏW݂̎͌̑IωȂB
EXgbv`[gҏWƂM[hɂ̂킸킵BsAm[ŃNbNƉ}Ă܂̂ʓ|BiɁA} undo ƂCj@sAm[̉M[hƃXgbv`[g̕`惂[h𕪂BM[h̓Xgbv`[gł͑I[hƓAtɃXgbv`[g̕`惂[h̓sAm[ł͑I[hƓB@ꂽ猻ł邩Ȃc

2011.8.24.
Sysex ̘^Ȃi擪 f0 ĂĵŏCB

2011.8.24.
Â Time Manager ֐u邽߂̍B
EP MDPlayer ƂɂP pthread ̂ȒPBȂɏdȂłB MDPlayer 𓯎ɗグ󋵂͏Ȃ낤B
EJn pthread_create, I pthread_join/pthread_cancelB莞Ԗ̂ nanosleepBnanosleep ̓LZ|CgɂȂĂ̂ȁH  pthread_testcancel ȂƂ߂ȁBĂ݂Bnanosleep ̓LZ|CgɂȂĂ͗lBApthread_cancel gƁALZ|Cgʉ߂_ŃXbhjĂ܂̂ŁAN[Abv[``KvB͂Ƒ傰BǂIɃR[̂AtO𗧂ĂďÎ҂ꂢɏIłB
EłɁARuby ̃C^vg`FbN pthread gBi}`Xbh SIGALRM ĝ͉ƂȂ؂ĈŁcj
EtJn pthread A MDSequence  mutex icalloc  pthread_mutex_t ^̃mۂāÃ|C^ MDSequence ɕێjB
ECXbhFMyDocument f[^ύXƂ MDSequence bNB
EʃXbhFCxg𑗏oĂ MDSequence bNB

@ꉞłƎvBCxĝȂ MyTimerFunc i MyTimerCallbackjC^[oԂ̂OĂāÅԉt~߂ȂƂoOĂ܂Amy_usleep() inanosleep() ̃bp[֐jא؂ɃR[āA̍Ԃ player->shouldTerminate tO`FbN邱ƂŐ؂蔲B

2011.8.27.
@t̉ʉXN[A[__CAOƂj[R}hI𒆂͎~܂Ă܂BNSTimer Ȃ߂ŁA͎dȂƎvĂ̂A͊ȒPɉł邱ƂmB
	timer = [[NSTimer allocWithZone:[self zone]] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:0.1] interval:0.1 target:self selector:@selector(timerCallback:) userInfo:nil repeats:YES];
	[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
	[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSModalPanelRunLoopMode];
	[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode];
@΁A[__CAOj[R}hI𒆂\킸^C}[B
@ꂾƂƂ܂̂́AOtBbNEBhEȂǂҏWłʂɃXN[Ă܂ƁBԂAʃXN[snh̒ŁAu݂ RunLoop modevƁuANeBuȃEBhEv`FbNΐ؂蔲̂ł́H@@RunLoop mode == NSEventTrackingRunLoopMode && ANeBuEBhE`FbNŁAXN[o[̃hbOołB܂AEBhẼ}EXhbO GraphicWindowController  lastMouseClientView  GraphicClientView  isDragging ŌoB

tcommand-Q ȂǂŏIƁAƂǂȃG[oB
2011-08-28 01:26:09.040 Alchemusica[9360:813] *** CFMessagePort: bootstrap_register(): failed 1103 (0x44f) 'Service name already exists', port = 0x7e0f, name = 'Apple MIDI Client'
See /usr/include/servers/bootstrap_defs.h for the error codes.
oł͂ȂBo͂܂łĂȂB

^̃gm[ȂƁB_CAOɃGg[ċ@\ĂȂB

gm[悤ƎvāAȂƂɋCBŃgm[炵ȂI[fBI^ƁAgm[̉ꏏɘ^Ă܂B̂͂Ɩʓ|Bǂ̂ȁc
iꉞ Matrix Mixer gAƂ@͍lĂƁBCf: /Developer/Examples/CoreAudio/Services/MatrixMixerTest j
̃CeV[ƒׂĂȂƂȂȁB

gm[炷ASYB
Eplayer->nextMetronomeBar, nextMetronomeBeat ꂼAɃgm[̃x炷eBbNAʂ̃JEg炷eBbNƂBix͏߂̓j܂A̔qL̈ʒu nextTimeSignature ƂB
Etime signature ̃f[^ d[0..3] ƂƁAP̒ d[2]*timebase/24AP߂̒d[0]*timebase*4/(2^d[1])B
EPreroll(tick) Btick ̒Oɂ锏qL̈ʒu t, P̒ beat, P߂̒ bar ƂƁA
nextMetronomeBar = t + ceil((tick - t) / bar) * bar
t0 = (nextMetronomeBar > tick ? nextMetronomeBar - bar : nextMetronomeBar)
t1 = t0 + ceil((tick - t0) / beat) * beat
nextMetronomeBeat = (t1 > nextMetronomeBar ? nextMetronomeBar : t1)
@ȉCnextMetronomeBeat  beat ₷BnextMetronomeBar, nextTimeSignature ̂΂̂܂܃JEg炵čXVBnextMetronomeBar ȏ nextTimeSignature ΁Ax炵āAnextMetronomeBeat = nextMetronomeBar + beat, nextMetronomeBar += bar ƂB̂ƂAnextMetronomeBar  nextTimeSignature 傫ȂAnextMetronomeBar = nextTimeSignature ƂBbar/beat ͂̂܂܁Bx炵ƂAnextMetronomeBar == nextTimeSignature ȂAbar/beat VqLɍ킹čXVAnextTimeSignature ̔qL̈ʒuɐi߂B

2011.8.31.
łƎvB
ŉtĂƁAƂǂȂȂBt[Y邱ƂBǂAsAmȂŃTXeCy_𓥂݂ςȂɂĂƋN悤Ȃ̂Aڂ͕sB

2011.9.3.
sourceforge.jp  svn ǗɈڍsB
svn mkdir svn+ssh://toshinagata1964@svn.sourceforge.jp/svnroot/alchemusica/trunk -m "Creating trunk"
svn mkdir svn+ssh://toshinagata1964@svn.sourceforge.jp/svnroot/alchemusica/tags -m "Creating tags"
svn mkdir svn+ssh://toshinagata1964@svn.sourceforge.jp/svnroot/alchemusica/branches -m "Creating branches"
cd ~/Development/Alchemusica
(build, Alchemusica.xcode/USERNAME.* ȂǁAsvn |Wgɓo^Kv̂Ȃt@C폜)
svn import . svn+ssh://toshinagata1964@svn.sourceforge.jp/svnroot/alchemusica/trunk -m "initial import"
cd ~/Development
mv Alchemusica was_Alchemusica
svn co svn+ssh://toshinagata1964@svn.sourceforge.jp/svnroot/alchemusica/trunk Alchemusica

  ^O̕tB
svn copy svn+ssh://toshinagata1964@svn.sourceforge.jp/svnroot/alchemusica/trunk svn+ssh://toshinagata1964@svn.sourceforge.jp/svnroot/alchemusica/tags/version_x_y_z -m "version x.y.z"

2012.1.21.
@o[W 0.6.1
NI^CYBiEvents j[j
OtBbNEBhEŁAC`ƃIy[V[h (set/add...) ̃|bvAbv{^ɗLɂB
ݒ̕ۑ@ύXBꕔ̐ݒ肪Ă܂B݂܂B
CxgVtgR}hBiEvents j[j
gbN̑}^폜tɔfĂȂ̂ŏCB
Xgbv`[g̕ҏWA`I[hłł悤ɂB
gm[ݒEBhE삵ĂȂ̂ŏCB܂ANbN̐ݒύXƂ炷悤ɂB
"Detele selected time" gbNɃCxgƂNbVĂ̂ŏCB
gbN\@\B
|[Y{^nCCgĂȂ̂ŏCB

- Quantize selected events menu command is implemented.
- Ruby dialogs can be bound to the global settings by assigning @bind_global_settings instance variable.
- Graphic window: the popup buttons for line shape and operation mode (set/add/...) are always enabled.
- The global settings are again restructured. The settings are now under "settings" entry of the user default.
- set/get_global_settings command changes feature: the setting is no longer placed under "MDRuby" but directly in the UserDefaults, and the key path is now recognized.
- Text field in the Ruby dialog causes "OK" as the default action when return key is pressed.
- Shift selected events command is enabled.
- Inserting/deleting tracks was not reflected in the MIDI playing. Fixed.
- Editing strip chart is also possible when rectangle selection mode is enabled.
- Metronome setting window was not working correctly when the note name is edited. Fixed. Rings metronome bell/click during editing.
- Deleting selected time causes crash when there are no events in the editing track. Fixed.
- Solo track capability is implemented.
- The Pause button was not highlighted correctly. Fixed.

2012.8.16.
o[W 0.6.2
I[fBI^_CAOŁAt@C̏lvWFNg琶悤ɂB
MIDI/I[fBI^Œ~͂肳i~ʒuw肳ĂȂꍇ́AMIDI ^͒~AI[fBI^̓V[PXIƓɒ~jB
Update Audio/MIDI Info j[B
Audio Settings EBhEŁA|bvAbvj[ŃfoCXIƁAOƓfoCXłĂI[fBIZbg悤ɂBiG荞łƂɗLj
sAm[̑IPBi܂肠邩j

- Audio recording dialog now uses the document folder and name for save destinations
- Handling of MIDI/Audio recording is improved; specifically, policy of stop MIDI play is made clear
- Update Audio/MIDI Info menu command is implemented. The Audio settings window is improved.
- Selection mode of the piano roll window is being reworked. (May be still imcomplete)

2013.1.8.
@ςV[PXIƓɃI[fBI^Î͕sւȁB
