Compare commits
824 Commits
non-daw-v1
...
master
Author | SHA1 | Date |
---|---|---|
Jonathan Moore Liles | cdad26211b | |
Jonathan Moore Liles | ba30c91dad | |
Jonathan Moore Liles | 3aa5fc3c21 | |
Jonathan Moore Liles | ce633212bb | |
Jonathan Moore Liles | 0f8017a1ef | |
Jonathan Moore Liles | e909d9594b | |
Jonathan Moore Liles | f76de32c44 | |
Jonathan Moore Liles | 181dd64689 | |
Jonathan Moore Liles | c83aa8ebd8 | |
Jonathan Moore Liles | 0b23c871ee | |
Jonathan Moore Liles | e7c85f1a37 | |
Jonathan Moore Liles | 826bea3c30 | |
Jonathan Moore Liles | 393684f376 | |
Jonathan Moore Liles | ab469f8a23 | |
Jonathan Moore Liles | cf03ea1562 | |
Jonathan Moore Liles | cda92589e9 | |
Jonathan Moore Liles | f2aeb8a1f8 | |
Jonathan Moore Liles | 9f3181b9c7 | |
Jonathan Moore Liles | 20dce6c6e6 | |
Jonathan Moore Liles | 793a9c1d4b | |
Jonathan Moore Liles | f6e3ca8831 | |
Jonathan Moore Liles | 286dec338c | |
Jonathan Moore Liles | 00c02c7d74 | |
Jonathan Moore Liles | e46fac4470 | |
Jonathan Moore Liles | e0402a3b99 | |
Jonathan Moore Liles | 7c071c7422 | |
Jonathan Moore Liles | 9e82b28f07 | |
Jonathan Moore Liles | a0fd557baf | |
Jonathan Moore Liles | 82f9610ca8 | |
Jonathan Moore Liles | 1f0f01c0ad | |
Jonathan Moore Liles | e290c6ea60 | |
Jonathan Moore Liles | 9aa275e0af | |
Jonathan Moore Liles | f5b215066a | |
Jonathan Moore Liles | c808c53d6c | |
Jonathan Moore Liles | ae773fbf62 | |
Jonathan Moore Liles | 6bde5017f5 | |
Jonathan Moore Liles | da78618e5b | |
Jonathan Moore Liles | 368492f1c0 | |
Jonathan Moore Liles | 5ea0c24468 | |
Jonathan Moore Liles | d84416c196 | |
Jonathan Moore Liles | a59823e4c5 | |
Jonathan Moore Liles | 6673606262 | |
Jonathan Moore Liles | 54e8737a90 | |
Jonathan Moore Liles | 0157734a30 | |
Jonathan Moore Liles | 655ccf94c3 | |
Jonathan Moore Liles | a9846d1fc3 | |
Jonathan Moore Liles | ad6dbba07c | |
Jonathan Moore Liles | 362a153412 | |
Jonathan Moore Liles | 830823a226 | |
Jonathan Moore Liles | dd274db49b | |
Jonathan Moore Liles | 13c107ebcc | |
Jonathan Moore Liles | b1d59fc68a | |
Jonathan Moore Liles | e42b50814a | |
Jonathan Moore Liles | 628fef30e9 | |
Jonathan Moore Liles | 53ff9621ff | |
Jonathan Moore Liles | ee872467fb | |
Jonathan Moore Liles | 9987f78a72 | |
Jonathan Moore Liles | 7895b5ec7e | |
Jonathan Moore Liles | 83f7aa87f0 | |
Jonathan Moore Liles | 8d6885387b | |
Jonathan Moore Liles | 4c14cdd350 | |
Jonathan Moore Liles | b13d2da674 | |
Jonathan Moore Liles | 5378bbbb27 | |
Jonathan Moore Liles | b0d850ff76 | |
Jonathan Moore Liles | e5c08b3b58 | |
Jonathan Moore Liles | 572f94ad44 | |
Jonathan Moore Liles | e36a053b84 | |
Jonathan Moore Liles | 10bcd0c2d7 | |
Jonathan Moore Liles | cd4896b762 | |
Jonathan Moore Liles | 19b7927f08 | |
Jonathan Moore Liles | a2089421b1 | |
Jonathan Moore Liles | 5affbe4cef | |
Jonathan Moore Liles | 9b87c089d0 | |
Jonathan Moore Liles | cb3d4f9254 | |
Jonathan Moore Liles | 9330b07d99 | |
Jonathan Moore Liles | a578cbb8e1 | |
Jonathan Moore Liles | 820298f4dd | |
Jonathan Moore Liles | 992e55bf0d | |
Jonathan Moore Liles | 81e24f4239 | |
Jonathan Moore Liles | 6bee859f6f | |
Jonathan Moore Liles | 455cc0f3ad | |
Jonathan Moore Liles | 8109ff7bc0 | |
Jonathan Moore Liles | 1a07dda5d9 | |
Jonathan Moore Liles | b3ffef17b5 | |
Jonathan Moore Liles | a7a7b967c8 | |
falkTX | 55de086026 | |
Jonathan Moore Liles | 7565be85fb | |
Jonathan Moore Liles | 0106604073 | |
Jonathan Moore Liles | 97d12322f5 | |
Jonathan Moore Liles | bbe8386499 | |
Nils | aa940df662 | |
Jonathan Moore Liles | d958df0486 | |
Olivier Humbert | c15bfa85fd | |
Olivier Humbert | 7f0cc1d733 | |
Olivier Humbert | 911a9bded4 | |
Olivier Humbert | d280f9391f | |
Jonathan Moore Liles | ea6ff30cea | |
Jonathan Moore Liles | d0432caa0b | |
Jonathan Moore Liles | 9e9f90f2f0 | |
Jonathan Moore Liles | 5ae43bb27c | |
Jonathan Moore Liles | 1904aba516 | |
Jonathan Moore Liles | 9fdf3a6ae3 | |
Jonathan Moore Liles | a2971c0718 | |
Jonathan Moore Liles | 63a624414b | |
non25 | 7f42caf789 | |
Jonathan Moore Liles | 3d18cf37b9 | |
Jonathan Moore Liles | 10c31e5729 | |
Jonathan Moore Liles | 1daf0f6150 | |
Jonathan Moore Liles | e7f4a1c4b9 | |
Jonathan Moore Liles | 754d113b0e | |
Jonathan Moore Liles | a22f33f486 | |
Nils Hilbricht | 35d06de361 | |
martin | f572e331ee | |
Daniel Appelt | 16885e69fe | |
Jonathan Moore Liles | 3946d39221 | |
Jonathan Moore Liles | 1ef382fbbe | |
Jonathan Moore Liles | 5d274f430c | |
Jonathan Moore Liles | 88fe7e7b97 | |
Jonathan Moore Liles | b57f891e6d | |
Jonathan Moore Liles | 5984b12b1a | |
Jonathan Moore Liles | f483957996 | |
Jonathan Moore Liles | cfe4aec158 | |
Jonathan Moore Liles | fe51e322f3 | |
Jonathan Moore Liles | c0113d1e7a | |
Jonathan Moore Liles | abde7f3bb5 | |
Jonathan Moore Liles | 156fd6d453 | |
Jonathan Moore Liles | aefc328c2d | |
Jonathan Moore Liles | 97d149421f | |
Jonathan Moore Liles | 3e4c6e9a50 | |
Jonathan Moore Liles | 640bfbb4d1 | |
Jonathan Moore Liles | 386d293650 | |
Jonathan Moore Liles | 83fa3637f6 | |
Jonathan Moore Liles | e42f0a9bd7 | |
Jonathan Moore Liles | 319a393cd6 | |
Jonathan Moore Liles | 037ecb5d9f | |
Jonathan Moore Liles | dc25c750fb | |
Jonathan Moore Liles | 40e7b77420 | |
Jonathan Moore Liles | 8fbcb4eb79 | |
Jonathan Moore Liles | cf8e553bb4 | |
Jonathan Moore Liles | 18a299cac7 | |
Jonathan Moore Liles | 8a58591067 | |
Jonathan Moore Liles | 0047df03fe | |
Jonathan Moore Liles | 60059f4005 | |
Jonathan Moore Liles | ab88b2d3ec | |
Jonathan Moore Liles | 7934a71c70 | |
Jonathan Moore Liles | e230929a57 | |
Jonathan Moore Liles | 6bd899f223 | |
Jonathan Moore Liles | 57653d5cdf | |
Jonathan Moore Liles | 686d830402 | |
Jonathan Moore Liles | 9d39699950 | |
Jonathan Moore Liles | 9790201fd8 | |
Jonathan Moore Liles | d881dce874 | |
Jonathan Moore Liles | 55bbce6d24 | |
Jonathan Moore Liles | 6f3e96f311 | |
Hanspeter Portner | 2d43a8abe7 | |
Jonathan Moore Liles | 467e369cd1 | |
Jonathan Moore Liles | 5b0d6e6bd1 | |
Jonathan Moore Liles | de7c7ae0b8 | |
Jonathan Moore Liles | 5d5b22afd4 | |
Jonathan Moore Liles | 13c3ca8eb8 | |
Jonathan Moore Liles | d795a484f0 | |
Jonathan Moore Liles | f6c0e48a50 | |
Jonathan Moore Liles | 1aafc5330f | |
Jonathan Moore Liles | 23107541c8 | |
Jonathan Moore Liles | f3fdea50d6 | |
Jonathan Moore Liles | de6c22ac46 | |
Jonathan Moore Liles | 50a5f66fff | |
Jonathan Moore Liles | e6313394cd | |
Jonathan Moore Liles | 7770610d32 | |
Jonathan Moore Liles | 45a33b8467 | |
Jonathan Moore Liles | 1b3994a5f1 | |
Jonathan Moore Liles | 3628f08fbc | |
Jonathan Moore Liles | d332da3c39 | |
Jonathan Moore Liles | 6673dcd28e | |
Jonathan Moore Liles | cf46b447d0 | |
Jonathan Moore Liles | 8109c20e5c | |
Jonathan Moore Liles | 8856216d86 | |
Jonathan Moore Liles | 7c71faab1c | |
Jonathan Moore Liles | 504b77f6c7 | |
Jonathan Moore Liles | 200bfe91ca | |
Jonathan Moore Liles | 83fceb23dc | |
Jonathan Moore Liles | 2e49295320 | |
Jonathan Moore Liles | 6bbe69e712 | |
Jonathan Moore Liles | 52150723c6 | |
Jonathan Moore Liles | b85ba3c2d9 | |
Jonathan Moore Liles | 51bce6124e | |
Jonathan Moore Liles | 2ea366a409 | |
Jonathan Moore Liles | 97573f0299 | |
Jonathan Moore Liles | 423a8428e1 | |
Jonathan Moore Liles | 5ab7d7c410 | |
Jonathan Moore Liles | 55b020f3a0 | |
Jonathan Moore Liles | b7b3d499e5 | |
Jonathan Moore Liles | 47f15d9937 | |
Jonathan Moore Liles | 4d20ed0f7b | |
Jonathan Moore Liles | ea0c2839c1 | |
Jonathan Moore Liles | d97a2ee7ba | |
Jonathan Moore Liles | f3b73381d7 | |
Jonathan Moore Liles | 8675f7d31c | |
Jonathan Moore Liles | a9d547e794 | |
Jonathan Moore Liles | 6d7a71636a | |
Jonathan Moore Liles | 9b634cf001 | |
Jonathan Moore Liles | 758f7b86b4 | |
Jonathan Moore Liles | eb482d3a36 | |
Jonathan Moore Liles | 795249a612 | |
Jonathan Moore Liles | cc7f6a93ab | |
Jonathan Moore Liles | a102d76912 | |
Jonathan Moore Liles | 7f5e9f1e9b | |
Jonathan Moore Liles | 19b19edf0e | |
Jonathan Moore Liles | 17e7ad0ad6 | |
Jonathan Moore Liles | 3fad04c2d5 | |
Jonathan Moore Liles | 00ed29d6c2 | |
Jonathan Moore Liles | fc5c59c61d | |
Jonathan Moore Liles | a05384a8c3 | |
Jonathan Moore Liles | 7da3bb325f | |
Jonathan Moore Liles | 933bfe882a | |
Jonathan Moore Liles | 963d926659 | |
Jonathan Moore Liles | 3ca72b4ac6 | |
Jonathan Moore Liles | 58fdf7d914 | |
Jonathan Moore Liles | 9fba8a8577 | |
Jonathan Moore Liles | cf5c557c2f | |
Jonathan Moore Liles | b3a9d0be1d | |
Jonathan Moore Liles | e927781ee0 | |
Jonathan Moore Liles | 2cca17376a | |
Jonathan Moore Liles | bf232b3928 | |
Jonathan Moore Liles | 6f42e2b816 | |
Jonathan Moore Liles | c662ff4332 | |
Jonathan Moore Liles | 1d9bd576f6 | |
Jonathan Moore Liles | db2b1e0952 | |
Jonathan Moore Liles | 89f62c13a4 | |
Jonathan Moore Liles | f8f6bad322 | |
Jonathan Moore Liles | 442003e61f | |
Jonathan Moore Liles | a1336880b5 | |
Jonathan Moore Liles | 4bf4a1ef14 | |
Jonathan Moore Liles | 55f54085c5 | |
Jonathan Moore Liles | 96a6709fe8 | |
Jonathan Moore Liles | 40352db651 | |
Jonathan Moore Liles | d5741f9999 | |
Jonathan Moore Liles | 2545510006 | |
Jonathan Moore Liles | 865a14b74b | |
Jonathan Moore Liles | 4c5551ad8e | |
Jonathan Moore Liles | 4bda8db1fd | |
Jonathan Moore Liles | 839ed187d6 | |
Jonathan Moore Liles | 8fe598eff4 | |
Jonathan Moore Liles | 2afec38a54 | |
Jonathan Moore Liles | ff41fb9f81 | |
Jonathan Moore Liles | ca7d95a92d | |
Jonathan Moore Liles | f68232ab5c | |
Jonathan Moore Liles | 03fcf31311 | |
Jonathan Moore Liles | 04c8e908e8 | |
Jonathan Moore Liles | 451e948a17 | |
Jonathan Moore Liles | 8055e08e9e | |
Jonathan Moore Liles | a797093a58 | |
Jonathan Moore Liles | 6e776faf24 | |
Jonathan Moore Liles | b8184ac910 | |
Jonathan Moore Liles | a30d065cb7 | |
Jonathan Moore Liles | 8001b1b2c1 | |
Jonathan Moore Liles | 8101abafeb | |
Jonathan Moore Liles | a872d99e9b | |
Jonathan Moore Liles | cec17e7990 | |
Jonathan Moore Liles | 09fe968264 | |
Jonathan Moore Liles | 68655cc599 | |
Jonathan Moore Liles | 46d2324446 | |
Jonathan Moore Liles | e578deb112 | |
Jonathan Moore Liles | 1cb9f68cf1 | |
Jonathan Moore Liles | 19487a72e4 | |
Jonathan Moore Liles | 9b8f02fbf3 | |
Jonathan Moore Liles | 21ab68d3e5 | |
Jonathan Moore Liles | d1c4fe418b | |
Jonathan Moore Liles | b0fc87ec86 | |
Jonathan Moore Liles | fab76b1c4f | |
Jonathan Moore Liles | dd21a18c81 | |
Jonathan Moore Liles | 5ccc6e7595 | |
Jonathan Moore Liles | d2b2c0808d | |
Jonathan Moore Liles | e6d153c13c | |
Jonathan Moore Liles | 9837a8f3f7 | |
Jonathan Moore Liles | 0da98f95b8 | |
Jonathan Moore Liles | a3f1265ef3 | |
Jonathan Moore Liles | 612fdfe952 | |
Jonathan Moore Liles | 0d42bf3483 | |
Jonathan Moore Liles | 50d5411411 | |
Jonathan Moore Liles | 2da6c503aa | |
Jonathan Moore Liles | 8d330997d1 | |
Jonathan Moore Liles | 932a78c747 | |
Jonathan Moore Liles | e95fd10775 | |
Jonathan Moore Liles | be025b00b9 | |
Jonathan Moore Liles | b31eef9c36 | |
Jonathan Moore Liles | 123d45c1ae | |
Jonathan Moore Liles | e88c255d45 | |
Jonathan Moore Liles | 70856a6e8e | |
Jonathan Moore Liles | cfd451c4d6 | |
Jonathan Moore Liles | a59dad4204 | |
Jonathan Moore Liles | fd1207b75e | |
Jonathan Moore Liles | a958276b06 | |
Jonathan Moore Liles | 1a9741cb7f | |
Jonathan Moore Liles | 6d2aeaf405 | |
Jonathan Moore Liles | aedbca82be | |
Jonathan Moore Liles | fd64b39fa4 | |
Jonathan Moore Liles | 0c6a3ea0f8 | |
Jonathan Moore Liles | a3a8247b83 | |
Jonathan Moore Liles | 07161196bd | |
Jonathan Moore Liles | 6adf6a9389 | |
Jonathan Moore Liles | 37d5dd87b9 | |
Jonathan Moore Liles | d7d711807d | |
Jonathan Moore Liles | fad4f7938c | |
Jonathan Moore Liles | d9ba4bda2b | |
Jonathan Moore Liles | bc78302220 | |
Jonathan Moore Liles | 3b8991c54c | |
Jonathan Moore Liles | 582621edd2 | |
Jonathan Moore Liles | bbffb98981 | |
Jonathan Moore Liles | 72a1e2a5cf | |
Jonathan Moore Liles | 3e932c9930 | |
Jonathan Moore Liles | 02bb329551 | |
Jonathan Moore Liles | 54b8dfefb7 | |
Jonathan Moore Liles | fadeea8a33 | |
Jonathan Moore Liles | 550fb651c7 | |
Jonathan Moore Liles | 6adba68975 | |
Jonathan Moore Liles | b664d0ed04 | |
Jonathan Moore Liles | 0552a9a7cf | |
Jonathan Moore Liles | 960dc543c3 | |
Jonathan Moore Liles | 70e23f1994 | |
Jonathan Moore Liles | dafaebb0de | |
Jonathan Moore Liles | 4dcc011ca1 | |
Jonathan Moore Liles | d0c4be1ff9 | |
Jonathan Moore Liles | 5e958416cd | |
Jonathan Moore Liles | d4f96fe762 | |
Jonathan Moore Liles | 89f2633463 | |
Jonathan Moore Liles | d4c15e6fa7 | |
Jonathan Moore Liles | f2bc2b5c9b | |
Jonathan Moore Liles | 8b5f5a76aa | |
Jonathan Moore Liles | 1c6add6c2b | |
Jonathan Moore Liles | 3084956664 | |
Jonathan Moore Liles | 973089890c | |
Jonathan Moore Liles | 899740c2f1 | |
Jonathan Moore Liles | c351700be0 | |
Jonathan Moore Liles | 1fc7c2eed2 | |
Jonathan Moore Liles | 97677c561e | |
Jonathan Moore Liles | 875ef17575 | |
Jonathan Moore Liles | bf50334890 | |
Jonathan Moore Liles | 2f730acefb | |
Jonathan Moore Liles | a162876025 | |
Jonathan Moore Liles | c839d690ab | |
Jonathan Moore Liles | ea9d7b2420 | |
Roy Vegard Ovesen | ec8bfcba63 | |
Jonathan Moore Liles | e6e101fc67 | |
Jonathan Moore Liles | 1945477b10 | |
Jonathan Moore Liles | 45cf2f7135 | |
Jonathan Moore Liles | 5af9afdd8d | |
Jonathan Moore Liles | 455c93683c | |
Jonathan Moore Liles | 52f016abed | |
Jonathan Moore Liles | dcec3282a9 | |
Jonathan Moore Liles | 00a78fdb27 | |
Jonathan Moore Liles | ea380f00f9 | |
Jonathan Moore Liles | 5d59a1d291 | |
Jonathan Moore Liles | 5ea31d47d7 | |
Jonathan Moore Liles | fc5ef8f9f9 | |
Jonathan Moore Liles | 7900ef6add | |
Jonathan Moore Liles | eff5189638 | |
Roy Vegard Ovesen | cbba71a0c8 | |
Jonathan Moore Liles | 3f3f98b4ca | |
Jonathan Moore Liles | a3c1e806a9 | |
Jonathan Moore Liles | 92932fb1b0 | |
Jonathan Moore Liles | 90551b732d | |
Jonathan Moore Liles | b3830057cb | |
Jonathan Moore Liles | f5eaf5bc2d | |
Jonathan Moore Liles | b4d811adf1 | |
Jonathan Moore Liles | 851be29d6a | |
Jonathan Moore Liles | 171975b26b | |
Jonathan Moore Liles | 07e40513c6 | |
Jonathan Moore Liles | ae633840fb | |
Jonathan Moore Liles | 4ef20c0f71 | |
Jonathan Moore Liles | 5adba898ef | |
Jonathan Moore Liles | dd9eb35ab2 | |
Jonathan Moore Liles | 5d35f37d4e | |
Jonathan Moore Liles | 6ec8f6e85e | |
Jonathan Moore Liles | 9501e52d54 | |
Jonathan Moore Liles | ec09f027d6 | |
Jonathan Moore Liles | 29479f73c4 | |
Jonathan Moore Liles | cbf7df0e0d | |
Jonathan Moore Liles | b531769184 | |
Jonathan Moore Liles | ffcf1454d5 | |
Jonathan Moore Liles | e69a124e27 | |
Jonathan Moore Liles | 8f89e237e9 | |
Jonathan Moore Liles | e386d963aa | |
Jonathan Moore Liles | f879b9eab5 | |
Jonathan Moore Liles | bb26718834 | |
Jonathan Moore Liles | 4d3e4ca4f1 | |
Jonathan Moore Liles | ee09187089 | |
Jonathan Moore Liles | 0c4161ce85 | |
Jonathan Moore Liles | c794617b30 | |
Jonathan Moore Liles | 9df0e9d665 | |
Jonathan Moore Liles | d7cf8955b8 | |
Jonathan Moore Liles | 5c6e9f8d37 | |
Jonathan Moore Liles | 4103cd016b | |
Jonathan Moore Liles | 271eb2d331 | |
Jonathan Moore Liles | 9230ab3d04 | |
Jonathan Moore Liles | 14b8507fcb | |
Jonathan Moore Liles | 299193dc60 | |
Jonathan Moore Liles | 7bbc97983b | |
Jonathan Moore Liles | acb38aca99 | |
Jonathan Moore Liles | 2c646deebf | |
Roy Vegard Ovesen | daf240d83e | |
Roy Vegard Ovesen | 31f05a7aac | |
Jonathan Moore Liles | 31c14150e7 | |
Jonathan Moore Liles | a6a15e2a2d | |
Jonathan Moore Liles | 37b881b638 | |
Jonathan Moore Liles | 815a16f96f | |
Jonathan Moore Liles | f137629b93 | |
Jonathan Moore Liles | 6a8a2d6e38 | |
Jonathan Moore Liles | 92716b103d | |
Jonathan Moore Liles | ceb04569e9 | |
Jonathan Moore Liles | 1aa102a8e4 | |
Jonathan Moore Liles | 3939576b05 | |
Jonathan Moore Liles | b1586811f9 | |
Jonathan Moore Liles | 7d5a0e13f6 | |
Jonathan Moore Liles | 14099b7cfc | |
Jonathan Moore Liles | 0f6d481f88 | |
Jonathan Moore Liles | b855493014 | |
Jonathan Moore Liles | d2668943e5 | |
Jonathan Moore Liles | 7a5425beca | |
Jonathan Moore Liles | f0757a09c8 | |
Jonathan Moore Liles | 84e381529e | |
Jonathan Moore Liles | c59554c774 | |
Jonathan Moore Liles | e8892926fd | |
Jonathan Moore Liles | 0e467993a2 | |
Jonathan Moore Liles | d86cda8977 | |
Jonathan Moore Liles | 42072343d3 | |
Jonathan Moore Liles | b1eb988257 | |
Jonathan Moore Liles | f29a132dfc | |
Jonathan Moore Liles | 63c4f68b3b | |
Jonathan Moore Liles | 70e0db1c47 | |
Jonathan Moore Liles | a99f707bda | |
Jonathan Moore Liles | 8b9ef85c80 | |
Jonathan Moore Liles | 0e66baaf21 | |
Jonathan Moore Liles | eb639c9bfd | |
Jonathan Moore Liles | 04d8bd6a8d | |
Jonathan Moore Liles | 252b105e67 | |
Jonathan Moore Liles | a25ea63389 | |
Jonathan Moore Liles | 801d1b20fb | |
Jonathan Moore Liles | 525470392a | |
Jonathan Moore Liles | 551ace4547 | |
Jonathan Moore Liles | b075c82dbd | |
Jonathan Moore Liles | 8e5ccd9093 | |
Jonathan Moore Liles | 626f79f8c9 | |
Jonathan Moore Liles | 47874addb5 | |
Jonathan Moore Liles | 8d282617e6 | |
Jonathan Moore Liles | 88b552ea00 | |
Jonathan Moore Liles | 25f2a55ce0 | |
Jonathan Moore Liles | ea33310f33 | |
Jonathan Moore Liles | c7787c8ad6 | |
Jonathan Moore Liles | b83c70175d | |
Jonathan Moore Liles | 98c5c196d4 | |
Jonathan Moore Liles | a228920ac1 | |
Jonathan Moore Liles | e4d08afc68 | |
Jonathan Moore Liles | 51379e2e51 | |
Jonathan Moore Liles | e4d0945bf9 | |
Jonathan Moore Liles | f41cf07188 | |
Jonathan Moore Liles | 85e225810f | |
Jonathan Moore Liles | 4f4698a12c | |
Jonathan Moore Liles | 3756dea1d6 | |
Jonathan Moore Liles | 0c5a46422a | |
Jonathan Moore Liles | 5fc5ce0cc0 | |
Jonathan Moore Liles | c2bf264120 | |
Jonathan Moore Liles | 94d55bd4e1 | |
Jonathan Moore Liles | 8a6772b6b9 | |
Jonathan Moore Liles | 569ba81f42 | |
Jonathan Moore Liles | d455621543 | |
Jonathan Moore Liles | a985cb3168 | |
Jonathan Moore Liles | be495a6ded | |
Jonathan Moore Liles | ed3b5355a4 | |
Jonathan Moore Liles | 102670cb31 | |
Jonathan Moore Liles | 1ff528c8bf | |
Jonathan Moore Liles | e1d706b5ed | |
Jonathan Moore Liles | 44f0aa7f35 | |
Jonathan Moore Liles | 964a1c53a3 | |
Jonathan Moore Liles | bae6e38504 | |
Jonathan Moore Liles | e0b9c34f45 | |
Jonathan Moore Liles | 63d6da1f2f | |
Jonathan Moore Liles | 1b4ec17964 | |
Jonathan Moore Liles | dd6f448d72 | |
Jonathan Moore Liles | e77dbca085 | |
Jonathan Moore Liles | 998760bac6 | |
Jonathan Moore Liles | 753ac2b56a | |
Jonathan Moore Liles | f089d61ee2 | |
Jonathan Moore Liles | 781ec66510 | |
Jonathan Moore Liles | 5ffe3d44b3 | |
Jonathan Moore Liles | 73ebd3534b | |
Jonathan Moore Liles | 360f4f2481 | |
Jonathan Moore Liles | 3b25772788 | |
Jonathan Moore Liles | 06be33b0cc | |
Jonathan Moore Liles | fc34b88b50 | |
Jonathan Moore Liles | 96c14ea75a | |
Jonathan Moore Liles | c54738a502 | |
Jonathan Moore Liles | d97d1556d6 | |
Jonathan Moore Liles | 47b82f0c9a | |
Jonathan Moore Liles | 9c1eb8276d | |
Jonathan Moore Liles | 173ab99186 | |
Jonathan Moore Liles | 1c7a64e266 | |
Jonathan Moore Liles | b04e1395cf | |
Jonathan Moore Liles | 63bfc927c6 | |
Jonathan Moore Liles | d86b71cb2c | |
Jonathan Moore Liles | afd354a5b8 | |
Jonathan Moore Liles | 46d1c9c72a | |
Jonathan Moore Liles | 7c8eb777e5 | |
Jonathan Moore Liles | f124316c4b | |
Jonathan Moore Liles | 3d3a248fe5 | |
Jonathan Moore Liles | b50766b7da | |
Jonathan Moore Liles | 455fb7e1b9 | |
Jonathan Moore Liles | 9897655a9e | |
Jonathan Moore Liles | 31cbec8a16 | |
Jonathan Moore Liles | 12ed651e13 | |
Jonathan Moore Liles | 21ba2e35e5 | |
Jonathan Moore Liles | 3c01a8a72a | |
Jonathan Moore Liles | cf0c53b443 | |
Jonathan Moore Liles | ada46d215b | |
Jonathan Moore Liles | ee063e003b | |
Jonathan Moore Liles | 03fdc46f3c | |
Jonathan Moore Liles | a7d2f2f213 | |
Jonathan Moore Liles | 3054e7ecbf | |
Jonathan Moore Liles | 2f06f509d7 | |
Jonathan Moore Liles | bcfa3953b1 | |
Jonathan Moore Liles | ddb5d4f7ab | |
Jonathan Moore Liles | cfcf4cf1fb | |
Jonathan Moore Liles | 15a78bbfb5 | |
Jonathan Moore Liles | 2861509b52 | |
Jonathan Moore Liles | 5cc6136f9c | |
Jonathan Moore Liles | 9cebe116d1 | |
Jonathan Moore Liles | a6f43250ae | |
Jonathan Moore Liles | 5f7a29219e | |
Jonathan Moore Liles | c4b4f49575 | |
Jonathan Moore Liles | fd3d294b8a | |
Jonathan Moore Liles | 14d189c939 | |
Jonathan Moore Liles | ee8764495f | |
Jonathan Moore Liles | 3a999ecc86 | |
James Morris | 15e095092c | |
Jonathan Moore Liles | c53cb2e7fe | |
Jonathan Moore Liles | 89d26989f3 | |
Jonathan Moore Liles | f4dace9983 | |
Jonathan Moore Liles | 7f8de0710a | |
Jonathan Moore Liles | be3c9c6412 | |
Jonathan Moore Liles | ee2d86a012 | |
Jonathan Moore Liles | 870203b3dd | |
Jonathan Moore Liles | 81217a8722 | |
Jonathan Moore Liles | 44a0279e4c | |
Jonathan Moore Liles | a480a93ba4 | |
Jonathan Moore Liles | 8cddccf6a4 | |
Jonathan Moore Liles | 3cc14df756 | |
Jonathan Moore Liles | 6f993eeb10 | |
Jonathan Moore Liles | 13b6537ee4 | |
Jonathan Moore Liles | 94367a990c | |
Jonathan Moore Liles | 553db45e8b | |
Jonathan Moore Liles | 1f9c2bbb6a | |
Jonathan Moore Liles | ab8f23f15d | |
Jonathan Moore Liles | 7107cbbf4c | |
Jonathan Moore Liles | deb08d4b14 | |
Jonathan Moore Liles | a27d0b1718 | |
Jonathan Moore Liles | e968d8190f | |
Jonathan Moore Liles | f04c36cae9 | |
Jonathan Moore Liles | 989b6f0e4b | |
Jonathan Moore Liles | e219e6766e | |
Jonathan Moore Liles | af3698bebc | |
Jonathan Moore Liles | 1d59665702 | |
Jonathan Moore Liles | ee5e4958d3 | |
Jonathan Moore Liles | 65f33096c2 | |
Jonathan Moore Liles | 183764e767 | |
Jonathan Moore Liles | f3505a84de | |
Jonathan Moore Liles | c6f6c57c05 | |
Jonathan Moore Liles | 275878395f | |
Jonathan Moore Liles | a5588f7ad4 | |
fundamental | ab98b66f44 | |
Jonathan Moore Liles | 8eef38f0cc | |
Jonathan Moore Liles | c0375e614a | |
Jonathan Moore Liles | 2af46a1a0c | |
Jonathan Moore Liles | d249bb9bbd | |
Jonathan Moore Liles | 0fba0747fc | |
Jonathan Moore Liles | e5e6925c2c | |
Jonathan Moore Liles | 7217266f6b | |
Jonathan Moore Liles | 72a0c0eb3e | |
Jonathan Moore Liles | 3cca1e48a5 | |
Jonathan Moore Liles | e5875fa072 | |
Jonathan Moore Liles | 3e73817155 | |
Jonathan Moore Liles | a8a5638f6a | |
Jonathan Moore Liles | 66d7701655 | |
Jonathan Moore Liles | 8df6acd540 | |
Jonathan Moore Liles | b1cbd4faa6 | |
Jonathan Moore Liles | d7fc792839 | |
Jonathan Moore Liles | 5eb890d653 | |
Jonathan Moore Liles | 6ae771b297 | |
Jonathan Moore Liles | fa195cf817 | |
Jonathan Moore Liles | 9b669e42e0 | |
Jonathan Moore Liles | fbef266be3 | |
Jonathan Moore Liles | a465c17e2a | |
Jonathan Moore Liles | c370130d2b | |
Jonathan Moore Liles | fa5d739ac7 | |
Jonathan Moore Liles | c9a7e56b80 | |
Jonathan Moore Liles | 0cc0bf2f00 | |
Jonathan Moore Liles | 73d2c2d396 | |
Jonathan Moore Liles | 0904809a05 | |
Jonathan Moore Liles | d23307ca53 | |
Jonathan Moore Liles | 2c6b6b1a75 | |
Jonathan Moore Liles | a588f4ae96 | |
Jonathan Moore Liles | f5240cb2f4 | |
Jonathan Moore Liles | 363f2f04bc | |
Jonathan Moore Liles | ac30a5a4e2 | |
Jonathan Moore Liles | f279f49b1e | |
Jonathan Moore Liles | f816742b65 | |
Jonathan Moore Liles | 16a4c0f51d | |
Jonathan Moore Liles | 9f28f7a1a8 | |
Jonathan Moore Liles | be79c69161 | |
Jonathan Moore Liles | da225ff64a | |
Jonathan Moore Liles | c21e7b1381 | |
Jonathan Moore Liles | 272e87cbf8 | |
Jonathan Moore Liles | ae5879a20e | |
Jonathan Moore Liles | 57ac27ecac | |
Jonathan Moore Liles | 61addce803 | |
Jonathan Moore Liles | e662a7623b | |
Jonathan Moore Liles | 5e63b25504 | |
Jonathan Moore Liles | 25a0b8afc6 | |
Jonathan Moore Liles | 12532e1fbc | |
Jonathan Moore Liles | 89c76fe0c9 | |
Jonathan Moore Liles | 16f8956f8d | |
Jonathan Moore Liles | 679e33d729 | |
Jonathan Moore Liles | 11a0d40e86 | |
Jonathan Moore Liles | d34ede74a6 | |
Jonathan Moore Liles | ffe5299da4 | |
Jonathan Moore Liles | a66c041050 | |
Jonathan Moore Liles | 1d8d8b0548 | |
Jonathan Moore Liles | 468c969162 | |
Jonathan Moore Liles | b48ca7c44b | |
Jonathan Moore Liles | 885ef30a88 | |
Jonathan Moore Liles | fdcf74ddbe | |
Jonathan Moore Liles | e424182dce | |
Jonathan Moore Liles | eda11f56fe | |
Jonathan Moore Liles | 9896970ed0 | |
Jonathan Moore Liles | 9667f98995 | |
Jonathan Moore Liles | f941d7c923 | |
Jonathan Moore Liles | 338e66c759 | |
Jonathan Moore Liles | 792e6f280a | |
Jonathan Moore Liles | 95175c3e2b | |
Jonathan Moore Liles | 713f3ef476 | |
Jonathan Moore Liles | 91c8dd905f | |
Jonathan Moore Liles | 0a963f5c8a | |
Jonathan Moore Liles | bc6f94e769 | |
Nedko Arnaudov | 0c9ad88b4f | |
Nedko Arnaudov | 54c74d3de7 | |
Nedko Arnaudov | fa504e062d | |
Jonathan Moore Liles | d4900e10e5 | |
Jonathan Moore Liles | 6673f7057a | |
Jonathan Moore Liles | c74cd04bab | |
Jonathan Moore Liles | e1495ba425 | |
Jonathan Moore Liles | ced664baf2 | |
Jonathan Moore Liles | ca3076d2ec | |
Jonathan Moore Liles | a988b18062 | |
Jonathan Moore Liles | ce6a7f3ec3 | |
Jonathan Moore Liles | 5a95b1a18f | |
Jonathan Moore Liles | 9db488173b | |
Jonathan Moore Liles | 376f863833 | |
Jonathan Moore Liles | ed908d4bcb | |
Jonathan Moore Liles | 11c9a02687 | |
Jonathan Moore Liles | 2e80994cf5 | |
Jonathan Moore Liles | 5336880bd4 | |
Jonathan Moore Liles | 9a80f4c3f3 | |
Jonathan Moore Liles | 0f86ee6882 | |
Jonathan Moore Liles | 0abfd44031 | |
Jonathan Moore Liles | e81270d74e | |
Jonathan Moore Liles | 6a0b2d2069 | |
Jonathan Moore Liles | ad3d826493 | |
Jonathan Moore Liles | dd5aa2cdcf | |
Jonathan Moore Liles | 6f19499a3c | |
Jonathan Moore Liles | 5672517caa | |
Jonathan Moore Liles | ca64e0fef8 | |
Jonathan Moore Liles | d4bacf444a | |
Jonathan Moore Liles | 670400cbf9 | |
Jonathan Moore Liles | 92dfbbc6f6 | |
Jonathan Moore Liles | 2d5072c7d7 | |
Jonathan Moore Liles | 676a98c17e | |
Jonathan Moore Liles | d67ee6605a | |
Jonathan Moore Liles | e4e546b849 | |
Jonathan Moore Liles | ae6b78cf89 | |
Jonathan Moore Liles | 4f472c2a8e | |
Jonathan Moore Liles | f3b66982b7 | |
Jonathan Moore Liles | e0e593277f | |
Jonathan Moore Liles | d295593e55 | |
Jonathan Moore Liles | 0e5db66f16 | |
Jonathan Moore Liles | 7495731df6 | |
Jonathan Moore Liles | a320232b66 | |
Jonathan Moore Liles | 46bb1bf702 | |
Jonathan Moore Liles | 8e01aec002 | |
Jonathan Moore Liles | a93f620eb0 | |
Jonathan Moore Liles | ba45c07b04 | |
Jonathan Moore Liles | 60de871511 | |
Jonathan Moore Liles | 15cdc92125 | |
Jonathan Moore Liles | 82b2c5e565 | |
Jonathan Moore Liles | 1baaed2e5d | |
Jonathan Moore Liles | 6d938e77a2 | |
Jonathan Moore Liles | 3ac28ce0de | |
Jonathan Moore Liles | f1dc015b08 | |
Jonathan Moore Liles | d733de358e | |
Jonathan Moore Liles | f8221f51e8 | |
Jonathan Moore Liles | 20fcfe436f | |
Jonathan Moore Liles | 877d08759d | |
Jonathan Moore Liles | ca56b8c337 | |
Jonathan Moore Liles | 9974e9bb47 | |
Jonathan Moore Liles | 71e0583696 | |
Jonathan Moore Liles | 0d62b91605 | |
Jonathan Moore Liles | 0f19bf3c6b | |
Jonathan Moore Liles | 17e32e0282 | |
Jonathan Moore Liles | 802f4c572f | |
Jonathan Moore Liles | 6566626c7f | |
Jonathan Moore Liles | 8ac4b60928 | |
Jonathan Moore Liles | e98326103e | |
Jonathan Moore Liles | e9aca6809e | |
Jonathan Moore Liles | c91f950612 | |
Jonathan Moore Liles | 0e946a9f73 | |
Jonathan Moore Liles | 614fea7343 | |
Jonathan Moore Liles | 6ce2d2051c | |
Jonathan Moore Liles | aa6c6388d5 | |
Jonathan Moore Liles | 0631949d8a | |
Jonathan Moore Liles | a84e6b8aca | |
Robert Wruck | 6a09ce1c9c | |
Robert Wruck | c7a54f2c4d | |
Jonathan Moore Liles | ba94d2c354 | |
Jonathan Moore Liles | b1d349532a | |
Jonathan Moore Liles | 5e78c98cae | |
Jonathan Moore Liles | d156972be6 | |
Jonathan Moore Liles | 32e801f268 | |
Jonathan Moore Liles | ab3f1037ef | |
Jonathan Moore Liles | 211e45bc1b | |
Juuso Alasuutari | e1d13ce083 | |
Jonathan Moore Liles | 7d8423bbaf | |
Jonathan Moore Liles | 1d79326c1b | |
Jonathan Moore Liles | 9948b9e307 | |
Jonathan Moore Liles | 21a42171a4 | |
Jonathan Moore Liles | 7ce661c3a4 | |
Jonathan Moore Liles | dcb690d7e1 | |
Jonathan Moore Liles | d70dd3a517 | |
Jonathan Moore Liles | 81f504f88b | |
Jonathan Moore Liles | c71283fb85 | |
Jonathan Moore Liles | f440223d20 | |
Jonathan Moore Liles | 530960e14d | |
Jonathan Moore Liles | f7e6e50666 | |
Jonathan Moore Liles | 70a3049bca | |
Jonathan Moore Liles | 25842b89a7 | |
Jonathan Moore Liles | 148b313b31 | |
Jonathan Moore Liles | f3c9c99ceb | |
Jonathan Moore Liles | b5c1ebb200 | |
Jonathan Moore Liles | ba10714be3 | |
Jonathan Moore Liles | accd94a465 | |
Jonathan Moore Liles | 0367019e60 | |
Jonathan Moore Liles | de54a267f3 | |
Jonathan Moore Liles | cc96a2bb2b | |
Jonathan Moore Liles | 8ca002d200 | |
Jonathan Moore Liles | 3bbb91f5d1 | |
Jonathan Moore Liles | 2988781ec3 | |
Jonathan Moore Liles | 9cc59e10ed | |
Jonathan Moore Liles | d68f09691e | |
Jonathan Moore Liles | cdcd6516e7 | |
Jonathan Moore Liles | 19cc44ef07 | |
Jonathan Moore Liles | 1a400d076a | |
Jonathan Moore Liles | 60ae9ce8b7 | |
Jonathan Moore Liles | 767a845a28 | |
Jonathan Moore Liles | 7bf271c456 | |
Jonathan Moore Liles | e78b3f14e7 | |
Jonathan Moore Liles | 257aeb116d | |
Jonathan Moore Liles | a772347501 | |
Jonathan Moore Liles | 72ae9470d3 | |
Jonathan Moore Liles | 8ae4e4f40c | |
Jonathan Moore Liles | 4f186d9acb | |
Jonathan Moore Liles | 047a003df1 | |
Jonathan Moore Liles | dce2463cb8 | |
Jonathan Moore Liles | 98aab77917 | |
Jonathan Moore Liles | cfd27f88ed | |
Jonathan Moore Liles | c307a3443c | |
Jonathan Moore Liles | fbe232fcfb | |
Jonathan Moore Liles | cb5960d298 | |
Jonathan Moore Liles | 93f51f33ea | |
Jonathan Moore Liles | c9b604502c | |
Jonathan Moore Liles | 7e22c27576 | |
Jonathan Moore Liles | a8cdb739e1 | |
Jonathan Moore Liles | 529a003fe3 | |
Jonathan Moore Liles | eca26e797c | |
Jonathan Moore Liles | c5ff8f6159 | |
Jonathan Moore Liles | 72ba000470 | |
Jonathan Moore Liles | bbd49089a1 | |
Jonathan Moore Liles | 7421e646df | |
Jonathan Moore Liles | 6765c3faea | |
Jonathan Moore Liles | 5cb724cecc | |
Jonathan Moore Liles | 4515a3d9a4 | |
Jonathan Moore Liles | db1b2f63e7 | |
Jonathan Moore Liles | d8fe1ad003 | |
Jonathan Moore Liles | 5f8d98cb92 | |
Jonathan Moore Liles | 3713bf9629 | |
Jonathan Moore Liles | 9d0689a8fa | |
Jonathan Moore Liles | 3ab70175da | |
Jonathan Moore Liles | 90e0853e91 | |
Jonathan Moore Liles | 0b2b55281f | |
Jonathan Moore Liles | 742679c5ad | |
Jonathan Moore Liles | 9bebbffd46 | |
Jonathan Moore Liles | 9f151de3e1 | |
Jonathan Moore Liles | bc64b35d2a | |
Jonathan Moore Liles | 7b75e2b425 | |
Jonathan Moore Liles | 81fe5efb53 | |
Jonathan Moore Liles | 0953207188 | |
Jonathan Moore Liles | 41eb6f4d7a | |
Jonathan Moore Liles | 65df570a30 | |
Jonathan Moore Liles | 5ceed377fb | |
Jonathan Moore Liles | d301578e54 | |
Jonathan Moore Liles | bb014f4a09 | |
Jonathan Moore Liles | a71ba1cbba | |
Jonathan Moore Liles | 39423ef8de | |
Jonathan Moore Liles | 70d576a6e4 | |
Jonathan Moore Liles | 6447678a08 | |
Jonathan Moore Liles | 58c2dad706 | |
Jonathan Moore Liles | fe8fab22df | |
Jonathan Moore Liles | e3a3d71404 | |
Jonathan Moore Liles | dfa3722ed0 | |
Jonathan Moore Liles | 835bbed0f8 | |
Jonathan Moore Liles | 846413fee8 | |
Jonathan Moore Liles | 00354529c7 | |
Jonathan Moore Liles | c0c7f71830 | |
Jonathan Moore Liles | 83e2cc45ad | |
Jonathan Moore Liles | 3607fb5693 | |
Jonathan Moore Liles | 42f7242ba5 | |
Jonathan Moore Liles | 0af405908d | |
Jonathan Moore Liles | 8f3f02d9aa |
|
@ -4,6 +4,6 @@
|
|||
*.[ao]
|
||||
TAGS
|
||||
.nfs*
|
||||
make.conf
|
||||
.deps
|
||||
misc/
|
||||
.waf*
|
||||
build
|
||||
attic
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
[submodule "lib/ntk"]
|
||||
path = lib/ntk
|
||||
url = git://git.tuxfamily.org/gitroot/non/fltk.git
|
41
COPYING
|
@ -1,12 +1,12 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
|
@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
|
|||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
|
@ -55,8 +55,8 @@ patent must be licensed for everyone's free use or not licensed at all.
|
|||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
|
@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
|
|||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
|
@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
|
|||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
|
@ -225,7 +225,7 @@ impose that choice.
|
|||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
|
@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
|
|||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
|
@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
|
@ -303,17 +303,16 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
|
|||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
|
|
|
@ -13,23 +13,16 @@ decl {\#include <FL/filename.H>} {private local
|
|||
|
||||
Function {open_url( const char *url )} {open return_type void
|
||||
} {
|
||||
code {\#if ! ( FL_MAJOR_VERSION >= 1 && FL_MINOR_VERSION >= 1 && FL_PATCH_VERSION >= 8 )
|
||||
|
||||
// FIXME: got a better idea?
|
||||
char cmd[256];
|
||||
snprintf( cmd, sizeof( cmd ), "x-www-browser '%s' &", url );
|
||||
system( cmd );
|
||||
\#else
|
||||
fl_open_uri( url );
|
||||
\#endif} {}
|
||||
code {fl_open_uri( url );} {}
|
||||
}
|
||||
|
||||
class About_Dialog {open
|
||||
} {
|
||||
Function {About_Dialog( const char *logo_filename )} {} {
|
||||
Function {About_Dialog( const char *logo_filename )} {open
|
||||
} {
|
||||
code {make_window( logo_filename );} {}
|
||||
}
|
||||
Function {run()} {return_type void
|
||||
Function {run()} {open return_type void
|
||||
} {
|
||||
code {window->show();
|
||||
|
||||
|
@ -48,8 +41,9 @@ if ( logo_box->image() )
|
|||
{
|
||||
((Fl_Shared_Image*)logo_box->image())->release();
|
||||
logo_box->image( 0 );
|
||||
}} open
|
||||
private xywh {1183 305 560 695} type Double xclass {Non-DAW} visible
|
||||
}} open selected
|
||||
private xywh {879 215 560 695} type Double
|
||||
visible
|
||||
} {
|
||||
Fl_Tabs {} {open
|
||||
xywh {0 352 558 296}
|
||||
|
@ -59,14 +53,7 @@ if ( logo_box->image() )
|
|||
xywh {2 386 553 261}
|
||||
} {
|
||||
Fl_Box credits {
|
||||
label {Non-DAW was written from scratch by
|
||||
Jonathan Moore Liles for his own use
|
||||
(see the manual).
|
||||
|
||||
Nobody planned. Nobody helped.
|
||||
You can help now by donating time, money,
|
||||
and/or replacing the rest of Linux Audio
|
||||
with fast, light, reliable alternatives.}
|
||||
label {}
|
||||
xywh {5 389 545 249} box ROUNDED_BOX color 46 labelsize 18
|
||||
}
|
||||
}
|
||||
|
@ -89,7 +76,7 @@ You should have received a copy of the GNU General Public License along with thi
|
|||
}
|
||||
}
|
||||
Fl_Box logo_box {
|
||||
label VERSION selected
|
||||
label VERSION
|
||||
xywh {5 5 550 305} color 48 labelfont 1 labelsize 18 align 16
|
||||
code0 {o->image( Fl_Shared_Image::get( logo_filename ) );}
|
||||
code1 {o->label( VERSION );}
|
||||
|
|
|
@ -1,385 +0,0 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2008 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wchar-subscripts"
|
||||
|
||||
|
||||
#include "Crystal_Boxtypes.H"
|
||||
#include <FL/fl_draw.H>
|
||||
#include <string.h>
|
||||
|
||||
/* Crystal boxes, base (obviously) on the FLTK1 'plastic' boxes, but
|
||||
* without the rude color blending and with a slightly enhanced
|
||||
* appearance. */
|
||||
|
||||
extern uchar *fl_gray_ramp();
|
||||
|
||||
inline Fl_Color
|
||||
shade_color ( uchar gc, Fl_Color bc )
|
||||
{
|
||||
return fl_color_average( ( Fl_Color ) gc, bc, 0.25f );
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
frame_rect ( int x, int y, int w, int h, const char *c, Fl_Color bc )
|
||||
{
|
||||
uchar *g = fl_gray_ramp();
|
||||
int b = strlen( c ) / 4 + 1;
|
||||
|
||||
for ( x += b, y += b, w -= 2 * b, h -= 2 * b; b > 1; b-- )
|
||||
{
|
||||
// Draw lines around the perimeter of the button, 4 colors per
|
||||
// circuit.
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_line( x, y + h + b, x + w - 1, y + h + b, x + w + b - 1, y + h );
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_line( x + w + b - 1, y + h, x + w + b - 1, y, x + w - 1, y - b );
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_line( x + w - 1, y - b, x, y - b, x - b, y );
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_line( x - b, y, x - b, y + h, x, y + h + b );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
frame_round ( int x, int y, int w, int h, const char *c, Fl_Color bc )
|
||||
{
|
||||
uchar *g = fl_gray_ramp();
|
||||
int b = strlen( c ) / 4 + 1;
|
||||
|
||||
if ( ! Fl::draw_box_active() )
|
||||
bc = fl_inactive( bc );
|
||||
|
||||
if ( w == h )
|
||||
{
|
||||
for ( ; b > 1; b--, x++, y++, w -= 2, h -= 2 )
|
||||
{
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_arc( x, y, w, h, 45.0, 135.0 );
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_arc( x, y, w, h, 315.0, 405.0 );
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_arc( x, y, w, h, 225.0, 315.0 );
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_arc( x, y, w, h, 135.0, 225.0 );
|
||||
}
|
||||
}
|
||||
else if ( w > h )
|
||||
{
|
||||
int d = h / 2;
|
||||
for ( ; b > 1; d--, b--, x++, y++, w -= 2, h -= 2 )
|
||||
{
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_arc( x, y, h, h, 90.0, 135.0 );
|
||||
fl_xyline( x + d, y, x + w - d );
|
||||
fl_arc( x + w - h, y, h, h, 45.0, 90.0 );
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_arc( x + w - h, y, h, h, 315.0, 405.0 );
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_arc( x + w - h, y, h, h, 270.0, 315.0 );
|
||||
fl_xyline( x + d, y + h - 1, x + w - d );
|
||||
fl_arc( x, y, h, h, 225.0, 270.0 );
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_arc( x, y, h, h, 135.0, 225.0 );
|
||||
}
|
||||
}
|
||||
else if ( w < h )
|
||||
{
|
||||
int d = w / 2;
|
||||
for ( ; b > 1; d--, b--, x++, y++, w -= 2, h -= 2 )
|
||||
{
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_arc( x, y, w, w, 45.0, 135.0 );
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_arc( x, y, w, w, 0.0, 45.0 );
|
||||
fl_yxline( x + w - 1, y + d, y + h - d );
|
||||
fl_arc( x, y + h - w, w, w, 315.0, 360.0 );
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_arc( x, y + h - w, w, w, 225.0, 315.0 );
|
||||
fl_color( shade_color( g[*c++], bc ) );
|
||||
fl_arc( x, y + h - w, w, w, 180.0, 225.0 );
|
||||
fl_yxline( x, y + d, y + h - d );
|
||||
fl_arc( x, y, w, w, 135.0, 180.0 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
shade_rect ( int x, int y, int w, int h, const char *c, Fl_Color bc )
|
||||
{
|
||||
uchar *g = fl_gray_ramp();
|
||||
int i, j;
|
||||
int clen = strlen( c ) - 1;
|
||||
int chalf = clen / 2;
|
||||
int cstep = 1;
|
||||
|
||||
if ( ! Fl::draw_box_active() )
|
||||
bc = fl_inactive( bc );
|
||||
|
||||
if ( h < ( w * 2 ) )
|
||||
{
|
||||
// Horizontal shading...
|
||||
if ( clen >= h )
|
||||
cstep = 2;
|
||||
|
||||
for ( i = 0, j = 0; j < chalf; i++, j += cstep )
|
||||
{
|
||||
// Draw the top line and points...
|
||||
fl_color( shade_color( g[c[i]], bc ) );
|
||||
fl_xyline( x + 1, y + i, x + w - 2 );
|
||||
|
||||
fl_color( shade_color( g[c[i] - 2], bc ) );
|
||||
fl_point( x, y + i + 1 );
|
||||
fl_point( x + w - 1, y + i + 1 );
|
||||
|
||||
// Draw the bottom line and points...
|
||||
fl_color( shade_color( g[c[clen - i]], bc ) );
|
||||
fl_xyline( x + 1, y + h - i, x + w - 2 );
|
||||
|
||||
fl_color( shade_color( g[c[clen - i] - 2], bc ) );
|
||||
fl_point( x, y + h - i );
|
||||
fl_point( x + w - 1, y + h - i );
|
||||
}
|
||||
|
||||
// Draw the interior and sides...
|
||||
i = chalf / cstep;
|
||||
|
||||
// fl_color( shade_color( g[c[chalf]], bc ) );
|
||||
fl_color( bc );
|
||||
fl_rectf( x + 1, y + i, w - 2, h - 2 * i + 1 );
|
||||
|
||||
fl_color( shade_color( g[c[chalf] - 2], bc ) );
|
||||
fl_yxline( x, y + i, y + h - i );
|
||||
fl_yxline( x + w - 1, y + i, y + h - i );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Vertical shading...
|
||||
if ( clen >= w )
|
||||
cstep = 2;
|
||||
|
||||
for ( i = 0, j = 0; j < chalf; i++, j += cstep )
|
||||
{
|
||||
// Draw the left line and points...
|
||||
fl_color( shade_color( g[c[i]], bc ) );
|
||||
fl_yxline( x + i, y + 1, y + h - 1 );
|
||||
|
||||
fl_color( shade_color( g[c[i] - 2], bc ) );
|
||||
fl_point( x + i + 1, y );
|
||||
fl_point( x + i + 1, y + h );
|
||||
|
||||
// Draw the right line and points...
|
||||
fl_color( shade_color( g[c[clen - i]], bc ) );
|
||||
fl_yxline( x + w - 1 - i, y + 1, y + h - 1 );
|
||||
|
||||
fl_color( shade_color( g[c[clen - i] - 2], bc ) );
|
||||
fl_point( x + w - 2 - i, y );
|
||||
fl_point( x + w - 2 - i, y + h );
|
||||
}
|
||||
|
||||
// Draw the interior, top, and bottom...
|
||||
i = chalf / cstep;
|
||||
|
||||
fl_color( shade_color( g[c[chalf]], bc ) );
|
||||
fl_rectf( x + i, y + 1, w - 2 * i, h - 1 );
|
||||
|
||||
fl_color( shade_color( g[c[chalf] - 2], bc ) );
|
||||
fl_xyline( x + i, y, x + w - i );
|
||||
fl_xyline( x + i, y + h, x + w - i );
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
shade_round ( int x, int y, int w, int h, const char *c, Fl_Color bc )
|
||||
{
|
||||
uchar *g = fl_gray_ramp();
|
||||
int i;
|
||||
int clen = strlen( c ) - 1;
|
||||
int chalf = clen / 2;
|
||||
|
||||
if ( w > h )
|
||||
{
|
||||
int d = h / 2;
|
||||
const int na = 8;
|
||||
for ( i = 0; i < chalf; i++, d--, x++, y++, w -= 2, h -= 2 )
|
||||
{
|
||||
fl_color( shade_color( g[c[i]], bc ) );
|
||||
fl_pie( x, y, h, h, 90.0, 135.0 + i * na );
|
||||
fl_xyline( x + d, y, x + w - d );
|
||||
fl_pie( x + w - h, y, h, h, 45.0 + i * na, 90.0 );
|
||||
fl_color( shade_color( g[c[i] - 2], bc ) );
|
||||
fl_pie( x + w - h, y, h, h, 315.0 + i * na, 405.0 + i * na );
|
||||
fl_color( shade_color( g[c[clen - i]], bc ) );
|
||||
fl_pie( x + w - h, y, h, h, 270.0, 315.0 + i * na );
|
||||
fl_xyline( x + d, y + h - 1, x + w - d );
|
||||
fl_pie( x, y, h, h, 225.0 + i * na, 270.0 );
|
||||
fl_color( shade_color( g[c[clen - i] - 2], bc ) );
|
||||
fl_pie( x, y, h, h, 135.0 + i * na, 225.0 + i * na );
|
||||
|
||||
|
||||
}
|
||||
// fl_color( shade_color( g[c[chalf]], bc ) );
|
||||
fl_color( bc );
|
||||
fl_rectf( x + d, y, w - h + 1, h + 1 );
|
||||
fl_pie( x, y, h, h, 90.0, 270.0 );
|
||||
fl_pie( x + w - h, y, h, h, 270.0, 90.0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
int d = w / 2;
|
||||
const int na = 8;
|
||||
for ( i = 0; i < chalf; i++, d--, x++, y++, w -= 2, h -= 2 )
|
||||
{
|
||||
fl_color( shade_color( g[c[i]], bc ) );
|
||||
fl_pie( x, y, w, w, 45.0 + i * na, 135.0 + i * na );
|
||||
fl_color( shade_color( g[c[i] - 2], bc ) );
|
||||
fl_pie( x, y, w, w, 0.0, 45.0 + i * na );
|
||||
fl_yxline( x + w - 1, y + d, y + h - d );
|
||||
fl_pie( x, y + h - w, w, w, 315.0 + i * na, 360.0 );
|
||||
fl_color( shade_color( g[c[clen - i]], bc ) );
|
||||
fl_pie( x, y + h - w, w, w, 225.0 + i * na, 315.0 + i * na );
|
||||
fl_color( shade_color( g[c[clen - i] - 2], bc ) );
|
||||
fl_pie( x, y + h - w, w, w, 180.0, 225.0 + i * na );
|
||||
fl_yxline( x, y + d, y + h - d );
|
||||
fl_pie( x, y, w, w, 135.0 + i * na, 180.0 );
|
||||
}
|
||||
// fl_color( shade_color( g[c[chalf]], bc ) );
|
||||
fl_color( bc );
|
||||
fl_rectf( x, y + d, w + 1, h - w + 1 );
|
||||
fl_pie( x, y, w, w, 0.0, 180.0 );
|
||||
fl_pie( x, y + h - w, w, w, 180.0, 360.0 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
up_frame ( int x, int y, int w, int h, Fl_Color c )
|
||||
{
|
||||
frame_rect( x, y, w, h - 1, "KLDIIJLM", c );
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
narrow_thin_box ( int x, int y, int w, int h, Fl_Color c )
|
||||
{
|
||||
if ( h <= 0 || w <= 0 )
|
||||
return;
|
||||
uchar *g = fl_gray_ramp();
|
||||
fl_color( shade_color( g['R'], c ) );
|
||||
fl_rectf( x + 1, y + 1, w - 2, h - 2 );
|
||||
fl_color( shade_color( g['I'], c ) );
|
||||
if ( w > 1 )
|
||||
{
|
||||
fl_xyline( x + 1, y, x + w - 2 );
|
||||
fl_xyline( x + 1, y + h - 1, x + w - 2 );
|
||||
}
|
||||
if ( h > 1 )
|
||||
{
|
||||
fl_yxline( x, y + 1, y + h - 2 );
|
||||
fl_yxline( x + w - 1, y + 1, y + h - 2 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
thin_up_box ( int x, int y, int w, int h, Fl_Color c )
|
||||
{
|
||||
if ( w > 4 && h > 4 )
|
||||
{
|
||||
shade_rect( x + 1, y + 1, w - 2, h - 3, "RQOQSUWQ", c );
|
||||
frame_rect( x, y, w, h - 1, "IJLM", c );
|
||||
}
|
||||
else
|
||||
narrow_thin_box( x, y, w, h, c );
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
up_box ( int x, int y, int w, int h, Fl_Color c )
|
||||
{
|
||||
if ( w > 8 && h > 8 )
|
||||
{
|
||||
shade_rect( x + 1, y + 1, w - 2, h - 3, "RVQNOPQRSTUVWVQ", c );
|
||||
// shade_rect( x + 1, y + 1, w - 2, h - 3, "STUVWVQRWXVUVVQ", c );
|
||||
// shade_rect( x + 1, y + 1, w - 2, h - 3, "FISPPQQRSSTTUPJ", c );
|
||||
|
||||
frame_rect( x, y, w, h - 1, "IJLM", c );
|
||||
|
||||
}
|
||||
else
|
||||
thin_up_box( x, y, w, h, c );
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
up_round ( int x, int y, int w, int h, Fl_Color c )
|
||||
{
|
||||
shade_round( x, y, w, h, "RVQNOPQRSTUVWVQ", c );
|
||||
frame_round( x, y, w, h, "IJLM", c );
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
down_frame ( int x, int y, int w, int h, Fl_Color c )
|
||||
{
|
||||
frame_rect( x, y, w, h - 1, "LLLLTTRR", c );
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
down_box ( int x, int y, int w, int h, Fl_Color c )
|
||||
{
|
||||
if ( w > 6 && h > 6 )
|
||||
{
|
||||
// shade_rect( x + 2, y + 2, w - 4, h - 5, "STUVWWWVT", c );
|
||||
fl_rectf( x + 2, y + 2, w - 4, h - 5 , fl_darker( c ) );
|
||||
down_frame( x, y, w, h, c );
|
||||
}
|
||||
else
|
||||
{
|
||||
narrow_thin_box( x, y, w, h, c );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
down_round ( int x, int y, int w, int h, Fl_Color c )
|
||||
{
|
||||
shade_round( x, y, w, h, "STUVWWWVT", c );
|
||||
frame_round( x, y, w, h, "IJLM", c );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
init_crystal_boxtypes ( void )
|
||||
{
|
||||
/* replace the plastic boxes... (is there a better way?) */
|
||||
Fl::set_boxtype( FL_PLASTIC_UP_BOX, up_box, 4,4,8,8 );
|
||||
Fl::set_boxtype( FL_PLASTIC_DOWN_BOX, down_box, 2,2,4,4 );
|
||||
Fl::set_boxtype( FL_PLASTIC_UP_FRAME, up_frame, 2,2,4,4 );
|
||||
Fl::set_boxtype( FL_PLASTIC_DOWN_FRAME, down_frame, 2,2,4,4 );
|
||||
Fl::set_boxtype( FL_PLASTIC_THIN_UP_BOX, thin_up_box, 1,1,2,2 );
|
||||
Fl::set_boxtype( FL_PLASTIC_THIN_DOWN_BOX, down_box, 1,1,2,2 );
|
||||
Fl::set_boxtype( FL_PLASTIC_ROUND_UP_BOX, up_round, 1,1,2,2 );
|
||||
Fl::set_boxtype( FL_PLASTIC_ROUND_DOWN_BOX, down_round, 1,1,2,2 );
|
||||
}
|
332
FL/Fl_Arc_Dial.C
|
@ -1,332 +0,0 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2008 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
|
||||
#include "Fl_Arc_Dial.H"
|
||||
|
||||
#include <FL/fl_draw.H>
|
||||
#include <FL/Fl.H>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
#include <algorithm>
|
||||
|
||||
int Fl_Arc_Dial::_default_style = Fl_Arc_Dial::PLASTIC_DIAL;
|
||||
|
||||
/** This simple box is suitable for use with knob-type widgets. It
|
||||
* comprises a border with shadow, and a cap with glare-lines akin
|
||||
* to those seen on burnished aluminum knobs. */
|
||||
static void
|
||||
burnished_oval_box ( int x, int y, int w, int h, Fl_Color c )
|
||||
{
|
||||
/* draw background */
|
||||
fl_color( fl_darker( c ) );
|
||||
fl_pie( x, y, w, h, 0, 360 );
|
||||
fl_color( fl_darker( fl_darker( c ) ) );
|
||||
fl_pie( x, y, w, h, 180 + 215, 180 + 45 );
|
||||
|
||||
/* shrink */
|
||||
x += 4;
|
||||
y += 4;
|
||||
w -= 7;
|
||||
h -= 7;
|
||||
|
||||
/* draw cap */
|
||||
fl_color( c );
|
||||
fl_pie( x, y, w, h, 0, 360 );
|
||||
|
||||
/* draw glare */
|
||||
|
||||
const int a1 = 10;
|
||||
const int a2 = 90;
|
||||
|
||||
fl_color( fl_color_average( FL_WHITE, c, 0.15f ) );
|
||||
fl_pie( x, y, w, h, a1, a2 );
|
||||
fl_pie( x, y, w, h, 180 + a1, 180 + a2 );
|
||||
fl_color( fl_color_average( FL_WHITE, c, 0.25f ) );
|
||||
|
||||
const int d = (a2 - a1) / 2;
|
||||
fl_pie( x, y, w, h, a1 + (d / 2), a2 - (d / 2) );
|
||||
fl_pie( x, y, w, h, 180 + a1 + (d / 2), 180 + a2 - (d / 2) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void
|
||||
Fl_Arc_Dial::draw_box ( void )
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
Fl_Arc_Dial::handle ( int m )
|
||||
{
|
||||
/* Fl_Dial and friends should really handle mousewheel, but they don't in FTLK1 */
|
||||
|
||||
switch ( m )
|
||||
{
|
||||
case FL_MOUSEWHEEL:
|
||||
{
|
||||
if ( this != Fl::belowmouse() )
|
||||
return 0;
|
||||
|
||||
int steps = 16;
|
||||
|
||||
if ( Fl::event_ctrl() )
|
||||
steps = 128;
|
||||
|
||||
float step = fabs( maximum() - minimum() ) / (float)steps;
|
||||
|
||||
float d = ((float)Fl::event_dy()) * step;
|
||||
|
||||
double v = value() + d;
|
||||
|
||||
if ( maximum() > minimum() )
|
||||
{
|
||||
if ( v < minimum() )
|
||||
v = minimum();
|
||||
else if ( v > maximum() )
|
||||
v = maximum();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( v > minimum() )
|
||||
v = minimum();
|
||||
else if ( v < maximum() )
|
||||
v = maximum();
|
||||
}
|
||||
|
||||
value( v );
|
||||
do_callback();
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
int X, Y, S;
|
||||
|
||||
get_knob_dimensions ( &X, &Y, &S );
|
||||
|
||||
return Fl_Dial::handle( m, X, Y, S, S );
|
||||
}
|
||||
|
||||
void
|
||||
Fl_Arc_Dial::draw ( void )
|
||||
{
|
||||
int X, Y, S;
|
||||
|
||||
get_knob_dimensions ( &X, &Y, &S);
|
||||
|
||||
draw_box();
|
||||
draw_label();
|
||||
|
||||
double angle = ( angle2() - angle1() ) * ( value() - minimum()) / ( maximum() - minimum() ) + angle1();
|
||||
|
||||
if ( type() == ARC_DIAL )
|
||||
{
|
||||
/* fl_line_style( FL_SOLID, 0 ); */
|
||||
if ( type() == ARC_DIAL )
|
||||
fl_draw_box( FL_ROUNDED_BOX, X, Y, S, S, color() );
|
||||
|
||||
/* shrink a bit */
|
||||
X += S / 8.0;
|
||||
Y += S / 8.0;
|
||||
S -= S / 4;
|
||||
|
||||
fl_line_style( FL_SOLID, S / 6 );
|
||||
|
||||
/* background arc */
|
||||
fl_color( fl_darker( color() ) );
|
||||
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle2() );
|
||||
|
||||
/* foreground arc */
|
||||
fl_color( selection_color() );
|
||||
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle );
|
||||
|
||||
fl_line_style( FL_SOLID, 0 );
|
||||
|
||||
fl_color( fl_contrast( labelcolor(), color() ) );
|
||||
}
|
||||
else if ( type() == PLASTIC_DIAL || type() == BURNISHED_DIAL )
|
||||
{
|
||||
draw_knob();
|
||||
|
||||
draw_cursor( X, Y, S);
|
||||
}
|
||||
|
||||
/* Some strange bug in FLTK prevents us from always been able to draw text
|
||||
* here, so don't even try for now. */
|
||||
/* char s[10]; */
|
||||
|
||||
/* fl_font( FL_HELVETICA, 8 ); */
|
||||
|
||||
/* snprintf( s, sizeof( s ), "%.1f", value() ); */
|
||||
|
||||
/* /\* fl_rectf( X, Y + S, S, 14, FL_BACKGROUND2_COLOR ); *\/ */
|
||||
/* fl_color( FL_WHITE ); */
|
||||
/* fl_draw( s, X, Y + S, S, 14, FL_ALIGN_CENTER ); */
|
||||
}
|
||||
|
||||
void
|
||||
Fl_Arc_Dial::get_knob_dimensions ( int *X, int *Y, int *S )
|
||||
{
|
||||
int ox, oy, ww, hh, side;
|
||||
ox = x();
|
||||
oy = y();
|
||||
ww = w();
|
||||
hh = h();
|
||||
|
||||
if (ww > hh)
|
||||
{
|
||||
side = hh;
|
||||
ox = ox + (ww - side) / 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
side = ww;
|
||||
oy = oy + (hh - side) / 2;
|
||||
}
|
||||
side = w() > h() ? hh : ww;
|
||||
|
||||
*X = ox;
|
||||
*Y = oy;
|
||||
*S = side;
|
||||
}
|
||||
|
||||
void
|
||||
Fl_Arc_Dial::draw_cursor ( int ox, int oy, int side )
|
||||
{
|
||||
double angle;
|
||||
|
||||
// fl_color(fl_color_average(FL_BACKGROUND_COLOR, FL_BLACK, .7f));
|
||||
|
||||
angle = ( angle2() - angle1() ) * ( value() - minimum()) / ( maximum() - minimum() ) + angle1();
|
||||
|
||||
fl_color( fl_contrast( selection_color(), FL_BACKGROUND_COLOR ) );
|
||||
|
||||
fl_line_style( FL_SOLID, side / 8 );
|
||||
|
||||
const int d = 6;
|
||||
|
||||
/* account for edge conditions */
|
||||
angle = angle < angle1() + d ? angle1() + d : angle;
|
||||
angle = angle > angle2() - d ? angle2() - d : angle;
|
||||
|
||||
ox += side / 4;
|
||||
oy += side / 4;
|
||||
side -= side / 2;
|
||||
|
||||
fl_arc( ox, oy, side, side, 270 - (angle - d), 270 - (angle + d) );
|
||||
|
||||
fl_line_style( FL_SOLID, 0 );
|
||||
}
|
||||
|
||||
void
|
||||
Fl_Arc_Dial::draw_knob ( void )
|
||||
{
|
||||
int ox, oy, ww, hh, side;
|
||||
|
||||
get_knob_dimensions ( &ox, &oy, &side );
|
||||
|
||||
ww = w();
|
||||
hh = h();
|
||||
draw_label();
|
||||
fl_clip(ox, oy, ww, hh);
|
||||
|
||||
|
||||
// background
|
||||
/* fl_color(FL_BACKGROUND_COLOR); */
|
||||
/* fl_rectf(ox, oy, side, side); */
|
||||
|
||||
/* scale color */
|
||||
fl_color(fl_color_average(color(), FL_BACKGROUND2_COLOR, .6));
|
||||
|
||||
fl_pie(ox + 1, oy + 3, side - 2, side - 12, 0, 360);
|
||||
// scale
|
||||
draw_scale(ox, oy, side);
|
||||
|
||||
Fl_Color c = active_r() ? fl_color_average(FL_BACKGROUND_COLOR, FL_WHITE, .7) : FL_INACTIVE_COLOR;
|
||||
|
||||
if ( type() == BURNISHED_DIAL )
|
||||
{
|
||||
burnished_oval_box( ox + 5, oy + 5, side - 12, side - 12, c );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
fl_color(FL_BACKGROUND_COLOR);
|
||||
fl_pie(ox + 6, oy + 6, side - 12, side - 12, 0, 360);
|
||||
|
||||
// shadow
|
||||
|
||||
fl_color(fl_color_average(FL_BACKGROUND_COLOR, FL_BLACK, .8f));
|
||||
fl_pie(ox + 8, oy + 12, side - 16, side - 16, 0, 360);
|
||||
fl_color(fl_color_average(FL_BACKGROUND_COLOR, FL_BLACK, .2f));
|
||||
fl_pie(ox + 9, oy + 12, side - 18, side - 18, 0, 360);
|
||||
|
||||
// knob edge
|
||||
fl_color( c);
|
||||
|
||||
|
||||
fl_pie(ox + 8, oy + 8, side - 16, side - 16, 0, 360);
|
||||
|
||||
fl_color(fl_color_average(FL_BACKGROUND_COLOR, FL_WHITE, .6));
|
||||
fl_pie(ox + 10, oy + 10, side - 20, side - 20, 0, 360);
|
||||
|
||||
}
|
||||
fl_pop_clip();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Fl_Arc_Dial::draw_scale ( int ox, int oy, int side )
|
||||
{
|
||||
float x1, y1, x2, y2, rds, cx, cy, ca, sa;
|
||||
rds = side / 2;
|
||||
cx = ox + side / 2;
|
||||
cy = oy + side / 2;
|
||||
if (_scaleticks == 0)
|
||||
return;
|
||||
double a_step = (10.0 * 3.14159 / 6.0) / _scaleticks;
|
||||
double a_orig = -(3.14159 / 3.0);
|
||||
for (int a = 0; a <= _scaleticks; a++)
|
||||
{
|
||||
double na = a_orig + a * a_step;
|
||||
ca = cos(na);
|
||||
sa = sin(na);
|
||||
x1 = cx + (rds) * ca;
|
||||
y1 = cy - (rds) * sa;
|
||||
x2 = cx + (rds - 6) * ca;
|
||||
y2 = cy - (rds - 6) * sa;
|
||||
fl_color(FL_BACKGROUND_COLOR);
|
||||
fl_line(x1, y1, x2, y2);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Fl_Arc_Dial::scaleticks ( int tck )
|
||||
{
|
||||
_scaleticks = tck;
|
||||
if (_scaleticks < 0)
|
||||
_scaleticks = 0;
|
||||
if (_scaleticks > 31)
|
||||
_scaleticks = 31;
|
||||
if (visible())
|
||||
damage(FL_DAMAGE_ALL);
|
||||
}
|
|
@ -0,0 +1,162 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2008 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <FL/Fl_Button.H>
|
||||
#include <FL/Fl.H>
|
||||
|
||||
/* Kind of like Fl_Light_Button except that the whole thing is the
|
||||
* indicator and it can optionally blink */
|
||||
|
||||
class Fl_Blink_Button : public Fl_Button
|
||||
{
|
||||
bool _on;
|
||||
int _blink_interval;
|
||||
bool _blinking;
|
||||
bool _ignore_input;
|
||||
|
||||
static void
|
||||
update_cb ( void *v )
|
||||
{
|
||||
((Fl_Blink_Button*)v)->update_cb();
|
||||
}
|
||||
|
||||
|
||||
float
|
||||
blink_interval_as_fraction_of_seceond ( void ) const
|
||||
{
|
||||
return (float)_blink_interval / 1000;
|
||||
}
|
||||
|
||||
void
|
||||
update_cb ( void )
|
||||
{
|
||||
Fl::repeat_timeout( blink_interval_as_fraction_of_seceond(), update_cb, this );
|
||||
|
||||
_on = ! _on;
|
||||
|
||||
redraw();
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
enum
|
||||
{
|
||||
SLOW=500,
|
||||
MEDIUM=300,
|
||||
FAST=100,
|
||||
DEFAULT=500
|
||||
};
|
||||
|
||||
Fl_Blink_Button ( int X, int Y, int W, int H, const char *L=0 )
|
||||
: Fl_Button( X, Y, W, H, L )
|
||||
{
|
||||
_blinking = true;
|
||||
_on = false;
|
||||
_ignore_input = false;
|
||||
_blink_interval = DEFAULT;
|
||||
|
||||
type( FL_TOGGLE_BUTTON );
|
||||
}
|
||||
|
||||
virtual
|
||||
~Fl_Blink_Button ()
|
||||
{
|
||||
if ( value() )
|
||||
Fl::remove_timeout( update_cb, this );
|
||||
}
|
||||
|
||||
void ignore_input ( bool b )
|
||||
{
|
||||
_ignore_input = b;
|
||||
}
|
||||
|
||||
bool ignore_input ( void ) const
|
||||
{
|
||||
return _ignore_input;
|
||||
}
|
||||
|
||||
void blink ( bool b )
|
||||
{
|
||||
_blinking = b;
|
||||
if ( ! b )
|
||||
_on = true;
|
||||
}
|
||||
|
||||
bool blink ( void ) const
|
||||
{
|
||||
return _blinking;
|
||||
}
|
||||
|
||||
void
|
||||
blink_interval ( float v )
|
||||
{
|
||||
_blink_interval = v * 1000;
|
||||
if ( value() )
|
||||
{
|
||||
Fl::remove_timeout( update_cb, this );
|
||||
Fl::add_timeout( blink_interval_as_fraction_of_seceond(), update_cb, this );
|
||||
}
|
||||
}
|
||||
|
||||
virtual void value ( float v )
|
||||
{
|
||||
bool b = v;
|
||||
|
||||
if ( b != value() )
|
||||
{
|
||||
if ( b )
|
||||
{
|
||||
if ( _blinking )
|
||||
{
|
||||
/* just to be safe.. */
|
||||
Fl::remove_timeout( update_cb, this );
|
||||
Fl::add_timeout( blink_interval_as_fraction_of_seceond(), update_cb, this );
|
||||
}
|
||||
Fl_Button::value( b );
|
||||
redraw();
|
||||
}
|
||||
else
|
||||
{
|
||||
Fl_Button::value( b );
|
||||
Fl::remove_timeout( update_cb, this );
|
||||
redraw();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
virtual float value ( void ) { return (bool)Fl_Button::value(); }
|
||||
|
||||
virtual void
|
||||
draw ( void )
|
||||
{
|
||||
draw_box( value() ? box() : down_box(), x(), y(), w(), h(),
|
||||
( value() != 0 && _on ) ? selection_color() : color() );
|
||||
draw_label();
|
||||
}
|
||||
|
||||
virtual int handle ( int m )
|
||||
{
|
||||
if ( _ignore_input )
|
||||
return 0;
|
||||
else
|
||||
return Fl_Button::handle( m );
|
||||
}
|
||||
};
|
|
@ -0,0 +1,124 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2013 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#include "Fl_DialX.H"
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/fl_draw.H>
|
||||
|
||||
void
|
||||
Fl_DialX::draw ( void )
|
||||
{
|
||||
int X,Y,S;
|
||||
int act = active_r();
|
||||
|
||||
{
|
||||
int ox, oy, ww, hh, side;
|
||||
ox = x();
|
||||
oy = y();
|
||||
ww = w();
|
||||
hh = h();
|
||||
|
||||
if (ww > hh)
|
||||
{
|
||||
side = hh;
|
||||
ox = ox + (ww - side) / 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
side = ww;
|
||||
oy = oy + (hh - side) / 2;
|
||||
}
|
||||
side = w() > h() ? hh : ww;
|
||||
|
||||
X = ox;
|
||||
Y = oy;
|
||||
S = side;
|
||||
}
|
||||
|
||||
draw_box();
|
||||
draw_label();
|
||||
|
||||
double angle = ( angle2() - angle1() ) * ( value() - minimum()) / ( maximum() - minimum() ) + angle1();
|
||||
|
||||
fl_draw_box( box(), X, Y, S, S, color() );
|
||||
|
||||
/* shrink a bit */
|
||||
int OX = x();
|
||||
int OY = y();
|
||||
X += S / 8;
|
||||
Y += S / 8;
|
||||
int OS = S;
|
||||
S -= S / 4;
|
||||
|
||||
fl_line_style( FL_SOLID, S / 12 );
|
||||
|
||||
/* background arc */
|
||||
|
||||
Fl_Color c = fl_darker( color() );
|
||||
if ( !act )
|
||||
c = fl_inactive( c );
|
||||
|
||||
fl_color( c );
|
||||
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle2() );
|
||||
|
||||
/* foreground arc */
|
||||
c = selection_color();
|
||||
|
||||
if ( !act )
|
||||
c = fl_inactive( c );
|
||||
|
||||
fl_color(c);
|
||||
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle );
|
||||
|
||||
fl_line_style( FL_SOLID, 0 );
|
||||
|
||||
if ( act )
|
||||
{
|
||||
int W = OS;
|
||||
int H = OS;
|
||||
|
||||
fl_push_matrix();
|
||||
fl_translate(OX+W/2, OY+H/2);
|
||||
fl_scale(W, H);
|
||||
fl_rotate(310+angle);
|
||||
fl_color( fl_color_add_alpha( FL_WHITE, 127 ));
|
||||
fl_begin_polygon(); fl_circle(-0.26, 0.26, 0.12); fl_end_polygon();
|
||||
fl_color( FL_WHITE );
|
||||
fl_begin_polygon(); fl_circle(-0.26, 0.26, 0.06); fl_end_polygon();
|
||||
|
||||
fl_pop_matrix();
|
||||
}
|
||||
|
||||
fl_color( fl_contrast( labelcolor(), color() ) );
|
||||
|
||||
if ( Fl::belowmouse() == this )
|
||||
{
|
||||
char s[128];
|
||||
|
||||
fl_font( FL_HELVETICA, 9 );
|
||||
|
||||
char buf[128];
|
||||
format(buf);
|
||||
|
||||
snprintf( s, sizeof( s ), buf, value() );
|
||||
|
||||
fl_color( FL_FOREGROUND_COLOR );
|
||||
fl_draw( s, X, Y, S, S, FL_ALIGN_CENTER );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2013 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <FL/Fl_Dial.H>
|
||||
|
||||
class Fl_DialX : public Fl_Dial
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
Fl_DialX ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Dial(X,Y,W,H,L)
|
||||
{
|
||||
}
|
||||
|
||||
virtual void draw ( void );
|
||||
virtual ~Fl_DialX() { }
|
||||
};
|
||||
|
|
@ -41,7 +41,7 @@ public:
|
|||
Fl_Flip_Button ( int X, int Y, int W, int H, const char *L = 0 ) :
|
||||
Fl_Button( X, Y, W, H, 0 )
|
||||
{
|
||||
sscanf( L, "%a[^/]/%as", &_off, &_on );
|
||||
sscanf( L, "%m[^/]/%ms", &_off, &_on );
|
||||
|
||||
type( FL_TOGGLE_BUTTON );
|
||||
}
|
||||
|
|
163
FL/Fl_Flowpack.H
|
@ -20,13 +20,16 @@
|
|||
#pragma once
|
||||
|
||||
#include <FL/Fl_Group.H>
|
||||
#include <FL/Fl_Pack.H>
|
||||
|
||||
class Fl_Flowpack : public Fl_Group
|
||||
{
|
||||
int _hspacing;
|
||||
int _vspacing;
|
||||
int _max_width;
|
||||
bool _flow;
|
||||
bool _flowdown;
|
||||
int _initial_height;
|
||||
int _initial_width;
|
||||
|
||||
public:
|
||||
|
||||
|
@ -34,15 +37,17 @@ public:
|
|||
: Fl_Group( X, Y, W, H, L )
|
||||
{
|
||||
resizable( 0 );
|
||||
_max_width = _hspacing = _vspacing = 0;
|
||||
_hspacing = _vspacing = 0;
|
||||
_initial_width = W;
|
||||
_initial_height = H;
|
||||
_flow = true;
|
||||
_flowdown = false;
|
||||
}
|
||||
|
||||
virtual ~Fl_Flowpack ( )
|
||||
{
|
||||
}
|
||||
|
||||
int max_width ( void ) const { return _max_width; }
|
||||
|
||||
void vspacing ( int v ) { _vspacing = v; }
|
||||
int vspacing ( void ) const { return _vspacing; };
|
||||
|
@ -53,6 +58,9 @@ public:
|
|||
bool flow ( void ) const { return _flow; }
|
||||
void flow ( bool v ) { _flow = v; }
|
||||
|
||||
bool flowdown ( void ) const { return _flowdown; }
|
||||
void flowdown ( bool v ) { _flowdown = v; }
|
||||
|
||||
void
|
||||
add ( Fl_Widget *w )
|
||||
{
|
||||
|
@ -68,36 +76,55 @@ public:
|
|||
}
|
||||
|
||||
void
|
||||
resize ( int X, int Y, int W, int )
|
||||
resize ( int X, int Y, int W, int H )
|
||||
{
|
||||
Fl_Group::resize( X, Y, W, layout( W ) );
|
||||
_initial_width = W;
|
||||
_initial_height = H;
|
||||
|
||||
layout();
|
||||
|
||||
Fl_Group::resize( X, Y, w(), h() );
|
||||
}
|
||||
|
||||
void
|
||||
draw ( void )
|
||||
{
|
||||
dolayout();
|
||||
layout();
|
||||
Fl_Group::draw();
|
||||
}
|
||||
|
||||
void dolayout ( void )
|
||||
{
|
||||
int new_h = layout( w() );
|
||||
|
||||
if ( new_h != h() )
|
||||
size( w(), new_h );
|
||||
layout();
|
||||
}
|
||||
|
||||
int
|
||||
layout ( int W )
|
||||
void
|
||||
layout ( void )
|
||||
{
|
||||
resizable( 0 );
|
||||
|
||||
int W;
|
||||
int H;
|
||||
int X = 0;
|
||||
int Y = 0;
|
||||
int H = 0;
|
||||
int LW = 0;
|
||||
int LH = 0;
|
||||
int LX = 0;
|
||||
int LY = 0;
|
||||
int RH = 0;
|
||||
// int RY = 0;
|
||||
int CW = 0;
|
||||
|
||||
_max_width = 0;
|
||||
if ( _flow )
|
||||
{
|
||||
H = 0;
|
||||
W = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
H = _initial_height;
|
||||
W = _initial_width;
|
||||
}
|
||||
|
||||
for ( int i = 0; i < children(); ++i )
|
||||
{
|
||||
|
@ -105,28 +132,106 @@ public:
|
|||
|
||||
if ( ! o->visible() )
|
||||
continue;
|
||||
|
||||
H = o->h() > H ? o->h() : H;
|
||||
|
||||
if ( _flow && X + o->w() >= W )
|
||||
|
||||
if ( _flow )
|
||||
{
|
||||
if ( _flowdown )
|
||||
{
|
||||
if ( Y + o->h() <= _initial_height )
|
||||
{
|
||||
/* if it'll fit in this column, put it below the previous widget */
|
||||
X = LX;
|
||||
}
|
||||
else
|
||||
{
|
||||
Y = H;
|
||||
CW = 0;
|
||||
}
|
||||
|
||||
Y += H + _vspacing;
|
||||
H = o->h();
|
||||
X = 0;
|
||||
CW = o->w() > CW ? o->w() : CW;
|
||||
RH = Y + o->h() > RH ? Y + o->h() : RH;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( X + o->w() >= _initial_width )
|
||||
{
|
||||
/* maybe wrap to the next row */
|
||||
H += RH + _vspacing;
|
||||
// RY = Y;
|
||||
RH = 0;
|
||||
if ( X > W )
|
||||
W = X;
|
||||
|
||||
X = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* otherwise, put it in the next column */
|
||||
Y = H;
|
||||
|
||||
}
|
||||
|
||||
RH = o->h() > RH ? o->h() : RH;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/* avoid bothering the control with lots of resize() calls */
|
||||
if ( ! ( o->x() == x() + X &&
|
||||
o->y() == y() + Y ) )
|
||||
o->position( x() + X, y() + Y );
|
||||
LW = o->w();
|
||||
LH = o->h();
|
||||
|
||||
X += o->w() + _hspacing;
|
||||
LX = X;
|
||||
LY = Y;
|
||||
|
||||
if ( X > _max_width )
|
||||
_max_width = X;
|
||||
if ( _flow )
|
||||
{
|
||||
if ( _flowdown )
|
||||
{
|
||||
Y += LH + _vspacing;
|
||||
X += CW + _hspacing;
|
||||
}
|
||||
else
|
||||
{
|
||||
Y += RH + _vspacing;
|
||||
X += LW + _hspacing;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( type() == Fl_Pack::HORIZONTAL )
|
||||
{
|
||||
X += LW + _hspacing;
|
||||
LH = _initial_height;
|
||||
W = X;
|
||||
}
|
||||
else
|
||||
{
|
||||
Y += LH + _vspacing;
|
||||
LW = _initial_width;
|
||||
H = Y;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( ! ( o->x() == x() + LX &&
|
||||
o->y() == y() + LY &&
|
||||
o->w() == LW &&
|
||||
o->h() == LH ) )
|
||||
o->resize( x() + LX,
|
||||
y() + LY,
|
||||
LW,
|
||||
LH);
|
||||
}
|
||||
|
||||
return Y + H;
|
||||
if ( _flow )
|
||||
{
|
||||
H += RH;
|
||||
if ( X > W )
|
||||
W = X;
|
||||
|
||||
/* if ( _flowdown ) */
|
||||
/* H = _initial_height; */
|
||||
}
|
||||
|
||||
Fl_Group::resize( x(), y(), W, H );
|
||||
}
|
||||
};
|
||||
|
|
|
@ -49,18 +49,27 @@ public:
|
|||
measure_label( o, W, H );
|
||||
|
||||
// set size to contain widget
|
||||
size( W > o->w() ? W : o->w(), o->h() + H );
|
||||
if ( o->align() & ( FL_ALIGN_TOP | FL_ALIGN_BOTTOM ) )
|
||||
size( W > o->w() ? W : o->w(), o->h() + H );
|
||||
if ( o->align() & ( FL_ALIGN_LEFT | FL_ALIGN_RIGHT ) )
|
||||
size( o->w() + W, H > o->h() ? H : o->h() );
|
||||
|
||||
// center widget in group
|
||||
if ( o->align() & FL_ALIGN_TOP )
|
||||
o->position( x() + w() / 2 - (o->w() / 2 ), y() + H );
|
||||
else if ( o->align() & FL_ALIGN_BOTTOM )
|
||||
o->position( x() + w() / 2 - (o->w() / 2 ), y() );
|
||||
else if ( o->align() & FL_ALIGN_RIGHT )
|
||||
o->position( x(), y() );
|
||||
else if ( o->align() & FL_ALIGN_LEFT )
|
||||
o->position( x() + W, y() );
|
||||
else
|
||||
{
|
||||
/* TODO: other alignments */
|
||||
}
|
||||
|
||||
|
||||
resizable(o);
|
||||
init_sizes();
|
||||
}
|
||||
|
||||
virtual ~Fl_Labelpad_Group ( )
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
|
||||
class Fl_Packscroller : public Fl_Group
|
||||
{
|
||||
|
||||
int _increment;
|
||||
int _yposition;
|
||||
static const int sbh = 15; /* scroll button height */
|
||||
|
@ -43,7 +42,6 @@ public:
|
|||
{
|
||||
_increment = 30;
|
||||
_yposition = 0;
|
||||
|
||||
// color( FL_WHITE );
|
||||
}
|
||||
|
||||
|
@ -60,7 +58,8 @@ public:
|
|||
if ( Y > 0 )
|
||||
Y = 0;
|
||||
|
||||
const int H = h() - (sbh * 2);
|
||||
const int H = h();
|
||||
// - (sbh * 2);
|
||||
|
||||
Fl_Widget *o = child( 0 );
|
||||
|
||||
|
@ -89,88 +88,103 @@ public:
|
|||
void bbox ( int &X, int &Y, int &W, int &H )
|
||||
{
|
||||
X = x();
|
||||
Y = y() + sbh;
|
||||
Y = y() + ( sbh * top_sb_visible() );
|
||||
W = w();
|
||||
H = h() - (sbh * 2);
|
||||
H = h() - ( sbh * ( top_sb_visible() + bottom_sb_visible() ) );
|
||||
}
|
||||
|
||||
int top_sb_visible ( void )
|
||||
{
|
||||
return children() && child(0)->y() != y() ? 1 : 0;
|
||||
}
|
||||
|
||||
int bottom_sb_visible ( void )
|
||||
{
|
||||
if ( children() )
|
||||
{
|
||||
Fl_Widget *o = child( 0 );
|
||||
|
||||
if ( o->h() > h() && o->y() + o->h() != y() + h() )
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
virtual void
|
||||
draw ( void )
|
||||
{
|
||||
if ( damage() & FL_DAMAGE_ALL )
|
||||
{
|
||||
fl_rectf( x(), y(), w(), h(), color() );
|
||||
}
|
||||
|
||||
if ( ! children() )
|
||||
return;
|
||||
|
||||
if ( ! fl_not_clipped( x(), y(), w(), h() ) )
|
||||
return;
|
||||
|
||||
// draw_box();
|
||||
|
||||
Fl_Widget *o = child( 0 );
|
||||
|
||||
o->position( x(), y() + sbh + _yposition );
|
||||
|
||||
if ( damage() != FL_DAMAGE_CHILD )
|
||||
{
|
||||
fl_rectf( x(), y(), w(), h(), color() );
|
||||
|
||||
fl_font( FL_HELVETICA, 12 );
|
||||
|
||||
if ( o->y() != y() + sbh )
|
||||
{
|
||||
fl_draw_box( box(), x(), y(), w(), sbh, color() );
|
||||
fl_color( FL_BLACK );
|
||||
fl_draw( "@2<", x(), y(), w(), sbh, FL_ALIGN_CENTER );
|
||||
}
|
||||
|
||||
if ( o->h() > h() - (sbh * 2) && o->y() + o->h() != y() + h() - sbh )
|
||||
{
|
||||
fl_draw_box( box(), x(), y() + h() - sbh, w(), sbh, color() );
|
||||
fl_color( FL_BLACK );
|
||||
fl_draw( "@2>", x(), y() + h() - sbh, w(), sbh, FL_ALIGN_CENTER );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fl_push_clip( x(), y() + sbh, w(), h() - (sbh * 2 ) );
|
||||
o->position( x(), y() + _yposition );
|
||||
|
||||
const int top_sb = top_sb_visible();
|
||||
const int bottom_sb = bottom_sb_visible();
|
||||
|
||||
fl_push_clip( x(), y() + ( sbh * top_sb ), w(), h() - (sbh * (top_sb + bottom_sb) ));
|
||||
|
||||
draw_children();
|
||||
|
||||
fl_pop_clip();
|
||||
|
||||
fl_font( FL_HELVETICA, 12 );
|
||||
|
||||
if ( top_sb )
|
||||
{
|
||||
fl_draw_box( box(), x(), y(), w(), sbh, color() );
|
||||
fl_color( fl_contrast( FL_FOREGROUND_COLOR, color() ) );
|
||||
fl_draw( "@2<", x(), y(), w(), sbh, FL_ALIGN_CENTER );
|
||||
}
|
||||
|
||||
if ( bottom_sb )
|
||||
{
|
||||
fl_draw_box( box(), x(), y() + h() - sbh, w(), sbh, color() );
|
||||
fl_color( fl_contrast( FL_FOREGROUND_COLOR, color() ) );
|
||||
fl_draw( "@2>", x(), y() + h() - sbh, w(), sbh, FL_ALIGN_CENTER );
|
||||
}
|
||||
}
|
||||
|
||||
virtual int
|
||||
handle ( int m )
|
||||
{
|
||||
if ( Fl_Group::handle( m ) )
|
||||
return 1;
|
||||
|
||||
switch ( m )
|
||||
{
|
||||
case FL_PUSH:
|
||||
{
|
||||
if ( Fl::event_button1() )
|
||||
if ( top_sb_visible() &&
|
||||
Fl::event_inside( x(), y(), w(), sbh ) )
|
||||
{
|
||||
if ( Fl::event_inside( x(), y(), w(), sbh ) )
|
||||
{
|
||||
yposition( yposition() + ( h() / 4 ) );
|
||||
return 1;
|
||||
}
|
||||
else if ( Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) )
|
||||
{
|
||||
yposition( yposition() - (h() / 4 ) );
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
else if ( bottom_sb_visible() &&
|
||||
Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
case FL_RELEASE:
|
||||
{
|
||||
if ( top_sb_visible() &&
|
||||
Fl::event_inside( x(), y(), w(), sbh ) )
|
||||
{
|
||||
yposition( yposition() + ( h() / 4 ) );
|
||||
return 1;
|
||||
}
|
||||
else if ( bottom_sb_visible() &&
|
||||
Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) )
|
||||
{
|
||||
yposition( yposition() - (h() / 4 ) );
|
||||
return 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
case FL_ENTER:
|
||||
case FL_LEAVE:
|
||||
return 1;
|
||||
case FL_FOCUS:
|
||||
case FL_UNFOCUS:
|
||||
return 1;
|
||||
case FL_KEYBOARD:
|
||||
{
|
||||
if ( Fl::event_key() == FL_Up )
|
||||
|
@ -183,7 +197,7 @@ public:
|
|||
yposition( yposition() - (h() / 4 ) );
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
case FL_MOUSEWHEEL:
|
||||
{
|
||||
|
@ -193,6 +207,6 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
return Fl_Group::handle( m );
|
||||
}
|
||||
};
|
||||
|
|
|
@ -53,7 +53,24 @@ Fl_Scalepack::resize ( int X, int Y, int W, int H )
|
|||
{
|
||||
/* Fl_Group's resize will change our child widget sizes, which
|
||||
interferes with our own resizing method. */
|
||||
long dx = X - x();
|
||||
long dy = Y - y();
|
||||
|
||||
bool r = W != w() || H != h();
|
||||
|
||||
Fl_Widget::resize( X, Y, W, H );
|
||||
|
||||
Fl_Widget*const* a = array();
|
||||
|
||||
for (int i=children(); i--;)
|
||||
{
|
||||
Fl_Widget* o = *a++;
|
||||
|
||||
o->position( o->x() + dx, o->y() + dy );
|
||||
}
|
||||
|
||||
if ( r )
|
||||
redraw();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -72,10 +89,7 @@ Fl_Scalepack::draw ( void )
|
|||
|
||||
if ( damage() & FL_DAMAGE_ALL )
|
||||
{
|
||||
if ( box() == FL_NO_BOX )
|
||||
fl_rectf( x(), y(), w(), h(), FL_BACKGROUND_COLOR );
|
||||
else
|
||||
draw_box();
|
||||
draw_box();
|
||||
|
||||
draw_label();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,341 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2013 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#include "Fl_SliderX.H"
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/fl_draw.H>
|
||||
|
||||
#include <math.h>
|
||||
|
||||
void
|
||||
Fl_SliderX::draw ( int X, int Y, int W, int H)
|
||||
{
|
||||
slider_size( horizontal() ? H / (float)W : W / (float)H );
|
||||
|
||||
int act = active_r();
|
||||
|
||||
if (damage()&FL_DAMAGE_ALL) draw_box();
|
||||
|
||||
|
||||
int ww = (horizontal() ? W : H);
|
||||
int hh = (horizontal() ? H : W);
|
||||
int xx, S;
|
||||
|
||||
xx = slider_position( value(), ww );
|
||||
|
||||
S = (horizontal() ? H : W );
|
||||
|
||||
int xsl, ysl, wsl, hsl;
|
||||
if (horizontal()) {
|
||||
xsl = X+xx;
|
||||
wsl = S;
|
||||
ysl = Y + hh/2;
|
||||
hsl = hh/4;
|
||||
} else {
|
||||
ysl = Y+xx;
|
||||
hsl = S;
|
||||
xsl = X + hh/2;
|
||||
wsl = hh/4;
|
||||
}
|
||||
|
||||
{
|
||||
fl_push_clip(X, Y, W, H);
|
||||
draw_box();
|
||||
fl_pop_clip();
|
||||
}
|
||||
//draw_bg(X, Y, W, H);
|
||||
|
||||
fl_line_style( FL_SOLID, hh/6 );
|
||||
|
||||
Fl_Color c = fl_darker(color());
|
||||
|
||||
if ( !act )
|
||||
c = fl_inactive(c);
|
||||
|
||||
fl_color(c);
|
||||
|
||||
if ( horizontal() )
|
||||
fl_line ( X + S/2, Y + hh/2, X + W - S/2, Y + hh/2 );
|
||||
else
|
||||
fl_line ( X + hh/2, Y + S/2, X + hh/2, Y + H - S/2 );
|
||||
|
||||
c = selection_color();
|
||||
|
||||
if ( !act )
|
||||
c = fl_inactive(c);
|
||||
|
||||
fl_color( c );
|
||||
|
||||
if ( horizontal() )
|
||||
fl_line ( X + S/2, ysl, xsl + S/2, ysl );
|
||||
else
|
||||
fl_line ( X + S/2, Y + H - S/2, xsl, ysl + (S/2) );
|
||||
|
||||
fl_line_style( FL_SOLID, 0 );
|
||||
|
||||
if ( act )
|
||||
{
|
||||
fl_push_matrix();
|
||||
if ( horizontal() )
|
||||
fl_translate( xsl + (hh/2), ysl);
|
||||
else
|
||||
fl_translate( xsl, ysl + (hh/2) );
|
||||
|
||||
fl_color( fl_color_add_alpha( FL_WHITE, 127 ));
|
||||
fl_begin_polygon(); fl_circle(0.0,0.0, hh/3); fl_end_polygon();
|
||||
fl_color( FL_WHITE );
|
||||
fl_begin_polygon(); fl_circle(0.0,0.0, hh/6); fl_end_polygon();
|
||||
|
||||
fl_pop_matrix();
|
||||
}
|
||||
|
||||
draw_label(xsl, ysl, wsl, hsl);
|
||||
|
||||
if (Fl::focus() == this) {
|
||||
draw_focus();
|
||||
}
|
||||
|
||||
/* draw(x()+Fl::box_dx(box()), */
|
||||
/* y()+Fl::box_dy(box()), */
|
||||
/* w()-Fl::box_dw(box()), */
|
||||
/* h()-Fl::box_dh(box())); */
|
||||
|
||||
}
|
||||
|
||||
/** return a value between 0.0 and 1.0 which represents the current slider position. */
|
||||
int
|
||||
Fl_SliderX::slider_position ( double value, int w )
|
||||
{
|
||||
double A = minimum();
|
||||
double B = maximum();
|
||||
if (B == A) return 0;
|
||||
bool flip = B < A;
|
||||
if (flip) {A = B; B = minimum();}
|
||||
// if (!horizontal()) flip = !flip;
|
||||
// if both are negative, make the range positive:
|
||||
if (B <= 0) {flip = !flip; double t = A; A = -B; B = -t; value = -value;}
|
||||
double fraction;
|
||||
if (!log()) {
|
||||
// linear slider
|
||||
fraction = (value-A)/(B-A);
|
||||
} else if (A > 0) {
|
||||
// logatithmic slider
|
||||
if (value <= A) fraction = 0;
|
||||
else fraction = (::log(value)-::log(A))/(::log(B)-::log(A));
|
||||
} else if (A == 0) {
|
||||
// squared slider
|
||||
if (value <= 0) fraction = 0;
|
||||
else fraction = sqrt(value/B);
|
||||
} else {
|
||||
// squared signed slider
|
||||
if (value < 0) fraction = (1-sqrt(value/A))*.5;
|
||||
else fraction = (1+sqrt(value/B))*.5;
|
||||
}
|
||||
if (flip) fraction = 1-fraction;
|
||||
|
||||
w -= int(slider_size()*w+.5); if (w <= 0) return 0;
|
||||
if (fraction >= 1) return w;
|
||||
else if (fraction <= 0) return 0;
|
||||
else return int(fraction*w+.5);
|
||||
}
|
||||
|
||||
double
|
||||
Fl_SliderX::slider_value ( int X, int w )
|
||||
{
|
||||
w -= int(slider_size()*w+.5); if (w <= 0) return minimum();
|
||||
double A = minimum();
|
||||
double B = maximum();
|
||||
bool flip = B < A;
|
||||
if (flip) {A = B; B = minimum();}
|
||||
// if (!horizontal()) flip = !flip;
|
||||
if (flip) X = w-X;
|
||||
double fraction = double(X)/w;
|
||||
if (fraction <= 0) return A;
|
||||
if (fraction >= 1) return B;
|
||||
// if both are negative, make the range positive:
|
||||
flip = (B <= 0);
|
||||
if (flip) {double t = A; A = -B; B = -t; fraction = 1-fraction;}
|
||||
double value;
|
||||
double derivative;
|
||||
if (!log()) {
|
||||
// linear slider
|
||||
value = fraction*(B-A)+A;
|
||||
derivative = (B-A)/w;
|
||||
} else if (A > 0) {
|
||||
// log slider
|
||||
double d = (::log(B)-::log(A));
|
||||
value = exp(fraction*d+::log(A));
|
||||
derivative = value*d/w;
|
||||
} else if (A == 0) {
|
||||
// squared slider
|
||||
value = fraction*fraction*B;
|
||||
derivative = 2*fraction*B/w;
|
||||
} else {
|
||||
// squared signed slider
|
||||
fraction = 2*fraction - 1;
|
||||
if (fraction < 0) B = A;
|
||||
value = fraction*fraction*B;
|
||||
derivative = 4*fraction*B/w;
|
||||
}
|
||||
// find nicest multiple of 10,5, or 2 of step() that is close to 1 pixel:
|
||||
if (step() && derivative > step()) {
|
||||
double w = log10(derivative);
|
||||
double l = ceil(w);
|
||||
int num = 1;
|
||||
int i; for (i = 0; i < l; i++) num *= 10;
|
||||
int denom = 1;
|
||||
for (i = -1; i >= l; i--) denom *= 10;
|
||||
if (l-w > 0.69897) denom *= 5;
|
||||
else if (l-w > 0.30103) denom *= 2;
|
||||
value = floor(value*denom/num+.5)*num/denom;
|
||||
}
|
||||
if (flip) return -value;
|
||||
return value;
|
||||
|
||||
}
|
||||
|
||||
int Fl_SliderX::handle(int event, int X, int Y, int W, int H) {
|
||||
// Fl_Widget_Tracker wp(this);
|
||||
switch (event) {
|
||||
case FL_PUSH: {
|
||||
Fl_Widget_Tracker wp(this);
|
||||
if (!Fl::event_inside(X, Y, W, H)) return 0;
|
||||
handle_push();
|
||||
if (wp.deleted()) return 1; }
|
||||
// fall through ...
|
||||
case FL_DRAG: {
|
||||
|
||||
static int offcenter;
|
||||
|
||||
int ww = (horizontal() ? W : H);
|
||||
|
||||
if ( event == FL_PUSH )
|
||||
{
|
||||
int x = slider_position( value(), ww );
|
||||
|
||||
offcenter = (horizontal() ? (Fl::event_x()-X) - x : (Fl::event_y()-Y) - x );
|
||||
}
|
||||
|
||||
try_again:
|
||||
|
||||
int mx = (horizontal() ? Fl::event_x()-X : Fl::event_y()-Y) - offcenter;
|
||||
double v = slider_value( mx, ww );
|
||||
|
||||
if (event == FL_PUSH ) // && v == value()) {
|
||||
{
|
||||
int os = int(slider_size()*ww+0.5)/2;
|
||||
if ( abs( offcenter ) > os )
|
||||
{
|
||||
offcenter = os;
|
||||
event = FL_DRAG;
|
||||
goto try_again;
|
||||
}
|
||||
}
|
||||
|
||||
handle_drag(clamp(v));
|
||||
} return 1;
|
||||
case FL_RELEASE:
|
||||
handle_release();
|
||||
return 1;
|
||||
case FL_KEYBOARD:
|
||||
{ Fl_Widget_Tracker wp(this);
|
||||
switch (Fl::event_key()) {
|
||||
case FL_Up:
|
||||
if (horizontal()) return 0;
|
||||
handle_push();
|
||||
if (wp.deleted()) return 1;
|
||||
handle_drag(clamp(increment(value(),-1)));
|
||||
if (wp.deleted()) return 1;
|
||||
handle_release();
|
||||
return 1;
|
||||
case FL_Down:
|
||||
if (horizontal()) return 0;
|
||||
handle_push();
|
||||
if (wp.deleted()) return 1;
|
||||
handle_drag(clamp(increment(value(),1)));
|
||||
if (wp.deleted()) return 1;
|
||||
handle_release();
|
||||
return 1;
|
||||
case FL_Left:
|
||||
if (!horizontal()) return 0;
|
||||
handle_push();
|
||||
if (wp.deleted()) return 1;
|
||||
handle_drag(clamp(increment(value(),-1)));
|
||||
if (wp.deleted()) return 1;
|
||||
handle_release();
|
||||
return 1;
|
||||
case FL_Right:
|
||||
if (!horizontal()) return 0;
|
||||
handle_push();
|
||||
if (wp.deleted()) return 1;
|
||||
handle_drag(clamp(increment(value(),1)));
|
||||
if (wp.deleted()) return 1;
|
||||
handle_release();
|
||||
return 1;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
// break not required because of switch...
|
||||
case FL_FOCUS :
|
||||
case FL_UNFOCUS :
|
||||
if (Fl::visible_focus()) {
|
||||
redraw();
|
||||
return 1;
|
||||
} else return 0;
|
||||
case FL_ENTER :
|
||||
case FL_LEAVE :
|
||||
return 1;
|
||||
case FL_MOUSEWHEEL :
|
||||
{
|
||||
if ( this != Fl::belowmouse() )
|
||||
return 0;
|
||||
if (Fl::e_dy==0)
|
||||
return 0;
|
||||
|
||||
const int steps = Fl::event_ctrl() ? 128 : 16;
|
||||
|
||||
const float step = fabs( maximum() - minimum() ) / (float)steps;
|
||||
|
||||
int dy = Fl::e_dy;
|
||||
|
||||
/* slider is in 'upside down' configuration, invert meaning of mousewheel */
|
||||
if ( minimum() > maximum() )
|
||||
dy = 0 - dy;
|
||||
|
||||
handle_drag(clamp(value() + step * dy));
|
||||
return 1;
|
||||
}
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int Fl_SliderX::handle(int event) {
|
||||
if (event == FL_PUSH && Fl::visible_focus()) {
|
||||
Fl::focus(this);
|
||||
redraw();
|
||||
}
|
||||
|
||||
return handle(event,
|
||||
x()+Fl::box_dx(box()),
|
||||
y()+Fl::box_dy(box()),
|
||||
w()-Fl::box_dw(box()),
|
||||
h()-Fl::box_dh(box()));
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2013 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <FL/Fl_Slider.H>
|
||||
|
||||
class Fl_SliderX : public Fl_Slider
|
||||
{
|
||||
bool _log;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
void log ( bool v ) { _log = v; }
|
||||
bool log ( void ) const { return _log; }
|
||||
|
||||
Fl_SliderX( int X, int Y, int W, int H, const char *L=0 ) : Fl_Slider(X,Y,W,H,L)
|
||||
{
|
||||
_log = 0;
|
||||
}
|
||||
|
||||
virtual ~Fl_SliderX ( ) { };
|
||||
|
||||
virtual int slider_position ( double value, int w );
|
||||
virtual double slider_value ( int X, int w );
|
||||
|
||||
virtual void draw ( int X, int Y, int W, int H );
|
||||
virtual void draw ( void ) { draw(x(),y(),w(),h()); }
|
||||
|
||||
|
||||
virtual int handle(int event, int X, int Y, int W, int H);
|
||||
virtual int handle(int event);
|
||||
};
|
|
@ -22,14 +22,15 @@
|
|||
/* Just like an Fl_Input, except that when not being edited it
|
||||
* displays just like a label. */
|
||||
|
||||
#include <FL/fl_draw.H>
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/Fl_Window.H>
|
||||
#include <FL/Fl_Input.H>
|
||||
|
||||
class Fl_Sometimes_Input : public Fl_Input
|
||||
{
|
||||
|
||||
Fl_Boxtype _up_box;
|
||||
char *_text;
|
||||
|
||||
public:
|
||||
|
||||
|
@ -38,7 +39,7 @@ public:
|
|||
{
|
||||
clear_visible_focus();
|
||||
up_box( FL_NO_BOX );
|
||||
when(FL_WHEN_ENTER_KEY_ALWAYS);
|
||||
when(FL_WHEN_ENTER_KEY);
|
||||
}
|
||||
|
||||
void up_box ( Fl_Boxtype b ) { _up_box = b; }
|
||||
|
@ -52,7 +53,11 @@ public:
|
|||
else
|
||||
{
|
||||
fl_draw_box( up_box(), x(), y(), w(), h(), color() );
|
||||
fl_color( fl_contrast( textcolor(), color() ) );
|
||||
|
||||
Fl_Color c = textcolor();// fl_contrast( textcolor(), color() );
|
||||
|
||||
fl_color( active_r() ? c : fl_inactive( c ) );
|
||||
|
||||
fl_font( textfont(), textsize() );
|
||||
fl_draw( value(), x(), y(), w(), h(), (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_CLIP) );
|
||||
}
|
||||
|
@ -69,26 +74,52 @@ public:
|
|||
virtual int
|
||||
handle ( int m )
|
||||
{
|
||||
int r = Fl_Input::handle( m );
|
||||
int r = 0;
|
||||
|
||||
switch ( m )
|
||||
{
|
||||
case FL_KEYDOWN:
|
||||
{
|
||||
if ( ( Fl::event_key() == FL_Enter ||
|
||||
Fl::event_key() == FL_Tab ) )
|
||||
{
|
||||
do_callback();
|
||||
free( _text );
|
||||
Fl::focus( NULL );
|
||||
r = 1;
|
||||
}
|
||||
else if ( Fl::event_key() == FL_Escape )
|
||||
{
|
||||
value( _text );
|
||||
Fl::focus( NULL );
|
||||
|
||||
r = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case FL_FOCUS:
|
||||
_text = strdup( value() );
|
||||
redraw();
|
||||
return 1;
|
||||
r = 1;
|
||||
break;
|
||||
case FL_UNFOCUS:
|
||||
_text = NULL;
|
||||
redraw();
|
||||
r = 1;
|
||||
break;
|
||||
case FL_PUSH:
|
||||
take_focus();
|
||||
redraw();
|
||||
return 1;
|
||||
case FL_UNFOCUS:
|
||||
|
||||
if ( window() )
|
||||
window()->damage( FL_DAMAGE_EXPOSE, x(), y(), w(), h() );
|
||||
|
||||
redraw();
|
||||
return r;
|
||||
r = 1;
|
||||
break;
|
||||
case FL_DND_ENTER:
|
||||
return 0;
|
||||
case FL_PASTE:
|
||||
return 0;
|
||||
default:
|
||||
return r;
|
||||
break;
|
||||
}
|
||||
|
||||
return Fl_Input::handle( m ) | r;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2012 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <FL/Fl_Pack.H>
|
||||
|
||||
class Fl_Sometimes_Pack : public Fl_Pack
|
||||
{
|
||||
bool _pack;
|
||||
|
||||
public:
|
||||
|
||||
Fl_Sometimes_Pack ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Pack(X,Y,W,H,L)
|
||||
{
|
||||
_pack = true;
|
||||
}
|
||||
|
||||
virtual ~Fl_Sometimes_Pack ( )
|
||||
{
|
||||
}
|
||||
|
||||
void pack ( bool b )
|
||||
{
|
||||
if ( b != _pack )
|
||||
redraw();
|
||||
|
||||
_pack = b;
|
||||
}
|
||||
|
||||
bool pack ( void ) const
|
||||
{
|
||||
return _pack;
|
||||
}
|
||||
|
||||
virtual void draw ( void )
|
||||
{
|
||||
/* draw_box(); */
|
||||
|
||||
if ( _pack )
|
||||
{
|
||||
Fl_Pack::draw();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( children() )
|
||||
{
|
||||
for ( int i = 0; i < children(); i++ )
|
||||
{
|
||||
Fl_Widget *o = child( i );
|
||||
|
||||
o->resize( x(),y(),w(), o->h() );
|
||||
}
|
||||
resize( x(), y(), w(), child(0)->h() );
|
||||
}
|
||||
|
||||
Fl_Group::draw();
|
||||
}
|
||||
}
|
||||
};
|
|
@ -1,20 +1,21 @@
|
|||
# data file for the Fltk User Interface Designer (fluid)
|
||||
version 1.0108
|
||||
version 1.0300
|
||||
header_name {.H}
|
||||
code_name {.C}
|
||||
decl {\#include <string.h>} {}
|
||||
decl {\#include <string.h>} {private local
|
||||
}
|
||||
|
||||
widget_class Fl_Text_Edit_Window {open selected
|
||||
xywh {375 272 355 410} type Double resizable
|
||||
widget_class Fl_Text_Edit_Window {open
|
||||
xywh {377 295 355 410} type Double resizable
|
||||
code0 {this->size_range( 0, 0, 400, 400 );}
|
||||
class Fl_Window modal visible
|
||||
class Fl_Double_Window modal visible
|
||||
} {
|
||||
Fl_Box title_box {
|
||||
label {<title>}
|
||||
xywh {5 7 345 45}
|
||||
xywh {5 7 345 28}
|
||||
}
|
||||
Fl_Text_Editor text_editor {
|
||||
xywh {5 58 345 320} resizable
|
||||
Fl_Text_Editor text_editor {selected
|
||||
xywh {5 37 345 341} resizable
|
||||
code0 {o->buffer( new Fl_Text_Buffer );}
|
||||
}
|
||||
Fl_Group {} {open
|
||||
|
@ -33,13 +34,15 @@ widget_class Fl_Text_Edit_Window {open selected
|
|||
}
|
||||
}
|
||||
|
||||
Function {fl_text_edit( const char *title, const char *button_text, const char *initial_text )} {open C return_type {char *}
|
||||
Function {fl_text_edit( const char *title, const char *button_text, const char *initial_text, int W = 355, int H = 410 )} {open C return_type {char *}
|
||||
} {
|
||||
code {Fl_Text_Edit_Window tew( 355, 410, title );
|
||||
|
||||
tew.size( W, H );
|
||||
tew.return_button->label( button_text );
|
||||
tew.title_box->label( title );
|
||||
tew.text_editor->buffer()->text( initial_text );
|
||||
if ( initial_text )
|
||||
tew.text_editor->buffer()->text( initial_text );
|
||||
|
||||
tew.show();
|
||||
|
||||
|
|
|
@ -20,89 +20,215 @@
|
|||
|
||||
#include "Fl_Value_SliderX.H"
|
||||
|
||||
int Fl_Value_SliderX::_default_style = NICE_SLIDER;
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/fl_draw.H>
|
||||
#include <math.h>
|
||||
|
||||
void
|
||||
Fl_Value_SliderX::draw ( void )
|
||||
{
|
||||
switch ( _default_style )
|
||||
{
|
||||
case NICE_SLIDER:
|
||||
void Fl_Value_SliderX::input_cb(Fl_Widget*, void* v) {
|
||||
Fl_Value_SliderX& t = *(Fl_Value_SliderX*)v;
|
||||
double nv;
|
||||
if ((t.step() - floor(t.step()))>0.0 || t.step() == 0.0)
|
||||
nv = strtod(t.input.value(), 0);
|
||||
else
|
||||
nv = strtol(t.input.value(), 0, 0);
|
||||
|
||||
if (nv != t.value() || t.when() & FL_WHEN_NOT_CHANGED) {
|
||||
|
||||
if ( ! t.soft())
|
||||
nv = t.clamp(nv);
|
||||
t.set_value(nv);
|
||||
t.set_changed();
|
||||
if (t.when())
|
||||
{
|
||||
if ( FL_HORIZONTAL == _type )
|
||||
Fl_Value_Slider::type( FL_HOR_NICE_SLIDER );
|
||||
else
|
||||
Fl_Value_Slider::type( FL_VERT_NICE_SLIDER );
|
||||
break;
|
||||
}
|
||||
case FILL_SLIDER:
|
||||
{
|
||||
if ( FL_HORIZONTAL == _type )
|
||||
Fl_Value_Slider::type( FL_HOR_FILL_SLIDER );
|
||||
else
|
||||
Fl_Value_Slider::type( FL_VERT_FILL_SLIDER );
|
||||
break;
|
||||
}
|
||||
case SIMPLE_SLIDER:
|
||||
{
|
||||
if ( FL_HORIZONTAL == _type )
|
||||
Fl_Value_Slider::type( FL_HOR_SLIDER );
|
||||
else
|
||||
Fl_Value_Slider::type( FL_VERT_SLIDER );
|
||||
break;
|
||||
t.value_damage();
|
||||
t.do_callback();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Fl_Value_Slider::draw();
|
||||
void Fl_Value_SliderX::value_damage() {
|
||||
char buf[128];
|
||||
format(buf);
|
||||
input.value(buf);
|
||||
input.mark(input.position()); // turn off selection highlight
|
||||
redraw();
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
Fl_Value_SliderX::handle ( int m )
|
||||
Fl_Value_SliderX::~Fl_Value_SliderX ( void )
|
||||
{
|
||||
if (input.parent() == (Fl_Group *)this)
|
||||
input.parent(0); // *revert* ctor kludge!
|
||||
}
|
||||
|
||||
/* Fl_Value_Slider and friends should really handle mousewheel, but they don't in FTLK1 */
|
||||
/**
|
||||
Creates a new Fl_Value_SliderX widget using the given
|
||||
position, size, and label string. The default boxtype is FL_DOWN_BOX.
|
||||
*/
|
||||
Fl_Value_SliderX::Fl_Value_SliderX(int X, int Y, int W, int H, const char*l)
|
||||
: Fl_SliderX(X,Y,W,H,l),input(X, Y, W, H, 0) {
|
||||
step(1,100);
|
||||
|
||||
soft_ = 0;
|
||||
if (input.parent()) // defeat automatic-add
|
||||
input.parent()->remove(input);
|
||||
input.parent((Fl_Group *)this); // kludge!
|
||||
input.callback(input_cb, this);
|
||||
input.when(FL_WHEN_ENTER_KEY);
|
||||
align(FL_ALIGN_LEFT);
|
||||
value_damage();
|
||||
textsize(9);
|
||||
set_flag(SHORTCUT_LABEL);
|
||||
|
||||
switch ( m )
|
||||
{
|
||||
case FL_MOUSEWHEEL:
|
||||
{
|
||||
if ( this != Fl::belowmouse() )
|
||||
return 0;
|
||||
}
|
||||
|
||||
int steps = 16;
|
||||
void Fl_Value_SliderX::draw() {
|
||||
|
||||
if ( Fl::event_ctrl() )
|
||||
steps = 128;
|
||||
int sxx = x(), syy = y(), sww = w(), shh = h();
|
||||
int bxx = x(), byy = y(), bww = w(), bhh = h();
|
||||
if (horizontal()) {
|
||||
input.resize(x(), y(), 35, h());
|
||||
bww = 35; sxx += 35; sww -= 35;
|
||||
} else {
|
||||
input.resize(x(), y(), w(), 25 );
|
||||
syy += 25; bhh = 25; shh -= 25;
|
||||
}
|
||||
if (damage()&FL_DAMAGE_ALL) draw_box(box(),sxx,syy,sww,shh,color());
|
||||
Fl_SliderX::draw(sxx+Fl::box_dx(box()),
|
||||
syy+Fl::box_dy(box()),
|
||||
sww-Fl::box_dw(box()),
|
||||
shh-Fl::box_dh(box()));
|
||||
draw_box(box(),bxx,byy,bww,bhh,color());
|
||||
|
||||
float step = fabs( maximum() - minimum() ) / (float)steps;
|
||||
if (damage()&~FL_DAMAGE_CHILD) input.clear_damage(FL_DAMAGE_ALL);
|
||||
input.box(box());
|
||||
input.color(color(), selection_color());
|
||||
Fl_Widget *i = &input; i->draw(); // calls protected input.draw()
|
||||
input.clear_damage();
|
||||
}
|
||||
|
||||
float d = ((float)Fl::event_dy()) * step;
|
||||
int Fl_Value_SliderX::handle(int event) {
|
||||
if (event == FL_PUSH && Fl::visible_focus()) {
|
||||
Fl::focus(this);
|
||||
redraw();
|
||||
}
|
||||
|
||||
double v = value() + d;
|
||||
int sxx = x(), syy = y(), sww = w(), shh = h();
|
||||
if (horizontal()) {
|
||||
sxx += 35; sww -= 35;
|
||||
} else {
|
||||
syy += 25; shh -= 25;
|
||||
}
|
||||
|
||||
if ( maximum() > minimum() )
|
||||
{
|
||||
if ( v < minimum() )
|
||||
v = minimum();
|
||||
else if ( v > maximum() )
|
||||
v = maximum();
|
||||
}
|
||||
double v;
|
||||
int delta;
|
||||
int mx = Fl::event_x_root();
|
||||
static int ix, drag;
|
||||
// input.when(when());
|
||||
switch (event) {
|
||||
case FL_ENTER:
|
||||
return 1;
|
||||
case FL_LEAVE:
|
||||
if ( ! drag )
|
||||
fl_cursor( FL_CURSOR_DEFAULT );
|
||||
return 1;
|
||||
case FL_MOVE:
|
||||
if ( drag || Fl::event_inside( &input ) )
|
||||
fl_cursor( FL_CURSOR_WE );
|
||||
else
|
||||
fl_cursor( FL_CURSOR_DEFAULT );
|
||||
return 1;
|
||||
case FL_PUSH:
|
||||
// if (!step()) goto DEFAULT;
|
||||
if ( Fl::event_inside(&input) )
|
||||
{
|
||||
if ( v > minimum() )
|
||||
v = minimum();
|
||||
else if ( v < maximum() )
|
||||
v = maximum();
|
||||
input.handle(event);
|
||||
ix = mx;
|
||||
drag = Fl::event_button();
|
||||
handle_push();
|
||||
return 1;
|
||||
}
|
||||
goto DEFAULT;
|
||||
break;
|
||||
case FL_DRAG:
|
||||
{
|
||||
if ( ! drag )
|
||||
goto DEFAULT;
|
||||
|
||||
fl_cursor( FL_CURSOR_WE );
|
||||
|
||||
// if (!step()) goto DEFAULT;
|
||||
delta = mx-ix;
|
||||
if (!horizontal())
|
||||
delta = -delta;
|
||||
|
||||
if (delta > 5) delta -= 5;
|
||||
else if (delta < -5) delta += 5;
|
||||
else delta = 0;
|
||||
|
||||
float S = fabs( maximum() - minimum() );
|
||||
|
||||
switch (drag) {
|
||||
case 3: v = previous_value() + ( S * delta * 0.0100f); break;
|
||||
case 2: v = previous_value() + ( S * delta * 0.0010f); break;
|
||||
default:v = previous_value() + ( S * delta * 0.0005f); break;
|
||||
}
|
||||
|
||||
value( v );
|
||||
do_callback();
|
||||
|
||||
v = round(v);
|
||||
v = soft()?softclamp(v):clamp(v);
|
||||
handle_drag(v);
|
||||
value_damage();
|
||||
return 1;
|
||||
}
|
||||
case FL_RELEASE:
|
||||
|
||||
if ( ! drag )
|
||||
goto DEFAULT;
|
||||
|
||||
// if (!step()) goto DEFAULT;
|
||||
if (value() != previous_value() || !Fl::event_is_click())
|
||||
handle_release();
|
||||
|
||||
drag = 0;
|
||||
|
||||
fl_cursor( FL_CURSOR_DEFAULT );
|
||||
|
||||
/* else { */
|
||||
/* Fl_Widget_Tracker wp(&input); */
|
||||
/* input.handle(FL_PUSH); */
|
||||
/* if (wp.exists()) */
|
||||
/* input.handle(FL_RELEASE); */
|
||||
/* } */
|
||||
return 1;
|
||||
case FL_FOCUS:
|
||||
return input.take_focus();
|
||||
case FL_UNFOCUS:
|
||||
{
|
||||
input_cb(&input,this);
|
||||
return 1;
|
||||
}
|
||||
case FL_PASTE:
|
||||
return 0;
|
||||
case FL_SHORTCUT:
|
||||
return input.handle(event);
|
||||
}
|
||||
|
||||
return Fl_Value_Slider::handle( m );
|
||||
DEFAULT:
|
||||
|
||||
int r = Fl_SliderX::handle(event,
|
||||
sxx+Fl::box_dx(box()),
|
||||
syy+Fl::box_dy(box()),
|
||||
sww-Fl::box_dw(box()),
|
||||
shh-Fl::box_dh(box()));
|
||||
|
||||
if ( r )
|
||||
{
|
||||
return r;
|
||||
}
|
||||
else
|
||||
{
|
||||
input.type(((step() - floor(step()))>0.0 || step() == 0.0) ? FL_FLOAT_INPUT : FL_INT_INPUT);
|
||||
return input.handle(event);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -17,42 +17,84 @@
|
|||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
/* just like an Fl_Value_Slider, except that it responds to mousewheel events */
|
||||
#ifndef Fl_Value_SliderX_H
|
||||
#define Fl_Value_SliderX_H
|
||||
|
||||
#pragma once
|
||||
#include "Fl_SliderX.H"
|
||||
#include <FL/Fl_Input.H>
|
||||
|
||||
#include <FL/Fl_Value_Slider.H>
|
||||
#include <FL/Fl.H>
|
||||
#include <math.h>
|
||||
/**
|
||||
The Fl_Value_SliderX widget is a Fl_SliderX widget
|
||||
with a box displaying the current value.
|
||||
<P ALIGN=CENTER>\image html value_slider.png
|
||||
\image latex value_slider.png "Fl_Value_SliderX" width=4cm
|
||||
*/
|
||||
class FL_EXPORT Fl_Value_SliderX : public Fl_SliderX {
|
||||
/* This is the encapsulated Fl_input attribute to which
|
||||
this class delegates the value font, color and shortcut */
|
||||
Fl_Input input;
|
||||
|
||||
class Fl_Value_SliderX : public Fl_Value_Slider
|
||||
{
|
||||
static int _default_style;
|
||||
|
||||
int _type;
|
||||
private:
|
||||
char soft_;
|
||||
static void input_cb(Fl_Widget*,void*);
|
||||
virtual void value_damage(); // cause damage() due to value() changing
|
||||
|
||||
protected:
|
||||
void draw();
|
||||
public:
|
||||
int handle(int);
|
||||
Fl_Value_SliderX(int x,int y,int w,int h, const char *l = 0);
|
||||
virtual ~Fl_Value_SliderX ( );
|
||||
|
||||
enum
|
||||
{
|
||||
NICE_SLIDER,
|
||||
SIMPLE_SLIDER,
|
||||
FILL_SLIDER
|
||||
};
|
||||
|
||||
static void default_style ( int n ) { Fl_Value_SliderX::_default_style = n; }
|
||||
|
||||
int type ( void ) const { return _type; }
|
||||
void type ( int v ) { _type = v; }
|
||||
|
||||
|
||||
Fl_Value_SliderX ( int X, int Y, int W, int H, const char *L = 0 )
|
||||
: Fl_Value_Slider( X, Y, W, H, L )
|
||||
{
|
||||
}
|
||||
|
||||
virtual ~Fl_Value_SliderX() { }
|
||||
|
||||
virtual int handle ( int m );
|
||||
virtual void draw ( void );
|
||||
/** See void Fl_Value_Input::soft(char s) */
|
||||
void soft(char s) {soft_ = s;}
|
||||
/**
|
||||
If "soft" is turned on, the user is allowed to drag
|
||||
the value outside the range. If they drag the value to one of
|
||||
the ends, let go, then grab again and continue to drag, they can
|
||||
get to any value. The default is true.
|
||||
*/
|
||||
char soft() const {return soft_;}
|
||||
/**
|
||||
Returns the current shortcut key for the Input.
|
||||
\see Fl_Value_Input::shortcut(int)
|
||||
*/
|
||||
int shortcut() const {return input.shortcut();}
|
||||
/**
|
||||
Sets the shortcut key to \p s. Setting this
|
||||
overrides the use of '&' in the label(). The value is a bitwise
|
||||
OR of a key and a set of shift flags, for example FL_ALT | 'a'
|
||||
, FL_ALT | (FL_F + 10), or just 'a'. A value
|
||||
of 0 disables the shortcut.
|
||||
|
||||
The key can be any value returned by
|
||||
Fl::event_key(), but will usually be an ASCII letter. Use
|
||||
a lower-case letter unless you require the shift key to be held down.
|
||||
|
||||
The shift flags can be any set of values accepted by
|
||||
Fl::event_state(). If the bit is on that shift key must
|
||||
be pushed. Meta, Alt, Ctrl, and Shift must be off if they are not in
|
||||
the shift flags (zero for the other bits indicates a "don't care"
|
||||
setting).
|
||||
*/
|
||||
void shortcut(int s) {input.shortcut(s);}
|
||||
/** Gets the typeface of the text in the value box. */
|
||||
Fl_Font textfont() const {return input.textfont();}
|
||||
/** Sets the typeface of the text in the value box. */
|
||||
void textfont(Fl_Font s) {input.textfont(s);}
|
||||
/** Gets the size of the text in the value box. */
|
||||
Fl_Fontsize textsize() const {return input.textsize();}
|
||||
/** Sets the size of the text in the value box. */
|
||||
void textsize(Fl_Fontsize s) {input.textsize(s);}
|
||||
/** Gets the color of the text in the value box. */
|
||||
Fl_Color textcolor() const {return input.textcolor();}
|
||||
/** Sets the color of the text in the value box.*/
|
||||
void textcolor(Fl_Color n) {input.textcolor(n);}
|
||||
/** Gets the color of the text cursor. The text cursor is black by default. */
|
||||
Fl_Color cursor_color() const {return input.cursor_color();}
|
||||
/** Sets the color of the text cursor. The text cursor is black by default. */
|
||||
void cursor_color(Fl_Color n) {input.cursor_color(n);}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,180 +0,0 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2012 Jonathan Moore Liles */
|
||||
/* Copyright (C) 2001-2005 by Colin Jones */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
/* Taken from the "Gleam" FLTK scheme, as modified by prodatum */
|
||||
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/fl_draw.H>
|
||||
|
||||
#include "Gleam_Boxtypes.H"
|
||||
|
||||
static void gleam_color(Fl_Color c)
|
||||
{
|
||||
if (Fl::draw_box_active())
|
||||
fl_color(c);
|
||||
else
|
||||
fl_color(fl_inactive(c));
|
||||
}
|
||||
static void frame_rect(int x, int y, int w, int h, Fl_Color bc)
|
||||
{
|
||||
|
||||
// Draw the outline around the perimeter of the box
|
||||
fl_color(fl_color_average(FL_BLACK, FL_BACKGROUND_COLOR, .1));
|
||||
fl_line(x, y, x + w, y);
|
||||
fl_line(x + w, y, x + w, y + h);
|
||||
fl_line(x + w, y + h, x, y + h);
|
||||
fl_line(x, y + h, x, y);
|
||||
|
||||
}
|
||||
|
||||
static void shade_rect_up(int x, int y, int w, int h, Fl_Color bc)
|
||||
{
|
||||
// Draws the shiny
|
||||
float third = (float) h / 3;
|
||||
gleam_color(bc);
|
||||
fl_rectf(x, y, w, third + 1);
|
||||
|
||||
//gleam_color(fl_color_average(bc, FL_WHITE, .90f));
|
||||
//fl_rectf(x, y, w, half + 1);
|
||||
|
||||
float step_size = 0.10 / ((float) h - third);
|
||||
int j = 0;
|
||||
//step_size = (.1 / (float) half);
|
||||
//printf("1 / %i = %f \n", half, (1.0/half));
|
||||
|
||||
/**
|
||||
* This loop generates the nice gradient at the bottom of the
|
||||
* widget
|
||||
**/
|
||||
for (float k = 1; k >= .90; k -= step_size)
|
||||
{
|
||||
j++;
|
||||
gleam_color(fl_color_average(bc, FL_WHITE, k));
|
||||
fl_line(x, y + j + third - 1, x + w - 1, y + j + third - 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void frame_rect_up(int x, int y, int w, int h, Fl_Color bc)
|
||||
{
|
||||
|
||||
// Draw the outline around the perimeter of the box
|
||||
gleam_color(bc);
|
||||
fl_line(x, y, x + w, y); //Go across.
|
||||
fl_line(x, y + (h / 2), x, y + 1); //Go to top
|
||||
fl_line(x + w, y + (h / 2), x + w, y + 1); //Go to top
|
||||
|
||||
gleam_color(fl_darker(bc));
|
||||
fl_line(x, y + h, x + w, y + h); //Go across again!
|
||||
fl_line(x, y + (h / 2), x, y + h - 1); //Go to top
|
||||
fl_line(x + w, y + (h / 2), x + w, y + h - 1); //Go to top
|
||||
|
||||
}
|
||||
|
||||
static void frame_rect_down(int x, int y, int w, int h, Fl_Color bc)
|
||||
{
|
||||
|
||||
// Draw the outline around the perimeter of the box
|
||||
gleam_color(fl_darker(bc));
|
||||
fl_line(x, y, x + w, y); //Go across.
|
||||
fl_line(x, y + (h / 2), x, y + 1); //Go to top
|
||||
fl_line(x + w, y + (h / 2), x + w, y + 1); //Go to top
|
||||
|
||||
//gleam_color(bc);
|
||||
fl_line(x, y + h, x + w, y + h); //Go across again!
|
||||
fl_line(x, y + (h / 2), x, y + h - 1); //Go to top
|
||||
fl_line(x + w, y + (h / 2), x + w, y + h - 1); //Go to top
|
||||
|
||||
}
|
||||
|
||||
static void shade_rect_down(int x, int y, int w, int h, Fl_Color bc)
|
||||
{
|
||||
|
||||
gleam_color(bc);
|
||||
Fl_Color color = fl_color();
|
||||
fl_rectf(x, y, w, h);
|
||||
gleam_color(fl_color_average(bc, fl_darker(color), 0.65));
|
||||
fl_line(x, y + 1, x + w, y + 1);
|
||||
fl_line(x, y + 1, x, y + h - 2);
|
||||
gleam_color(fl_color_average(bc, fl_darker(color), 0.85));
|
||||
fl_line(x + 1, y + 2, x + w, y + 2);
|
||||
fl_line(x + 1, y + 2, x + 1, y + h - 2);
|
||||
|
||||
}
|
||||
|
||||
static void up_frame(int x, int y, int w, int h, Fl_Color c)
|
||||
{
|
||||
frame_rect_up(x, y, w - 1, h - 1, fl_darker(c));
|
||||
}
|
||||
|
||||
static void thin_up_box(int x, int y, int w, int h, Fl_Color c)
|
||||
{
|
||||
|
||||
shade_rect_up(x + 1, y, w - 2, h - 1, c);
|
||||
frame_rect(x + 1, y + 1, w - 3, h - 3, fl_color_average(c, FL_WHITE, .25f));
|
||||
frame_rect_up(x, y, w - 1, h - 1, fl_darker(c));
|
||||
|
||||
}
|
||||
|
||||
static void up_box(int x, int y, int w, int h, Fl_Color c)
|
||||
{
|
||||
shade_rect_up(x + 1, y, w - 2, h - 1, c);
|
||||
frame_rect_up(x, y, w - 1, h - 1, fl_darker(c));
|
||||
//draw the inner rect.
|
||||
frame_rect(x + 1, y + 1, w - 3, h - 3, fl_color_average(c, FL_WHITE, .25f));
|
||||
|
||||
}
|
||||
|
||||
static void down_frame(int x, int y, int w, int h, Fl_Color c)
|
||||
{
|
||||
frame_rect_down(x, y, w - 1, h - 1, fl_darker(c));
|
||||
}
|
||||
|
||||
static void down_box(int x, int y, int w, int h, Fl_Color c)
|
||||
{
|
||||
shade_rect_down(x + 1, y, w - 2, h, c);
|
||||
down_frame(x, y, w, h, fl_darker(c));
|
||||
//draw the inner rect.
|
||||
//frame_rect(x + 1, y + 1, w - 3, h - 3, fl_color_average(c, FL_BLACK, .65));
|
||||
}
|
||||
|
||||
static void thin_down_box(int x, int y, int w, int h, Fl_Color c)
|
||||
{
|
||||
|
||||
down_box(x, y, w, h, c);
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
init_gleam_boxtypes ( void )
|
||||
{
|
||||
/* replace the gtk+ boxes... (is there a better way?) */
|
||||
Fl::set_boxtype( FL_GTK_UP_BOX, up_box, 2,2,4,4 );
|
||||
Fl::set_boxtype( FL_GTK_DOWN_BOX, down_box, 2,2,3,3 );
|
||||
Fl::set_boxtype( FL_GTK_THIN_UP_BOX, up_box, 2,2,3,3 );
|
||||
Fl::set_boxtype( FL_GTK_THIN_DOWN_BOX, down_box, 2,2,3,3 );
|
||||
Fl::set_boxtype( FL_GTK_UP_FRAME, up_frame, 2,2,3,3 );
|
||||
Fl::set_boxtype( FL_GTK_DOWN_FRAME, down_frame, 2,2,3,3 );
|
||||
/* Fl::set_boxtype( FL_GTK_THIN_UP_BOX, thin_up_box, 1,1,1,1 ); */
|
||||
/* Fl::set_boxtype( FL_GTK_THIN_DOWN_BOX, thin_down_box, 1,1,1,1 ); */
|
||||
Fl::set_boxtype( FL_GTK_ROUND_UP_BOX, up_box, 2,2,3,3 );
|
||||
Fl::set_boxtype( FL_GTK_ROUND_DOWN_BOX, down_box, 2,2,3,3 );
|
||||
}
|
||||
|
115
FL/Makefile
|
@ -1,115 +0,0 @@
|
|||
|
||||
###############################################################################
|
||||
# Copyright (C) 2008 Jonathan Moore Liles #
|
||||
# #
|
||||
# This program is free software; you can redistribute it and/or modify it #
|
||||
# under the terms of the GNU General Public License as published by the #
|
||||
# Free Software Foundation; either version 2 of the License, or (at your #
|
||||
# option) any later version. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT #
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
|
||||
# more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License along #
|
||||
# with This program; see the file COPYING. If not,write to the Free Software #
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
|
||||
###############################################################################
|
||||
|
||||
## Makefile for the Non-DAW.
|
||||
|
||||
##
|
||||
## Do not edit this file; run `make config` instead.
|
||||
##
|
||||
|
||||
VERSION := 1.0.0
|
||||
PACKAGE := FL
|
||||
|
||||
all: .config
|
||||
|
||||
.config: configure
|
||||
@ echo '<<< Configuring '$(PACKAGE)
|
||||
@ ./configure
|
||||
|
||||
config:
|
||||
@ echo '<<< Configuring '$(PACKAGE)
|
||||
@ ./configure
|
||||
|
||||
-include .config
|
||||
|
||||
export SYSTEM_PATH:=$(prefix)/share/
|
||||
export DOCUMENT_PATH:=$(prefix)/share/doc/
|
||||
export PIXMAP_PATH:=$(prefix)/share/pixmaps/
|
||||
|
||||
# a bit of a hack to make sure this runs before any rules
|
||||
ifneq ($(CALCULATING),yes)
|
||||
TOTAL := $(shell $(MAKE) CALCULATING=yes -n 2>/dev/null | sed -n 's/^.*Compiling: \([^"]\+\)"/\1/p' > .files )
|
||||
endif
|
||||
|
||||
ifeq ($(USE_DEBUG),yes)
|
||||
CFLAGS := -pipe -ggdb -fno-inline -Wall -Wextra -O0
|
||||
CXXFLAGS := -Wnon-virtual-dtor -Wno-missing-field-initializers -fno-rtti -fno-exceptions
|
||||
else
|
||||
CFLAGS := -pipe -O2 -DNDEBUG
|
||||
CXXFLAGS := -fno-rtti -fno-exceptions
|
||||
endif
|
||||
|
||||
|
||||
CFLAGS+=-DVERSION=\"$(VERSION)\" \
|
||||
-DINSTALL_PREFIX=\"$(prefix)\" \
|
||||
-DSYSTEM_PATH=\"$(SYSTEM_PATH)\" \
|
||||
-DDOCUMENT_PATH=\"$(DOCUMENT_PATH)\" \
|
||||
-DPIXMAP_PATH=\"$(PIXMAP_PATH)\"
|
||||
|
||||
CXXFLAGS += $(SNDFILE_CFLAGS) $(FLTK_CFLAGS) $(JACK_CFLAGS)
|
||||
CXXFLAGS := $(CFLAGS) $(CXXFLAGS)
|
||||
|
||||
INCLUDES := -I. -Iutil -IFL -Inonlib
|
||||
|
||||
include scripts/colors
|
||||
|
||||
ifneq ($(CALCULATING),yes)
|
||||
COMPILING="$(BOLD)$(BLACK)$(PACKAGE) [$(SGR0)$(CYAN)`scripts/percent-complete .files "$<"`$(SGR0)$(BOLD)$(BLACK)]$(SGR0) $(BOLD)$(YELLOW)$<$(SGR0)"
|
||||
else
|
||||
COMPILING="Compiling: $<"
|
||||
endif
|
||||
|
||||
.C.o:
|
||||
@ echo $(COMPILING)
|
||||
@ $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
|
||||
|
||||
%.C : %.fl
|
||||
@ cd `dirname $<` && fluid -c ../$<
|
||||
|
||||
DONE := $(BOLD)$(GREEN)done$(SGR0)
|
||||
|
||||
include makefile.inc
|
||||
|
||||
SRCS:=$(FL_SRCS)
|
||||
OBJS:=$(FL_OBJS)
|
||||
|
||||
# FIXME: isn't there a better way?
|
||||
$(OBJS): .config Makefile
|
||||
|
||||
TAGS: $(SRCS)
|
||||
etags $(SRCS)
|
||||
|
||||
.deps: .config $(SRCS)
|
||||
ifneq ($(CALCULATING),yes)
|
||||
@ echo -n Calculating dependencies...
|
||||
@ makedepend -f- -- $(CXXFLAGS) $(INCLUDES) -- $(SRCS) 2>/dev/null > .deps && echo $(DONE)
|
||||
@ # gcc -M $(CXXFLAGS) $(INCLUDES) $(SRCS) > .deps && echo $(DONE)
|
||||
endif
|
||||
|
||||
clean_deps:
|
||||
@ rm -f .deps
|
||||
|
||||
install:
|
||||
@ echo ...
|
||||
|
||||
.PHONEY: clean config depend clean_deps
|
||||
|
||||
clean: FL_clean
|
||||
|
||||
-include .deps
|
|
@ -54,17 +54,17 @@ while ( _window->shown() )
|
|||
Function {make_window()} {open
|
||||
} {
|
||||
Fl_Window _window {
|
||||
label {New Project} open
|
||||
xywh {762 252 550 195} type Double hide modal xclass Non_DAW
|
||||
label {New Project} open selected
|
||||
xywh {743 696 550 105} type Double modal visible
|
||||
} {
|
||||
Fl_File_Input _name {
|
||||
label {Named:}
|
||||
xywh {75 140 375 35}
|
||||
xywh {75 55 375 35}
|
||||
}
|
||||
Fl_Button {} {
|
||||
label Browse
|
||||
callback {_directory->value( fl_dir_chooser( "Directory for new project", NULL, 0 ) );}
|
||||
xywh {455 100 80 35}
|
||||
xywh {455 15 80 35}
|
||||
}
|
||||
Fl_Return_Button {} {
|
||||
label Create
|
||||
|
@ -83,7 +83,7 @@ while ( _window->shown() )
|
|||
|
||||
_window->hide();
|
||||
}}
|
||||
xywh {455 140 80 35}
|
||||
xywh {455 55 80 35}
|
||||
}
|
||||
Fl_File_Input _directory {
|
||||
label {Where:}
|
||||
|
@ -95,36 +95,18 @@ while ( _window->shown() )
|
|||
}
|
||||
|
||||
// write_line( user_config_dir, "default_path", o->value() );}
|
||||
xywh {75 100 375 35}
|
||||
xywh {75 15 375 35}
|
||||
code0 {\#include <FL/filename.H>}
|
||||
code1 {char *v = NULL;}
|
||||
code2 {// read_line( user_config_dir, "default_path", &v );}
|
||||
code3 {o->value( v );}
|
||||
}
|
||||
Fl_Box {} {
|
||||
label {New Project}
|
||||
xywh {15 8 520 33} box RSHADOW_BOX color 133 labelsize 20 labelcolor 32
|
||||
}
|
||||
Fl_Choice _template {
|
||||
label {Template:} open
|
||||
private xywh {310 60 225 25} down_box BORDER_BOX
|
||||
} {
|
||||
MenuItem {} {
|
||||
label Default selected
|
||||
xywh {0 0 40 25}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
decl {char *path;} {public local
|
||||
}
|
||||
decl {char *_default_path} {private local
|
||||
}
|
||||
Function {templates( const char **templates )} {open return_type void
|
||||
} {
|
||||
code {for ( const char **s = templates; *s; ++s )
|
||||
_template->add( *s );} {}
|
||||
}
|
||||
Function {default_path( char *s )} {open return_type void
|
||||
} {
|
||||
code {_default_path = s;} {}
|
||||
|
@ -133,23 +115,18 @@ while ( _window->shown() )
|
|||
} {
|
||||
code {return _default_path;} {}
|
||||
}
|
||||
Function {selected_template()} {open return_type {const char *}
|
||||
} {
|
||||
code {return _template->text( _template->value() );} {}
|
||||
}
|
||||
}
|
||||
|
||||
Function {new_project_chooser( const char **templates, char **default_path, char **selected_template )} {open C return_type {char*}
|
||||
Function {new_project_chooser( char **default_path)} {open C return_type {char*}
|
||||
} {
|
||||
code {New_Project_Dialog nsd;
|
||||
|
||||
nsd.templates( templates );
|
||||
nsd.default_path( *default_path );
|
||||
|
||||
nsd.run();
|
||||
|
||||
*default_path = strdup( nsd.default_path() );
|
||||
*selected_template = strdup( nsd.selected_template() );
|
||||
if ( nsd.default_path() )
|
||||
*default_path = nsd.default_path();
|
||||
|
||||
return nsd.path;} {}
|
||||
}
|
||||
|
|
|
@ -1,81 +0,0 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2010 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#include "color_scheme.H"
|
||||
#include <FL/Fl.H>
|
||||
#include <string.h>
|
||||
|
||||
static Fl_Color system_colors[3];
|
||||
|
||||
void
|
||||
get_system_colors ( void )
|
||||
{
|
||||
Fl::get_system_colors();
|
||||
|
||||
system_colors[ 0 ] = (Fl_Color)Fl::get_color( FL_BACKGROUND_COLOR );
|
||||
system_colors[ 1 ] = (Fl_Color)Fl::get_color( FL_FOREGROUND_COLOR );
|
||||
system_colors[ 2 ] = (Fl_Color)Fl::get_color( FL_BACKGROUND2_COLOR );
|
||||
}
|
||||
|
||||
void
|
||||
color_scheme ( const char *name )
|
||||
{
|
||||
if ( !strcasecmp( name, "gray" ) )
|
||||
{
|
||||
Fl::background2( 127, 127, 127 );
|
||||
Fl::background( 100, 100, 100 );
|
||||
Fl::foreground( 255, 255, 255 );
|
||||
}
|
||||
if ( !strcasecmp( name, "dark" ) )
|
||||
{
|
||||
Fl::background2( 100, 100, 100 );
|
||||
Fl::background( 50, 50, 50 );
|
||||
Fl::foreground( 255, 255, 255 );
|
||||
}
|
||||
else if ( !strcasecmp( name, "light" ))
|
||||
{
|
||||
Fl::background2( 192, 192, 192 );
|
||||
Fl::background( 220, 220, 220 );
|
||||
Fl::foreground( 0, 0, 0 );
|
||||
}
|
||||
if ( !strcasecmp( name, "very dark" ) )
|
||||
{
|
||||
Fl::background2( 100, 100, 100 );
|
||||
Fl::background( 20, 20, 20 );
|
||||
Fl::foreground( 240, 240, 240 );
|
||||
}
|
||||
else if ( !strcasecmp( name, "system" ) )
|
||||
{
|
||||
unsigned char r, g, b;
|
||||
|
||||
Fl::get_color( system_colors[ 0 ], r, g, b );
|
||||
|
||||
Fl::background( r, g, b );
|
||||
|
||||
Fl::get_color( system_colors[ 1 ], r, g, b );
|
||||
|
||||
Fl::foreground( r, g, b );
|
||||
|
||||
Fl::get_color( system_colors[ 2 ], r, g, b );
|
||||
|
||||
Fl::background2( r, g, b );
|
||||
}
|
||||
|
||||
Fl::scheme( Fl::scheme() );
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2008 Jonathan Moore Liles
|
||||
# This file is licensed under version 2 of the GPL.
|
||||
|
||||
. scripts/config-funcs
|
||||
|
||||
begin
|
||||
|
||||
begin_options
|
||||
|
||||
ask "Build for debugging" USE_DEBUG no
|
||||
|
||||
begin_tests
|
||||
|
||||
require_FLTK 1.1.7 images
|
||||
require_command FLUID fluid
|
||||
require_command ar ar
|
||||
require_command makedepend makedepend
|
||||
|
||||
end
|
|
@ -0,0 +1,103 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2012 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/fl_draw.H>
|
||||
|
||||
void
|
||||
draw_focus_frame ( int x, int y, int w, int h, Fl_Color c )
|
||||
{
|
||||
fl_push_clip( x, y, w, h );
|
||||
|
||||
// fl_color( fl_color_average( FL_GRAY, c, 0.50 ) );
|
||||
|
||||
/* fl_color( fl_color_add_alpha( c, 100 ) ); */
|
||||
|
||||
/* fl_line_style( FL_DASH, 2 ); */
|
||||
|
||||
/* fl_rect( x, y, w, h ); */
|
||||
|
||||
fl_line_style( FL_SOLID, 3 );
|
||||
|
||||
fl_color( c );
|
||||
|
||||
int l = 15;
|
||||
|
||||
fl_line( x, y, x + l, y );
|
||||
fl_line( x, y + l, x, y );
|
||||
|
||||
fl_line( x + w - 1, y, x + w - l - 1, y );
|
||||
fl_line( x + w - 1, y, x + w - 1, y + l - 1 );
|
||||
|
||||
fl_line( x, y + h - 1, x, y + h - l - 1);
|
||||
fl_line( x, y + h - 1, x + l, y + h - 1 );
|
||||
|
||||
fl_line( x + w - 1, y + h - 1, x + w - 1, y + h - l - 1 );
|
||||
fl_line( x + w - 1, y + h - 1, x + w - l, y + h - 1 );
|
||||
|
||||
fl_line_style( FL_SOLID, 0 );
|
||||
|
||||
fl_pop_clip();
|
||||
}
|
||||
|
||||
void
|
||||
draw_selection_frame ( int x, int y, int w, int h, Fl_Color c )
|
||||
{
|
||||
fl_push_clip( x, y, w, h );
|
||||
|
||||
fl_color( fl_color_average( FL_GRAY, c, 0.50 ) );
|
||||
|
||||
/// fl_color( fl_color_add_alpha( c, 100 ) );
|
||||
|
||||
fl_line_style( FL_DASH, 2 );
|
||||
|
||||
fl_rect( x, y, w, h );
|
||||
|
||||
fl_line_style( FL_SOLID, 3 );
|
||||
|
||||
fl_color( c );
|
||||
|
||||
int l = 15;
|
||||
|
||||
fl_line( x, y, x + l, y );
|
||||
fl_line( x, y + l, x, y );
|
||||
|
||||
fl_line( x + w - 1, y, x + w - l - 1, y );
|
||||
fl_line( x + w - 1, y, x + w - 1, y + l - 1 );
|
||||
|
||||
fl_line( x, y + h - 1, x, y + h - l - 1);
|
||||
fl_line( x, y + h - 1, x + l, y + h - 1 );
|
||||
|
||||
fl_line( x + w - 1, y + h - 1, x + w - 1, y + h - l - 1 );
|
||||
fl_line( x + w - 1, y + h - 1, x + w - l, y + h - 1 );
|
||||
|
||||
fl_line_style( FL_SOLID, 0 );
|
||||
|
||||
fl_pop_clip();
|
||||
}
|
||||
|
||||
bool
|
||||
focused_r ( Fl_Widget *w )
|
||||
{
|
||||
for ( Fl_Widget *p = Fl::focus(); p; p = p->parent() )
|
||||
if ( p == w )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2010 Jonathan Moore Liles */
|
||||
/* Copyright (C) 2012 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
|
@ -17,5 +17,6 @@
|
|||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
void color_scheme ( const char *name );
|
||||
void get_system_colors ( void );
|
||||
void draw_focus_frame ( int x, int y, int w, int h, Fl_Color c );
|
||||
void draw_selection_frame ( int x, int y, int w, int h, Fl_Color c );
|
||||
bool focused_r ( Fl_Widget *w );
|
|
@ -0,0 +1,61 @@
|
|||
/*******************************************************************************/
|
||||
/* Copyright (C) 2013 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
static unsigned char img_io_input_connector_10x10_png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
|
||||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a,
|
||||
0x08, 0x06, 0x00, 0x00, 0x00, 0x8d, 0x32, 0xcf, 0xbd, 0x00, 0x00, 0x00,
|
||||
0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64,
|
||||
0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00,
|
||||
0x9e, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x22, 0xcb, 0xc6, 0x03, 0x00, 0x00,
|
||||
0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
|
||||
0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63,
|
||||
0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00,
|
||||
0x00, 0x01, 0x51, 0x49, 0x44, 0x41, 0x54, 0x18, 0x95, 0x3d, 0xd0, 0xb1,
|
||||
0x6a, 0xdb, 0x40, 0x1c, 0xc0, 0xe1, 0x9f, 0x72, 0x7f, 0xcc, 0x21, 0xbc,
|
||||
0xc5, 0x87, 0xb0, 0xb7, 0x18, 0x6c, 0xa8, 0x49, 0x37, 0x1b, 0x8c, 0x26,
|
||||
0xdb, 0x19, 0xfb, 0x0e, 0x7e, 0x82, 0xee, 0x21, 0x53, 0xe9, 0x14, 0x42,
|
||||
0x37, 0x37, 0x7b, 0x9e, 0xa2, 0x63, 0x07, 0x6b, 0xd6, 0xec, 0xc5, 0xe0,
|
||||
0x80, 0xc1, 0x08, 0xac, 0x66, 0xf0, 0xa0, 0xb3, 0x90, 0x4e, 0xa7, 0x4e,
|
||||
0xed, 0xf6, 0xcd, 0x5f, 0xd0, 0xb6, 0x2d, 0x00, 0xfb, 0xfd, 0xfe, 0x4b,
|
||||
0x59, 0x96, 0x8f, 0x4d, 0xd3, 0xdc, 0x01, 0x4e, 0x44, 0xf2, 0x30, 0x0c,
|
||||
0x9f, 0x86, 0xc3, 0xe1, 0x6f, 0x80, 0xa0, 0x6d, 0x5b, 0x76, 0xbb, 0xdd,
|
||||
0xb7, 0xf3, 0xf9, 0xfc, 0x35, 0x4d, 0xd3, 0x5e, 0x96, 0x65, 0x78, 0xef,
|
||||
0x19, 0x0c, 0x06, 0x4c, 0xa7, 0xd3, 0x8f, 0x28, 0x8a, 0x7e, 0x4e, 0x26,
|
||||
0x93, 0xef, 0x6a, 0xbd, 0x5e, 0x3f, 0x9c, 0x4e, 0xa7, 0x1f, 0x49, 0x92,
|
||||
0xf4, 0x2e, 0x97, 0x0b, 0xdb, 0xed, 0x96, 0xe3, 0xf1, 0x88, 0x31, 0x86,
|
||||
0x2c, 0xcb, 0x42, 0x63, 0xcc, 0x7d, 0x5d, 0xd7, 0xbb, 0x1b, 0x6b, 0xed,
|
||||
0x73, 0x9a, 0xa6, 0xb7, 0x00, 0x4a, 0x29, 0x44, 0x04, 0x11, 0x41, 0x29,
|
||||
0x05, 0x40, 0x9a, 0xa6, 0xbd, 0xb2, 0x2c, 0x1f, 0xc5, 0x39, 0x67, 0xac,
|
||||
0xb5, 0x78, 0xef, 0x09, 0x82, 0x80, 0xd5, 0x6a, 0x45, 0x10, 0x04, 0xb4,
|
||||
0x6d, 0x8b, 0x73, 0x8e, 0xa2, 0x28, 0x68, 0x9a, 0xe6, 0x4e, 0x00, 0xf1,
|
||||
0xde, 0x93, 0x24, 0x09, 0x45, 0x51, 0x10, 0xc7, 0x31, 0x22, 0x42, 0x92,
|
||||
0x24, 0x68, 0xad, 0x59, 0x2e, 0x97, 0x00, 0xee, 0x46, 0x29, 0xf5, 0xde,
|
||||
0xed, 0x76, 0xb9, 0x5e, 0xaf, 0x78, 0xef, 0xa9, 0xaa, 0x8a, 0xaa, 0xaa,
|
||||
0xfe, 0x5b, 0x6b, 0x8d, 0x88, 0xe4, 0xa2, 0xb5, 0x7e, 0x99, 0xcd, 0x66,
|
||||
0x9f, 0xf2, 0x3c, 0xef, 0x59, 0x6b, 0x31, 0xc6, 0x00, 0x10, 0xc7, 0x31,
|
||||
0x9d, 0x4e, 0x87, 0xf9, 0x7c, 0xfe, 0x11, 0x86, 0xe1, 0x93, 0xda, 0x6c,
|
||||
0x36, 0x7b, 0x6b, 0x6d, 0xd8, 0xef, 0xf7, 0x3f, 0x5b, 0x6b, 0xc3, 0xba,
|
||||
0xae, 0x01, 0x30, 0xc6, 0xb0, 0x58, 0x2c, 0xfe, 0x44, 0x51, 0xf4, 0x3a,
|
||||
0x1e, 0x8f, 0xdf, 0x82, 0x7f, 0xe1, 0x87, 0xc3, 0xe1, 0xc1, 0x5a, 0xfb,
|
||||
0xec, 0x9c, 0x33, 0x80, 0x28, 0xa5, 0xde, 0xb5, 0xd6, 0x2f, 0xa3, 0xd1,
|
||||
0xe8, 0x17, 0xc0, 0x5f, 0xd1, 0x17, 0xa6, 0x12, 0x83, 0xc3, 0x30, 0x9b,
|
||||
0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
|
||||
|
||||
};
|
||||
static unsigned int img_io_input_connector_10x10_png_len = 468;
|
|
@ -0,0 +1,63 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2013 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
static unsigned char img_io_output_connector_10x10_png[] = {
|
||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
|
||||
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a,
|
||||
0x08, 0x06, 0x00, 0x00, 0x00, 0x8d, 0x32, 0xcf, 0xbd, 0x00, 0x00, 0x00,
|
||||
0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64,
|
||||
0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00,
|
||||
0x9e, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x22, 0xcb, 0xc6, 0x03, 0x00, 0x00,
|
||||
0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
|
||||
0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63,
|
||||
0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00,
|
||||
0x00, 0x01, 0x61, 0x49, 0x44, 0x41, 0x54, 0x18, 0x95, 0x35, 0xd0, 0xbf,
|
||||
0x6a, 0xc2, 0x40, 0x00, 0x07, 0xe0, 0xdf, 0xfd, 0x89, 0xe4, 0x32, 0xc4,
|
||||
0x40, 0xed, 0x22, 0x9c, 0x50, 0x24, 0x99, 0x1c, 0xdc, 0x33, 0x38, 0x64,
|
||||
0xec, 0x03, 0x14, 0x9c, 0xd4, 0xb9, 0x7b, 0xe9, 0x54, 0x3a, 0x95, 0xd2,
|
||||
0xb1, 0x1d, 0x74, 0xeb, 0xe4, 0xec, 0xd2, 0x31, 0x01, 0x9f, 0x40, 0x04,
|
||||
0xe9, 0x10, 0x85, 0x06, 0x1c, 0x6d, 0x40, 0x34, 0xe4, 0xd0, 0x0b, 0x5e,
|
||||
0xa7, 0x7e, 0x8f, 0xf0, 0x11, 0x63, 0x0c, 0x00, 0x60, 0xbd, 0x5e, 0xdf,
|
||||
0x96, 0x65, 0xf9, 0xa0, 0xb5, 0xbe, 0x21, 0x84, 0x54, 0x9c, 0xf3, 0x9d,
|
||||
0x10, 0xe2, 0x31, 0x08, 0x82, 0x18, 0x00, 0x88, 0x31, 0x06, 0xab, 0xd5,
|
||||
0xea, 0x69, 0xbb, 0xdd, 0xde, 0x27, 0x49, 0xd2, 0xb0, 0x6d, 0x1b, 0x8c,
|
||||
0x31, 0x14, 0x45, 0x81, 0x28, 0x8a, 0x72, 0x29, 0xe5, 0x7b, 0xa7, 0xd3,
|
||||
0x79, 0x66, 0xfd, 0x7e, 0x3f, 0xca, 0xb2, 0xec, 0x6d, 0x36, 0x9b, 0x35,
|
||||
0x84, 0x10, 0x18, 0x8d, 0x46, 0xe8, 0x76, 0xbb, 0x58, 0x2e, 0x97, 0x58,
|
||||
0x2c, 0x16, 0x4e, 0xb3, 0xd9, 0xec, 0x00, 0xf8, 0xa6, 0x4a, 0xa9, 0x97,
|
||||
0x38, 0x8e, 0xaf, 0x00, 0x40, 0x6b, 0x8d, 0xf3, 0xf9, 0x8c, 0xd3, 0xe9,
|
||||
0x04, 0xad, 0x35, 0x00, 0x20, 0x49, 0x92, 0x46, 0x59, 0x96, 0x0f, 0xbc,
|
||||
0xaa, 0xaa, 0xeb, 0xe3, 0xf1, 0x08, 0xc6, 0x18, 0x2e, 0x97, 0x0b, 0xc6,
|
||||
0xe3, 0x31, 0x8c, 0x31, 0xa0, 0x94, 0xa2, 0x56, 0xab, 0xe1, 0x70, 0x38,
|
||||
0x40, 0x6b, 0x7d, 0xc3, 0x8d, 0x31, 0x9c, 0x52, 0x8a, 0xe1, 0x70, 0x08,
|
||||
0xcf, 0xf3, 0x30, 0x9d, 0x4e, 0xa1, 0xb5, 0xc6, 0x60, 0x30, 0x40, 0x51,
|
||||
0x14, 0x98, 0x4c, 0x26, 0x20, 0x84, 0x54, 0xd4, 0xb2, 0xac, 0x1f, 0xd7,
|
||||
0x75, 0xe1, 0xba, 0x2e, 0x38, 0xe7, 0x70, 0x1c, 0x07, 0x42, 0x08, 0x30,
|
||||
0xc6, 0x60, 0xdb, 0x36, 0x3c, 0xcf, 0x03, 0xe7, 0x7c, 0x47, 0xd2, 0x34,
|
||||
0xbd, 0xdd, 0x6c, 0x36, 0x9f, 0xf3, 0xf9, 0xbc, 0x51, 0xaf, 0xd7, 0x91,
|
||||
0x65, 0x19, 0x00, 0xa0, 0xd5, 0x6a, 0x41, 0x29, 0x85, 0x30, 0x0c, 0xf3,
|
||||
0x76, 0xbb, 0x7d, 0x47, 0x7d, 0xdf, 0xff, 0x92, 0x52, 0x7e, 0xf4, 0x7a,
|
||||
0xbd, 0x3c, 0xcf, 0x73, 0xfc, 0xdb, 0xef, 0xf7, 0x08, 0xc3, 0xf0, 0x57,
|
||||
0x4a, 0xf9, 0x1e, 0x04, 0x41, 0x4c, 0xfe, 0xc3, 0xd3, 0x34, 0x8d, 0x94,
|
||||
0x52, 0x2f, 0x55, 0x55, 0x5d, 0x1b, 0x63, 0xb8, 0x65, 0x59, 0x3f, 0x8e,
|
||||
0xe3, 0xbc, 0xfa, 0xbe, 0xff, 0x05, 0x00, 0x7f, 0xb0, 0xa3, 0x9e, 0x20,
|
||||
0x9c, 0xde, 0x99, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
|
||||
0xae, 0x42, 0x60, 0x82
|
||||
};
|
||||
static unsigned int img_io_output_connector_10x10_png_len = 484;
|
|
@ -1,20 +0,0 @@
|
|||
# -*- mode: makefile; -*-
|
||||
|
||||
all: FL
|
||||
|
||||
FL_SRCS := $(wildcard FL/*.C FL/*.fl)
|
||||
|
||||
FL_SRCS:=$(FL_SRCS:.fl=.C)
|
||||
FL_SRCS:=$(sort $(FL_SRCS))
|
||||
FL_OBJS:=$(FL_SRCS:.C=.o)
|
||||
|
||||
all: FL/libfl_widgets.a
|
||||
|
||||
FL/libfl_widgets.a: $(FL_OBJS)
|
||||
@ ar rcs $@ $(FL_OBJS)
|
||||
|
||||
.PHONEY: FL
|
||||
FL: FL/libfl_widgets.a
|
||||
|
||||
FL_clean:
|
||||
rm -f $(FL_OBJS) FL/libfl_widgets.a
|
|
@ -18,7 +18,7 @@
|
|||
/*******************************************************************************/
|
||||
|
||||
class Fl_Menu_;
|
||||
class Fl_Menu_Item;
|
||||
struct Fl_Menu_Item;
|
||||
class Fl_Widget;
|
||||
|
||||
bool menu_popup ( Fl_Menu_ *m, int X, int Y );
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
../scripts
|
|
@ -31,8 +31,10 @@ test_press ( unsigned long e )
|
|||
if ( Fl::event_text()[0] )
|
||||
((char *)Fl::event_text())[0] = '\0';
|
||||
|
||||
if ( ! ( e & FL_SHIFT ) )
|
||||
return Fl::test_shortcut( e ) && ! Fl::event_shift();
|
||||
const int mod_mask = FL_SHIFT | FL_ALT | FL_CTRL;
|
||||
|
||||
if ( ( e & mod_mask ) != ( Fl::event_state() & mod_mask ) )
|
||||
return false;
|
||||
else
|
||||
return Fl::test_shortcut( e );
|
||||
}
|
||||
|
|
|
@ -0,0 +1,163 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2012 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/Fl_Double_Window.H>
|
||||
#include <FL/Fl_Single_Window.H>
|
||||
#include <FL/Fl_Pack.H>
|
||||
#include <FL/Fl_Choice.H>
|
||||
#include <FL/fl_draw.H>
|
||||
#include <sys/time.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static Fl_Boxtype boxtype = FL_UP_BOX;
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
unsigned long long tv_to_ts ( timeval *tv )
|
||||
{
|
||||
return tv->tv_sec * 1e6 + tv->tv_usec;
|
||||
}
|
||||
|
||||
unsigned long long get_ts ( void )
|
||||
{
|
||||
struct timeval then;
|
||||
gettimeofday( &then, NULL );
|
||||
|
||||
return tv_to_ts( &then );
|
||||
}
|
||||
|
||||
class PerfTest : public Fl_Widget
|
||||
{
|
||||
public:
|
||||
|
||||
PerfTest ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Widget( X, Y, W, H, L )
|
||||
{
|
||||
align(FL_ALIGN_TOP | FL_ALIGN_RIGHT |FL_ALIGN_INSIDE);
|
||||
box(FL_UP_BOX);
|
||||
labelcolor( FL_WHITE );
|
||||
use_cairo = false;
|
||||
}
|
||||
|
||||
|
||||
bool use_cairo;
|
||||
|
||||
void draw ( void )
|
||||
{
|
||||
if ( use_cairo )
|
||||
fl_push_use_cairo(true);
|
||||
|
||||
fl_rectf( x(), y(), w(), h(), FL_BLACK );
|
||||
|
||||
unsigned long long then = get_ts();
|
||||
|
||||
fl_push_clip( x(), y(), w(), h() );
|
||||
|
||||
int count = 400;
|
||||
|
||||
/* draw stuff */
|
||||
int i = 0;
|
||||
for ( ; i < count; ++i )
|
||||
fl_draw_box( boxtype, x(), y(), w(), h(), fl_lighter( FL_BLACK ) );
|
||||
|
||||
fl_pop_clip();
|
||||
|
||||
unsigned long long now = get_ts();
|
||||
|
||||
double elapsedms = (now - then) / 1000.0;
|
||||
|
||||
static char text[256];
|
||||
sprintf( text, "Drew %i boxes in in %fms", i, elapsedms );
|
||||
|
||||
fl_color( FL_RED );
|
||||
fl_draw( text, x(), y(), w(), h(), FL_ALIGN_CENTER | FL_ALIGN_INSIDE );
|
||||
|
||||
draw_label();
|
||||
|
||||
if ( use_cairo )
|
||||
fl_pop_use_cairo();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void
|
||||
boxtype_cb ( Fl_Widget *w, void *v )
|
||||
{
|
||||
const char *picked = ((Fl_Choice*)w)->mvalue()->label();
|
||||
|
||||
if ( !strcmp( picked, "UP_BOX" ) )
|
||||
boxtype = FL_UP_BOX;
|
||||
else if ( !strcmp( picked, "FLAT_BOX" ) )
|
||||
boxtype = FL_FLAT_BOX;
|
||||
else if ( !strcmp( picked, "ROUNDED_BOX" ) )
|
||||
boxtype = FL_ROUNDED_BOX;
|
||||
else if ( !strcmp( picked, "OVAL_BOX" ) )
|
||||
boxtype = FL_OVAL_BOX;
|
||||
|
||||
w->window()->redraw();
|
||||
}
|
||||
|
||||
int
|
||||
main ( int argc, char **argv )
|
||||
{
|
||||
{
|
||||
Fl_Single_Window *w = new Fl_Single_Window( 800, 600 );
|
||||
|
||||
{ Fl_Choice *o = new Fl_Choice( 0, 0, 200, 24, "Boxtype" );
|
||||
o->align( FL_ALIGN_RIGHT );
|
||||
|
||||
o->callback( boxtype_cb, NULL );
|
||||
|
||||
o->add( "UP_BOX" );
|
||||
o->add( "FLAT_BOX" );
|
||||
o->add( "ROUNDED_BOX" );
|
||||
o->add( "OVAL_BOX" );
|
||||
}
|
||||
|
||||
{
|
||||
Fl_Pack *o = new Fl_Pack( 0, 24, 800, 600 - 24 );
|
||||
o->type( 0 );
|
||||
|
||||
{
|
||||
PerfTest *o = new PerfTest( 0,0, 800, 400, "Xlib" );
|
||||
}
|
||||
|
||||
{
|
||||
PerfTest *o = new PerfTest( 0,0, 800, 400, "Cairo" );
|
||||
o->use_cairo = true;
|
||||
}
|
||||
|
||||
o->end();
|
||||
}
|
||||
|
||||
w->end();
|
||||
w->show();
|
||||
}
|
||||
|
||||
/* { */
|
||||
/* Fl_Single_Window *w = new Fl_Single_Window( 800, 600 ); */
|
||||
|
||||
/* PerfTest *o = new PerfTest( 0,0, 800, 600 ); */
|
||||
|
||||
/* w->end(); */
|
||||
/* w->show(); */
|
||||
/* } */
|
||||
|
||||
Fl::run();
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
def options(opt):
|
||||
pass
|
||||
|
||||
def configure(conf):
|
||||
pass
|
||||
|
||||
def build(bld):
|
||||
bld.stlib(
|
||||
source =
|
||||
'''
|
||||
About_Dialog.fl
|
||||
Fl_Menu_Settings.C
|
||||
Fl_Scalepack.C
|
||||
Fl_Text_Edit_Window.fl
|
||||
Fl_Value_SliderX.C
|
||||
Fl_DialX.C
|
||||
Fl_SliderX.C
|
||||
New_Project_Dialog.fl
|
||||
event_name.C
|
||||
menu_popup.C
|
||||
test_press.C
|
||||
focus_frame.C
|
||||
''',
|
||||
includes = '.',
|
||||
export_incdirs = [ '.' 'FL' ],
|
||||
uselib = 'PTHREAD NTK',
|
||||
target = 'fl_widgets')
|
32
Makefile
|
@ -1,32 +0,0 @@
|
|||
|
||||
###############################################################################
|
||||
# Copyright (C) 2008 Jonathan Moore Liles #
|
||||
# #
|
||||
# This program is free software; you can redistribute it and/or modify it #
|
||||
# under the terms of the GNU General Public License as published by the #
|
||||
# Free Software Foundation; either version 2 of the License, or (at your #
|
||||
# option) any later version. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT #
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
|
||||
# more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License along #
|
||||
# with This program; see the file COPYING. If not,write to the Free Software #
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
|
||||
###############################################################################
|
||||
|
||||
SUBDIRS=nonlib FL timeline mixer session-manager
|
||||
|
||||
all:
|
||||
@ for dir in $(SUBDIRS); do $(MAKE) -s -C $$dir; done
|
||||
|
||||
clean:
|
||||
@ for dir in $(SUBDIRS); do $(MAKE) -s -C $$dir clean; done
|
||||
|
||||
install:
|
||||
@ for dir in $(SUBDIRS); do $(MAKE) -s -C $$dir install; done
|
||||
|
||||
config:
|
||||
@ for dir in $(SUBDIRS); do $(MAKE) -s -C $$dir config; done
|
|
@ -0,0 +1,51 @@
|
|||
# -*- mode: org -*-
|
||||
|
||||
* Non-things build instructions
|
||||
|
||||
This repository contains all of the non-* software.
|
||||
|
||||
** Getting NTK
|
||||
|
||||
If you just cloned the non repository or just executed git pull, then
|
||||
you should also run
|
||||
|
||||
git submodule update --init
|
||||
|
||||
to pull down the latest NTK code required by Non. Git does *not* do
|
||||
this automatically.
|
||||
|
||||
** Building NTK
|
||||
|
||||
If you don't have NTK installed system-wide (which isn't very likely
|
||||
yet) you *MUST* begin the build process by typing:
|
||||
|
||||
cd lib/ntk
|
||||
./waf configure
|
||||
./waf
|
||||
|
||||
Once NTK has been built you must install it system-wide before
|
||||
attempting to build the non-* programs.
|
||||
|
||||
To install NTK type:
|
||||
|
||||
su -c './waf install'
|
||||
|
||||
** Build all projects
|
||||
|
||||
Typing:
|
||||
|
||||
./waf configure
|
||||
./waf
|
||||
su -c './waf install'
|
||||
|
||||
from the base of the checkout of the Non git repository will build and
|
||||
install all of the non-* programs together.
|
||||
|
||||
** Build a single project
|
||||
|
||||
Typing:
|
||||
|
||||
./waf configure --project=[timline|sequencer|mixer|session-manager]
|
||||
./waf
|
||||
su -c './waf install'
|
||||
|
|
@ -1,8 +1,10 @@
|
|||
# -*- mode: org -*-
|
||||
|
||||
Notes to packagers: Non-Mixer, Non-DAW, and Non-Session-Manager,
|
||||
although stored in the same repository, are completely independent
|
||||
programs which can be built and packaged separately by descending into
|
||||
their respective sub-directories.
|
||||
* Notes to Packagers
|
||||
|
||||
Non-Mixer, Non-DAW, and Non-Session-Manager, although stored in the
|
||||
same repository, are completely independent programs which can be
|
||||
built and packaged separately (see README.build)
|
||||
|
||||
If you're having trouble adapting to Non's build system, please
|
||||
contact me directly or post to one of the Non mailing lists with your
|
||||
|
@ -23,3 +25,4 @@ Thanks,
|
|||
Jonathan Moore Liles <male@tuxfamily.net>
|
||||
|
||||
P.S. Furthermore, please quit listing crazy random stuff as dependencies.
|
||||
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 720d8d33200ebd030df700c6c7a5a9cdf4581c03
|
142
mixer/Makefile
|
@ -1,142 +0,0 @@
|
|||
|
||||
###############################################################################
|
||||
# Copyright (C) 2008 Jonathan Moore Liles #
|
||||
# #
|
||||
# This program is free software; you can redistribute it and/or modify it #
|
||||
# under the terms of the GNU General Public License as published by the #
|
||||
# Free Software Foundation; either version 2 of the License, or (at your #
|
||||
# option) any later version. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT #
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
|
||||
# more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License along #
|
||||
# with This program; see the file COPYING. If not,write to the Free Software #
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
|
||||
###############################################################################
|
||||
|
||||
## Makefile for the Non-DAW.
|
||||
|
||||
##
|
||||
## Do not edit this file; run `make config` instead.
|
||||
##
|
||||
|
||||
VERSION := 1.1.0
|
||||
PACKAGE := MIXER
|
||||
|
||||
all: .config
|
||||
|
||||
.config: configure
|
||||
@ echo '<<< Configuring '$(PACKAGE)
|
||||
@ ./configure
|
||||
|
||||
config:
|
||||
@ echo '<<< Configuring '$(PACKAGE)
|
||||
@ ./configure
|
||||
|
||||
-include .config
|
||||
|
||||
export SYSTEM_PATH:=$(prefix)/share/
|
||||
export DOCUMENT_PATH:=$(prefix)/share/doc/
|
||||
export PIXMAP_PATH:=$(prefix)/share/pixmaps/
|
||||
export ICON_PATH:=$(prefix)/share/icons/
|
||||
export DESKTOP_PATH:=$(prefix)/share/applications/
|
||||
|
||||
|
||||
# a bit of a hack to make sure this runs before any rules
|
||||
ifneq ($(CALCULATING),yes)
|
||||
TOTAL := $(shell $(MAKE) CALCULATING=yes -n 2>/dev/null | sed -n 's/^.*Compiling: \([^"]\+\)"/\1/p' > .files )
|
||||
endif
|
||||
|
||||
ifeq ($(USE_DEBUG),yes)
|
||||
CFLAGS := -pipe -ggdb -fno-inline -Wall -Wextra -O0
|
||||
CXXFLAGS := -Wnon-virtual-dtor -Wno-missing-field-initializers -fno-rtti -fno-exceptions
|
||||
else
|
||||
CFLAGS := -pipe -O2 -DNDEBUG
|
||||
CXXFLAGS := -fno-rtti -fno-exceptions
|
||||
endif
|
||||
|
||||
|
||||
CFLAGS+=-DVERSION=\"$(VERSION)\" \
|
||||
-DINSTALL_PREFIX=\"$(prefix)\" \
|
||||
-DSYSTEM_PATH=\"$(SYSTEM_PATH)\" \
|
||||
-DDOCUMENT_PATH=\"$(DOCUMENT_PATH)\" \
|
||||
-DPIXMAP_PATH=\"$(PIXMAP_PATH)\"
|
||||
|
||||
CXXFLAGS := $(CFLAGS) $(CXXFLAGS)
|
||||
|
||||
INCLUDES := -I. -Iutil -IFL -Inonlib
|
||||
|
||||
include scripts/colors
|
||||
|
||||
ifneq ($(CALCULATING),yes)
|
||||
COMPILING="$(BOLD)$(BLACK)MIXER [$(SGR0)$(CYAN)`scripts/percent-complete .files "$<"`$(SGR0)$(BOLD)$(BLACK)]$(SGR0) $(BOLD)$(YELLOW)$<$(SGR0)"
|
||||
else
|
||||
COMPILING="Compiling: $<"
|
||||
endif
|
||||
|
||||
.C.o:
|
||||
@ echo $(COMPILING)
|
||||
@ $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@
|
||||
|
||||
%.C : %.fl
|
||||
@ cd `dirname $<` && fluid -c ../$<
|
||||
|
||||
DONE := $(BOLD)$(GREEN)done$(SGR0)
|
||||
|
||||
include FL/makefile.inc
|
||||
#include nonlib/makefile.inc
|
||||
include makefile.inc
|
||||
|
||||
SRCS:=$(Mixer_SRCS)
|
||||
OBJS:=$(Mixer_OBJS)
|
||||
CXXFLAGS += $(Mixer_CFLAGS)
|
||||
|
||||
# FIXME: isn't there a better way?
|
||||
$(OBJS): .config Makefile
|
||||
|
||||
TAGS: $(SRCS)
|
||||
etags $(SRCS)
|
||||
|
||||
.deps: .config $(SRCS)
|
||||
ifneq ($(CALCULATING),yes)
|
||||
@ echo -n Calculating dependencies...
|
||||
@ makedepend -f- -- $(CXXFLAGS) $(INCLUDES) -- $(SRCS) 2>/dev/null > .deps && echo $(DONE)
|
||||
@ # gcc -M $(CXXFLAGS) $(INCLUDES) $(SRCS) > .deps && echo $(DONE)
|
||||
endif
|
||||
|
||||
|
||||
install: all
|
||||
@ echo -n "Installing..."
|
||||
@ install src/mixer "$(DESTDIR)$(prefix)"/bin/non-mixer
|
||||
@ mkdir -p "$(DESTDIR)$(SYSTEM_PATH)"/non-mixer
|
||||
@ $(MAKE) -s -C doc install
|
||||
@ install -d "$(DESTDIR)$(PIXMAP_PATH)/non-mixer"
|
||||
@ install -m 644 icons/hicolor/256x256/apps/non-mixer.png "$(DESTDIR)$(PIXMAP_PATH)"/non-mixer/icon-256x256.png
|
||||
@ install -d "$(DESTDIR)$(ICON_PATH)/hicolor"
|
||||
@ cp -au icons/hicolor/ "$(DESTDIR)$(ICON_PATH)"
|
||||
@ install -d "$(DESTDIR)$(DESKTOP_PATH)"
|
||||
@ sed 's:@BIN_PATH@:$(prefix)/bin:' non-mixer.desktop.in > "$(DESTDIR)$(DESKTOP_PATH)/non-mixer.desktop"
|
||||
@ echo "$(DONE)"
|
||||
ifneq ($(USE_DEBUG),yes)
|
||||
@ echo -n "Stripping..."
|
||||
@ strip $(DESTDIR)$(prefix)/bin/non-mixer
|
||||
@ echo "$(DONE)"
|
||||
endif
|
||||
|
||||
clean_deps:
|
||||
@ rm -f .deps
|
||||
|
||||
.PHONEY: clean config depend clean_deps
|
||||
|
||||
clean: FL_clean Mixer_clean
|
||||
|
||||
dist:
|
||||
git archive --prefix=non-mixer-$(VERSION)/ v$(VERSION) | bzip2 > non-mixer-$(VERSION).tar.bz2
|
||||
|
||||
scan-gpl:
|
||||
@ scripts/scan-gpl $(SRCS) || echo $(BOLD)$(RED)Some source files do not contain proper license information!
|
||||
|
||||
-include .deps
|
|
@ -1,29 +0,0 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2008 Jonathan Moore Liles
|
||||
# This file is licensed under version 2 of the GPL.
|
||||
|
||||
. scripts/config-funcs
|
||||
|
||||
begin
|
||||
|
||||
begin_options
|
||||
|
||||
ask "Installation prefix" prefix /usr/local
|
||||
ask "Build for debugging" USE_DEBUG no
|
||||
|
||||
begin_tests
|
||||
|
||||
require_FLTK 1.1.7 images
|
||||
require_command FLUID fluid
|
||||
require_command ar ar
|
||||
require_command makedepend makedepend
|
||||
require_package JACK 0.103.0 jack
|
||||
require_package lrdf 0.4.0 lrdf
|
||||
require_package liblo 0.23 liblo
|
||||
require_package sigcpp 2.0.0 sigc++-2.0
|
||||
suggest_package XPM 2.0.0 xpm
|
||||
|
||||
test_version `version_of liblo` 0.26 || warn "Version $(version_of liblo) of liblo is slow to create servers. Consider upgrading to 0.26 or later"
|
||||
|
||||
end
|
|
@ -6,52 +6,74 @@
|
|||
<title>Non Mixer User Manual</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id=cover>
|
||||
<h1>Non Mixer User Manual</h1>
|
||||
<h3></h3>
|
||||
<address>
|
||||
Jonathan Moore Liles <a href="mailto:male@tuxfamily.org"><male@tuxfamily.org></a><br>
|
||||
January 21, 2010<br>
|
||||
<br>
|
||||
|
||||
</address><hr></div>
|
||||
<div id=body>
|
||||
<div id=toc>
|
||||
<h1 id=toc>Table Of Contents</h1>
|
||||
<ul>
|
||||
<li><a href="#n:1.">1. User Manual</a>
|
||||
<ul><li><a href="#n:1.1.">1.1. The Mixer</a>
|
||||
<li><a href="#n:1.">1. Non Mixer User Manual</a>
|
||||
<ul><li><a href="#n:1.1.">1.1. Mixer Groups</a>
|
||||
|
||||
<ul><li><a href="#n:1.1.1.">1.1.1. Display Options</a>
|
||||
<ul><li><a href="#n:1.1.1.">1.1.1. How to Choose Groupings</a>
|
||||
|
||||
<li><a href="#n:1.1.2.">1.1.2. Mixer Strips</a>
|
||||
<li><a href="#n:1.1.2.">1.1.2. Considering JACK Overhead</a>
|
||||
|
||||
<ul><li><a href="#n:1.1.2.1.">1.1.2.1. Navigation</a>
|
||||
<li><a href="#n:1.1.3.">1.1.3. Creating a New Group</a>
|
||||
|
||||
<li><a href="#n:1.1.2.2.">1.1.2.2. Control</a>
|
||||
<li><a href="#n:1.1.4.">1.1.4. Adding a Strip to an Existing Group</a>
|
||||
|
||||
<li><a href="#n:1.1.2.3.">1.1.2.3. Signal Chain</a>
|
||||
<li><a href="#n:1.1.5.">1.1.5. Removing a Strip from a Group</a>
|
||||
|
||||
<ul><li><a href="#n:1.1.2.3.1.">1.1.2.3.1. Modules</a>
|
||||
<li><a href="#n:1.1.6.">1.1.6. Removing a Group</a>
|
||||
|
||||
<ul><li><a href="#n:1.1.2.3.1.1.">1.1.2.3.1.1. OSC Control</a>
|
||||
<li><a href="#n:1.1.7.">1.1.7. Monitoring Group DSP Load</a>
|
||||
|
||||
<li><a href="#n:1.1.2.3.1.2.">1.1.2.3.1.2. Manipulation</a>
|
||||
</ul><li><a href="#n:1.2.">1.2. Mixer Strips</a>
|
||||
|
||||
<li><a href="#n:1.1.2.3.1.3.">1.1.2.3.1.3. Module Parameter Editor</a>
|
||||
<ul><li><a href="#n:1.2.1.">1.2.1. Navigation</a>
|
||||
|
||||
<li><a href="#n:1.1.2.3.1.4.">1.1.2.3.1.4. Controls</a>
|
||||
<li><a href="#n:1.2.2.">1.2.2. Control</a>
|
||||
|
||||
<ul><li><a href="#n:1.1.2.3.1.4.1.">1.1.2.3.1.4.1. Control Voltages</a>
|
||||
<li><a href="#n:1.2.3.">1.2.3. Signal Chain</a>
|
||||
|
||||
</ul><li><a href="#n:1.1.2.3.1.5.">1.1.2.3.1.5. Spatialization </a>
|
||||
<ul><li><a href="#n:1.2.3.1.">1.2.3.1. Modules</a>
|
||||
|
||||
</ul></ul></ul><li><a href="#n:1.1.3.">1.1.3. Projects</a>
|
||||
<ul><li><a href="#n:1.2.3.1.1.">1.2.3.1.1. OSC Control</a>
|
||||
|
||||
<ul><li><a href="#n:1.1.3.1.">1.1.3.1. JACK I/O</a>
|
||||
<li><a href="#n:1.2.3.1.2.">1.2.3.1.2. MIDI Control</a>
|
||||
|
||||
</ul></ul></ul></ul></ul><hr></div>
|
||||
<h1 id="n:1.">1. User Manual</h1>
|
||||
<h2 id="n:1.1.">1.1. The Mixer</h2>
|
||||
<li><a href="#n:1.2.3.1.3.">1.2.3.1.3. Manipulation</a>
|
||||
|
||||
<li><a href="#n:1.2.3.1.4.">1.2.3.1.4. Module Parameter Editor</a>
|
||||
|
||||
<li><a href="#n:1.2.3.1.5.">1.2.3.1.5. Controls</a>
|
||||
|
||||
<ul><li><a href="#n:1.2.3.1.5.1.">1.2.3.1.5.1. Control Voltages</a>
|
||||
|
||||
</ul><li><a href="#n:1.2.3.1.6.">1.2.3.1.6. Spatialization </a>
|
||||
|
||||
<ul><li><a href="#n:1.2.3.1.6.1.">1.2.3.1.6.1. Spatializer Module</a>
|
||||
|
||||
<ul><li><a href="#n:1.2.3.1.6.1.1.">1.2.3.1.6.1.1. Reverb Routing</a>
|
||||
|
||||
</ul><li><a href="#n:1.2.3.1.6.2.">1.2.3.1.6.2. LADSPA Plugins</a>
|
||||
|
||||
</ul></ul></ul></ul><li><a href="#n:1.3.">1.3. Spatialization Console</a>
|
||||
|
||||
<li><a href="#n:1.4.">1.4. Projects</a>
|
||||
|
||||
<ul><li><a href="#n:1.4.1.">1.4.1. JACK I/O</a>
|
||||
|
||||
</ul></ul></ul></ul><hr></div>
|
||||
<h1 id="n:1.">1. Non Mixer User Manual</h1>
|
||||
<center><div class="fig image"><table id="Fig.1.1" border=1>
|
||||
<caption>
|
||||
<strong>Fig. 1.1.</strong> Mixer
|
||||
|
@ -75,11 +97,110 @@ Start by creating a new project (menu item <tt>Project/New</tt>).
|
|||
<p>
|
||||
After the project has been created. Hit <tt>a</tt> or choose <tt>Mixer/Add Strip</tt> from the menu to add a new strip to the mixer.
|
||||
</p>
|
||||
<h3 id="n:1.1.1.">1.1.1. Display Options</h3>
|
||||
<h2 id="n:1.1.">1.1. Mixer Groups</h2>
|
||||
<center><div class="fig image"><table border=1>
|
||||
<tr><td><img src="group-dropdown.png" alt="fig. "></td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
The display options, found in the <tt>Options/Display</tt> submenu may be adjusted to suit your needs. Set the color scheme, widget style, and other graphic options to your liking. These options are global and affect all projects.
|
||||
Groups serve several purposes. Firstly, they allow for some organization of strips. Groups also allow parallel relationships of mixer strips to be made explicit. This has important performance implications in JACK2. Non Mixer supports an unlimited number of groups, each of which can contain an unlimited number of mixer strips.
|
||||
</p>
|
||||
<h3 id="n:1.1.2.">1.1.2. Mixer Strips</h3>
|
||||
<h3 id="n:1.1.1.">1.1.1. How to Choose Groupings</h3>
|
||||
<p>
|
||||
All strips in a group should be completely parallel with no feedback loop connections. A typical group might be named 'Input' and contain all input strips (strips that accept input from Non Timeline and have outputs all connecting to some master bus).
|
||||
</p>
|
||||
<p>
|
||||
To put it another way, if you have 100 inputs strips with identical output configurations (e.g. stereo or B-Format), that all connect to a master bus, then you have a candidate for a group.
|
||||
</p>
|
||||
<h3 id="n:1.1.2.">1.1.2. Considering JACK Overhead</h3>
|
||||
<p>
|
||||
JACK provides immense flexibility. But, as in most situations, that flexibility comes with a cost. In JACK the cost is a context switch per client. This applies <i>even for many clients which belong to the same process</i>, as in Non Mixer. Various factors go into determining the price of a context switch on any given system. It's not very expensive, but it does add up. It becomes problematic in sessions involving many clients (think 100s), each of which having a small DSP load (often smaller than the cost of JACK's context context switch). JACK <b>could</b> be smart enough to recognize that some clients belong to the same process and could be executed serially without requiring a context switch, but at the time of writing neither JACK1 nor JACK2's scheduling is that smart.
|
||||
</p>
|
||||
<p>
|
||||
If you're mixing a normal song (couple of dozen tracks) at low latency, this overhead will probably account for less than 1% of the total DSP load. If you're mixing an entire orchestra at ultra-low latency, then it might account for a quarter or more of the total DSP load.
|
||||
</p>
|
||||
<p>
|
||||
Groups mitigate this cost by reducing the number of JACK clients required for a mix. Strips in a group will execute serially without context switches or thread synchronization--reducing the total JACK overhead. However, if you have several groups, then they may all by run in parallel by JACK2.
|
||||
</p>
|
||||
<p>
|
||||
<p>
|
||||
To illustrate this point here are some figures from an actual song session including the whole Non suite plus a sampler, a synth and an ambisonics convolution reverb with a total of 13 strips in 4 groups in different configurations on the same system.
|
||||
</p>
|
||||
<p>
|
||||
JACK's DSP load figures are interpreted thus: if at a 2.7ms software latency setting the average time a proces cycle takes to complete is 2.7ms, then the DSP load is 100%. The usable ceiling on DSP load is 80%. This is true for both JACK1 and JACK2. The difference is that JACK2 may use all available CPU cores to execute the graph (if there are enough clients in parallel signal flow).
|
||||
</p>
|
||||
<p>
|
||||
32-bit Intel Core2 Duo @1.6Ghz -r 48000 -p 256 -n 2 (5.3ms)
|
||||
</p>
|
||||
<center><div class="fig table"><table border=1>
|
||||
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr>
|
||||
<tr><td>JACK1</td><td>N</td><td>39%</td></tr>
|
||||
<tr><td>JACK1</td><td>Y</td><td>27%</td></tr>
|
||||
<tr><td>JACK2</td><td>N</td><td>24%</td></tr>
|
||||
<tr><td>JACK2</td><td>Y</td><td>31%</td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 256 -n 2 (5.3ms)
|
||||
</p>
|
||||
<center><div class="fig table"><table border=1>
|
||||
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr>
|
||||
<tr><td>JACK1</td><td>N</td><td>28%</td></tr>
|
||||
<tr><td>JACK1</td><td>Y</td><td>12%</td></tr>
|
||||
<tr><td>JACK2</td><td>N</td><td>12%</td></tr>
|
||||
<tr><td>JACK2</td><td>Y</td><td>11%</td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 128 -n 2 (2.7ms)
|
||||
</p>
|
||||
<center><div class="fig table"><table border=1>
|
||||
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr>
|
||||
<tr><td>JACK1</td><td>N</td><td>29%</td></tr>
|
||||
<tr><td>JACK1</td><td>Y</td><td>17%</td></tr>
|
||||
<tr><td>JACK2</td><td>N</td><td>17%</td></tr>
|
||||
<tr><td>JACK2</td><td>Y</td><td>17%</td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 32 -n 2 (0.7ms)
|
||||
</p>
|
||||
<center><div class="fig table"><table border=1>
|
||||
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr>
|
||||
<tr><td>JACK1</td><td>N</td><td>x</td></tr>
|
||||
<tr><td>JACK1</td><td>Y</td><td>x</td></tr>
|
||||
<tr><td>JACK2</td><td>N</td><td>43%</td></tr>
|
||||
<tr><td>JACK2</td><td>Y</td><td>41%</td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
As you can see, for multiprocessor systems, JACK2 clearly has an advantage even without grouping.
|
||||
</p>
|
||||
<p>
|
||||
Of course, results will vary depending on the system and the mix. On the dual core system, performance actually degraded with JACK2 when using groups--this is because the number of parallel flows that JACK2 detected was reduced and the second core was being under utilized. Similarly, the performance of the 8-core AMD system doesn't seem that great even in the ungrouped mode--this is because the DSP load of each individual client is around the same as the cost of the context switching. It's a wash either way (if each strip had more or more complex modules on it, then the ungrouped mode would probably perform better). Since JACK1 cannot take advantage of more than 1 CPU core, there is no benefit to parallelism and grouped mode always outperforms ungrouped mode.
|
||||
</p>
|
||||
<p>
|
||||
So, for maximum capacity the combination of a multicore CPU with JACK2 and mixer groups is best.
|
||||
</p>
|
||||
<h3 id="n:1.1.3.">1.1.3. Creating a New Group</h3>
|
||||
<p>
|
||||
Groups can be created by selecting the group dropdown on any mixer strip and choosing 'New Group'. A window will popup asking for a group name. Group names must be unique. The group will then be created and the selected strip added to it.
|
||||
</p>
|
||||
<h3 id="n:1.1.4.">1.1.4. Adding a Strip to an Existing Group</h3>
|
||||
<p>
|
||||
To add a strip to an existing group, simply select a group name from the group dropdown on the strip.
|
||||
</p>
|
||||
<h3 id="n:1.1.5.">1.1.5. Removing a Strip from a Group</h3>
|
||||
<p>
|
||||
Select '---' from the group dropdown. The strip will be removed from the group and will run in an independent JACK client.
|
||||
</p>
|
||||
<h3 id="n:1.1.6.">1.1.6. Removing a Group</h3>
|
||||
<p>
|
||||
Groups are destroyed automatically as soon as they contain zero strips.
|
||||
</p>
|
||||
<h3 id="n:1.1.7.">1.1.7. Monitoring Group DSP Load</h3>
|
||||
<p>
|
||||
Above the grop dropdown on each strip is a DSP load meter for the selected group. For ungrouped strips or strips which are the only one in their group, this is simply the DSP load of the single strip.
|
||||
</p>
|
||||
<p>
|
||||
If DSP usage goes up when strips are fed silence, then you're probably running a plugin which has denormal issues.
|
||||
</p>
|
||||
<h2 id="n:1.2.">1.2. Mixer Strips</h2>
|
||||
<center><div class="fig image"><table id="Fig.1.3" border=1>
|
||||
<caption>
|
||||
<strong>Fig. 1.3.</strong> Mixer Strip
|
||||
|
@ -100,19 +221,19 @@ The fader view comprises a large gain control and digital peak meter indicator.
|
|||
<p>
|
||||
To see how an audio signal traveling through this strip will be processed, switch to its <i>signal</i> view.
|
||||
</p>
|
||||
<h4 id="n:1.1.2.1.">1.1.2.1. Navigation</h4>
|
||||
<h3 id="n:1.2.1.">1.2.1. Navigation</h3>
|
||||
<p>
|
||||
A strip is focused when you click on it. Focus can be moved among strips with the <tt>Tab</tt> and <tt>Shift-Tab</tt> keys.
|
||||
</p>
|
||||
<h4 id="n:1.1.2.2.">1.1.2.2. Control</h4>
|
||||
<h3 id="n:1.2.2.">1.2.2. Control</h3>
|
||||
<p>
|
||||
The focused strip can be moved in the display order via the <tt>[</tt> and <tt>]</tt> keys. <tt>Delete</tt> removes a strip (with confirmation dialog). <tt>n</tt> and <tt>w</tt> set the focused strip's width to <i>narrow</i> or <i>wide</i>, respectively, and <tt>f</tt> and <tt>s</tt> switch between <i>fader</i> and <i>signal</i> views. The strip's context menu can be invoked without the mouse by hitting the <tt>Menu</tt> key (assuming your keyboard has one).
|
||||
The focused strip can be moved in the display order via the <tt>[</tt> and <tt>]</tt> keys. <tt>Delete</tt> removes a strip (with confirmation dialog). <tt>n</tt> and <tt>w</tt> set the focused strip's width to <i>narrow</i> or <i>wide</i>, respectively, and <tt>f</tt> and <tt>s</tt> switch between <i>fader</i> and <i>signal</i> views. The strip's context menu can be invoked without the mouse by hitting the <tt>Menu</tt> key (assuming your keyboard has one).
|
||||
</p>
|
||||
<h4 id="n:1.1.2.3.">1.1.2.3. Signal Chain</h4>
|
||||
<h3 id="n:1.2.3.">1.2.3. Signal Chain</h3>
|
||||
<p>
|
||||
The signal chain view of a mixer strip provides a way to view and manipulate the signal processing of a mixer strip.
|
||||
</p>
|
||||
<h5 id="n:1.1.2.3.1.">1.1.2.3.1. Modules</h5>
|
||||
<h4 id="n:1.2.3.1.">1.2.3.1. Modules</h4>
|
||||
<center><div class="fig image"><table id="Fig.1.4" border=1>
|
||||
<caption>
|
||||
<strong>Fig. 1.4.</strong> Modules
|
||||
|
@ -144,10 +265,14 @@ Non Mixer has several built-in modules. They are:
|
|||
<dd>Digital Peak Meter</dd>
|
||||
<dt><em>Mono Pan</em></dt>
|
||||
<dd>Performs intensity panning of a mono signal into a stereo signal.</dd>
|
||||
<dt><em>Aux</em></dt>
|
||||
<dd>Provides auxiliary outputs</dd>
|
||||
<dt><em>Spatializer</em></dt>
|
||||
<dd>Provides advanced Ambisonics spatialization with distance simulation.</dd>
|
||||
<dt><em>Plugin</em></dt>
|
||||
<dd>Hosts a LADSPA plugin</dd>
|
||||
</dl>
|
||||
<h6 id="n:1.1.2.3.1.1.">1.1.2.3.1.1. OSC Control</h6>
|
||||
<h5 id="n:1.2.3.1.1.">1.2.3.1.1. OSC Control</h5>
|
||||
<p>
|
||||
The input parameters of all modules are controllable via OSC, regardless of whether the parameter is set as controllable.
|
||||
</p>
|
||||
|
@ -182,9 +307,25 @@ If same module/plugin is used twice in a signal chain (e.g. multiple Gain stages
|
|||
For the second instance of the Gain module on the strip named 'Foo'.
|
||||
</p>
|
||||
<p>
|
||||
There's a possibility to get exact OSC path for module controls. For this you need to switch strip mode to 'Signl', right click a module, for example 'Gain', and open 'Edit parameters' dialog. OSC path will be shown in a statusbar of the main window when you hover a parameter.
|
||||
</p>
|
||||
<p>
|
||||
Non-DAW accesses these same signals via a more advanced signal routing layer on top of OSC. Any module parameter is easily controlled via Control Sequences in Non-DAW without the need to specify an OSC URL.
|
||||
</p>
|
||||
<h6 id="n:1.1.2.3.1.2.">1.1.2.3.1.2. Manipulation</h6>
|
||||
<h5 id="n:1.2.3.1.2.">1.2.3.1.2. MIDI Control</h5>
|
||||
<p>
|
||||
Automatic translation between MIDI and Non's OSC Signals can be achieved by adding the headless program <tt>non-midi-mapper</tt> (included in the Non-Mixer distribution) to an NSM session.
|
||||
</p>
|
||||
<p>
|
||||
Non-MIDI-Mapper provides JACK MIDI input and output ports that can be connected to a suitable controller device.
|
||||
</p>
|
||||
<p>
|
||||
In Non-Mixer, the <tt>Remote Control/Start Learning</tt> menu item enters learning mode in which Non Mixer can be taught which controls to associated with which MIDI messages by clicking a control in Non-Mixer and moving the desired control on the MIDI device. <tt>Remote Control/End Learning</tt> ends the learning session.
|
||||
</p>
|
||||
<p>
|
||||
The mapping will be saved with the NSM session.
|
||||
</p>
|
||||
<h5 id="n:1.2.3.1.3.">1.2.3.1.3. Manipulation</h5>
|
||||
<p>
|
||||
Left-clicking on a module brings up a Module Parameter Editor window for the selected module.
|
||||
</p>
|
||||
|
@ -200,41 +341,27 @@ Control+Right-clicking on a module causes it to be removed from the chain (modul
|
|||
<p>
|
||||
The focused module may also be controlled via the keyboard. <tt>Menu</tt> brings up the context menu for the focused module. <tt>Space</tt> opens the module parameter editor, <tt>b</tt> toggles the bypassed state, and <tt>Delete</tt> removes the module from the chain (without confirmation!). <tt>Control-X</tt>, <tt>Control-C</tt> and <tt>Control-V</tt>, cut, copy, and paste modules, respectively. Modules may be copied within or across chain boundaries. The normal module I/O constraints also apply to pasted modules.
|
||||
</p>
|
||||
<h6 id="n:1.1.2.3.1.3.">1.1.2.3.1.3. Module Parameter Editor</h6>
|
||||
<h5 id="n:1.2.3.1.4.">1.2.3.1.4. Module Parameter Editor</h5>
|
||||
<center><div class="fig image"><table id="Fig.1.5" border=1>
|
||||
<caption>
|
||||
<strong>Fig. 1.5.</strong> Module Parameter Editor
|
||||
</caption>
|
||||
|
||||
<tr><td><img src="gverb-parameters-knobs.png" alt="fig. 1.5"></td></tr>
|
||||
<tr><td><img src="module-parameter-editor.png" alt="fig. 1.5"></td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
The Module Parameter Editor is used to alter the values of a module's parameters, and in addition, to bind its parameters to controls. A menu button in the upper left-hand corner allows you to select between knob, vertical slider and horizontal slider controls.
|
||||
</p>
|
||||
<center><div class="fig image"><table id="Fig.1.6" border=1>
|
||||
<caption>
|
||||
<strong>Fig. 1.6.</strong> Horizontal Sliders
|
||||
</caption>
|
||||
|
||||
<tr><td><img src="gverb-parameters-hsliders.png" alt="fig. 1.6"></td></tr>
|
||||
</table></div></center>
|
||||
<center><div class="fig image"><table id="Fig.1.7" border=1>
|
||||
<caption>
|
||||
<strong>Fig. 1.7.</strong> Vertical Sliders
|
||||
</caption>
|
||||
|
||||
<tr><td><img src="gverb-parameters-vsliders.png" alt="fig. 1.7"></td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
Underneath each control is a bind button. Clicking adds a new control to the chain's <i>Controls</i> view and binds it to the parameter in question. For simplicity, only one control at a time may be bound to a given parameter.
|
||||
</p>
|
||||
<h6 id="n:1.1.2.3.1.4.">1.1.2.3.1.4. Controls</h6>
|
||||
<center><div class="fig image"><table id="Fig.1.8" border=1>
|
||||
<h5 id="n:1.2.3.1.5.">1.2.3.1.5. Controls</h5>
|
||||
<center><div class="fig image"><table id="Fig.1.6" border=1>
|
||||
<caption>
|
||||
<strong>Fig. 1.8.</strong> Control View
|
||||
<strong>Fig. 1.6.</strong> Control View
|
||||
</caption>
|
||||
|
||||
<tr><td><img src="controls.png" alt="fig. 1.8"></td></tr>
|
||||
<tr><td><img src="controls.png" alt="fig. 1.6"></td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
The control view of a chain groups together all of the controls bound to parameters of modules in that chain. The default mode of controls is <i>Manual</i>. Right click on a control to bring up a menu which will allow you to select one of the available control I/O methods to use. When <i>Control Voltage</i> (CV) is selected, a CV input port will be created on the containing mixer strip's JACK client. The control will now accept values from that input. A control bound and configured in this way can then be connected to the output of a Non-DAW control sequence using your favorite connection manager.
|
||||
|
@ -247,7 +374,7 @@ events. Hold down the `Ctrl` key while scrolling the mousewheel to
|
|||
achieve finer resolution.
|
||||
</td></table>
|
||||
</div>
|
||||
<h7 id="n:1.1.2.3.1.4.1.">1.1.2.3.1.4.1. Control Voltages</h7>
|
||||
<h6 id="n:1.2.3.1.5.1.">1.2.3.1.5.1. Control Voltages</h6>
|
||||
<p>
|
||||
The control voltage concept should be familiar to anyone who has experience with analog modular synthesizers. MIDI, while having definite advantages in many respects, multiplexes control data in such a way as to make connecting one MIDI control to a parameter involve a significant inconvenience, usually requiring the adjustment of settings on both ends of the connection in order to separate the control data streams.
|
||||
</p>
|
||||
|
@ -266,23 +393,71 @@ of parameter automation, as LADSPA plugins are incapable of
|
|||
processing Control Voltage signals at full audio resolution anyway.
|
||||
</td></table>
|
||||
</div>
|
||||
<h6 id="n:1.1.2.3.1.5.">1.1.2.3.1.5. Spatialization </h6>
|
||||
<center><div class="fig image"><table id="Fig.1.9" border=1>
|
||||
<caption>
|
||||
<strong>Fig. 1.9.</strong> Spatialization Control on a Strip
|
||||
</caption>
|
||||
|
||||
<tr><td><img src="spatialization-on-strip.png" alt="fig. 1.9"></td></tr>
|
||||
<h5 id="n:1.2.3.1.6.">1.2.3.1.6. Spatialization </h5>
|
||||
<h6 id="n:1.2.3.1.6.1.">1.2.3.1.6.1. Spatializer Module</h6>
|
||||
<center><div class="fig image"><table border=1>
|
||||
<tr><td><img src="spatializer-module.png" alt="fig. "></td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
Non-Mixer supports Ambisonic spatialization via the excellent amb-* LADSPA plugin set and others. Whenever a LADSPA plugin is added to a strip whose set of parameters include parameters named Azimuth and Elevation, Non-Mixer will detect this and automatically attach a Spatializer control to these parameters. The Spatializer will be displayed at the bottom of the mixer strip. A larger version of the control may also be found in the Module Parameter Editor.
|
||||
The Spatializer Module included with Non Mixer allows one to not only control the position of a sound source (angle and elevation), but also to control it's apparent distance from the listener.
|
||||
</p>
|
||||
<center><div class="fig image"><table id="Fig.1.10" border=1>
|
||||
<p>
|
||||
Distance cues are based on physical properties--the speed of sound in air, the damping effect of humidity, the ratio of reverb early and late reflections, the volume of the sound.
|
||||
</p>
|
||||
<p>
|
||||
In legacy mixers, all of these properties must be controlled individually by the engineer. This is nearly always a process of trial and error. Much of a studio engineers' skill lies in his ability to guess at these values and arrive at a reasonably realistic sounding result.
|
||||
</p>
|
||||
<p>
|
||||
Non Mixer eliminates the guesswork and combines all of these controls into a single spatialization point encoding both a sound source's position relative to the listener and its distance. No matter where the point is placed, the result will be realistic.
|
||||
</p>
|
||||
<p>
|
||||
Use of the Spatializer Modules eliminates much complexity from the mixing process. No more back and forth, no more guessing at values for reverb sends and predelay and EQ. The Spatializer does it all for you.
|
||||
</p>
|
||||
<p>
|
||||
The B-Format outputs of the Spatializer Module are in the order standard order WXYZ.
|
||||
</p>
|
||||
<p>
|
||||
All Spatializer Module instances will present controls and aziumuth, elevation, and radius. Additionally, a <i>Highpass</i> control is provided to compensate for the proximity effect in close-mic'd signals. The default cutoff is 200Hz. Adjust it according to the nature of the input signal.
|
||||
</p>
|
||||
<p>
|
||||
A Spatializer Module fed stereo input will perform stereo encoding and will present a <i>Width</i> control.
|
||||
</p>
|
||||
<h7 id="n:1.2.3.1.6.1.1.">1.2.3.1.6.1.1. Reverb Routing</h7>
|
||||
<p>
|
||||
The Spatializer module is intended to work with an external reverb engine having Ambisonics B-Format inputs for early reflections and a Mono input for reverb tail (and, of course, B-Format outputs).
|
||||
</p>
|
||||
<center><div class="fig image"><table border=1>
|
||||
<tr><td><img src="reverb-routing.png" alt="fig. "></td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
The Spatializer Module has two sets auxiliary outputs for reverb send. One, consisting of a single mono signal, is intended to be connected to the input of a reverb tail, otherwise known as a diffuse field. Another set of outputs in B-Format is indended to be connected to the B-Format inputs of an early reflection reverb engine. The output of the reverb engine should be 100% 'wet'.
|
||||
</p>
|
||||
<p>
|
||||
I have crafted several jconvolver config files that meet these specifications. They can be found in <a class=ext href="http://non.tuxfamily.org/ambiverb.tar.bz2">ambiverb.tar.bz2</a>
|
||||
</p>
|
||||
<p>
|
||||
The main outputs of the strip should go to a master bus, into which the output of the reverb engine is also fed.
|
||||
</p>
|
||||
<h6 id="n:1.2.3.1.6.2.">1.2.3.1.6.2. LADSPA Plugins</h6>
|
||||
<p>
|
||||
There are several Ambisonics panners/encoders released as LADSPA plugins. When one of these plugins is added to a strip, Non Mixer will detect its parameter signature and create a Spatialization Control for it just as with the Spatializer Module.
|
||||
</p>
|
||||
<center><div class="fig image"><table id="Fig.1.7" border=1>
|
||||
<caption>
|
||||
<strong>Fig. 1.10.</strong> Larger Spatialization Control
|
||||
<strong>Fig. 1.7.</strong> Spatialization Control on a Strip
|
||||
</caption>
|
||||
|
||||
<tr><td><img src="spatialization-in-mpe.png" alt="fig. 1.10"></td></tr>
|
||||
<tr><td><img src="spatialization-on-strip.png" alt="fig. 1.7"></td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
Whenever a module is added to a strip whose set of parameters include parameters named Azimuth and Elevation (and perhaps Radius), Non-Mixer will detect this and automatically attach a Spatializer control to these parameters. The Spatializer will be displayed at the bottom of the mixer strip. A larger version of the control may also be found in the Module Parameter Editor.
|
||||
</p>
|
||||
<center><div class="fig image"><table id="Fig.1.8" border=1>
|
||||
<caption>
|
||||
<strong>Fig. 1.8.</strong> Spatialization Control in the Module Parameter Editor
|
||||
</caption>
|
||||
|
||||
<tr><td><img src="spatialization-in-mpe.png" alt="fig. 1.8"></td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
The spatialization control may be visualized as moving the sound source across the surface of a hemispherical dome enclosing the listener.
|
||||
|
@ -290,7 +465,23 @@ The spatialization control may be visualized as moving the sound source across t
|
|||
<p>
|
||||
The output of the spatializing plugin may be routed into a decoding plugin following it the same strip or, more usefully, the output of a number of Ambisonic panning plugins on different strips may be routed (through JACK) into a single master decoder instance on a final strip.
|
||||
</p>
|
||||
<h3 id="n:1.1.3.">1.1.3. Projects</h3>
|
||||
<h2 id="n:1.3.">1.3. Spatialization Console</h2>
|
||||
<center><div class="fig image"><table border=1>
|
||||
<tr><td><img src="spatialization-console.png" alt="fig. "></td></tr>
|
||||
</table></div></center>
|
||||
<p>
|
||||
The Spatialization Console allows the user to view and control all of the source positions in an Ambisonics mix at once.
|
||||
</p>
|
||||
<p>
|
||||
The visibility of the Spatialization Console may be toggled with the <tt>F8</tt> key.
|
||||
</p>
|
||||
<p>
|
||||
The console will display a point for each Spatializer Module or other Ambisonics panner plugin contained in the mix.
|
||||
</p>
|
||||
<p>
|
||||
There are two projections available, Planar and Spherical. The range of the view can be adjusted with the range dropdown in the lower lefthand corner.
|
||||
</p>
|
||||
<h2 id="n:1.4.">1.4. Projects</h2>
|
||||
<p>
|
||||
A Non-Mixer project is a directory where Non-Mixer keeps the strip settings, project specific settings, and some meta-data. A project is completely self-contained. You can rename a project as simply as:
|
||||
</p>
|
||||
|
@ -298,7 +489,7 @@ A Non-Mixer project is a directory where Non-Mixer keeps the strip settings, pro
|
|||
$ mv Project-A Project-B
|
||||
</pre></td></tr>
|
||||
</table></div>
|
||||
<h4 id="n:1.1.3.1.">1.1.3.1. JACK I/O</h4>
|
||||
<h3 id="n:1.4.1.">1.4.1. JACK I/O</h3>
|
||||
<p>
|
||||
Each mixer strip is presented as a separate JACK "client". This helps to avoid the necessity of internally duplicating JACK's routing logic and, with JACK2, permits the possibility of parallel execution of mixer strip signal chains.
|
||||
</p>
|
||||
|
@ -312,12 +503,12 @@ The JACK API makes implementing this far more difficult and kludgey than it shou
|
|||
Please petition your local JACK developer to accept jack_client_set_name() into the API.
|
||||
</td></table>
|
||||
</div>
|
||||
<center><div class="fig image"><table id="Fig.1.11" border=1>
|
||||
<center><div class="fig image"><table id="Fig.1.9" border=1>
|
||||
<caption>
|
||||
<strong>Fig. 1.11.</strong> Patchage
|
||||
<strong>Fig. 1.9.</strong> Patchage
|
||||
</caption>
|
||||
|
||||
<tr><td><img src="non-mixer-and-non-daw-in-patchage.png" alt="fig. 1.11"></td></tr>
|
||||
<tr><td><img src="non-mixer-and-non-daw-in-patchage.png" alt="fig. 1.9"></td></tr>
|
||||
</table></div></center>
|
||||
</div>
|
||||
</body>
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
|
||||
! title Non Mixer User Manual
|
||||
! author Jonathan Moore Liles #(email,male@tuxfamily.org)
|
||||
! date January 21, 2010
|
||||
|
||||
-- Table Of Contents
|
||||
|
||||
: User Manual
|
||||
|
||||
:: The Mixer
|
||||
: Non Mixer User Manual
|
||||
|
||||
/ Mixer
|
||||
< non-mixer-complex.png
|
||||
|
@ -26,13 +23,163 @@
|
|||
After the project has been created. Hit `a` or choose `Mixer\/Add
|
||||
Strip` from the menu to add a new strip to the mixer.
|
||||
|
||||
::: Display Options
|
||||
:: Mixer Groups
|
||||
|
||||
The display options, found in the `Options\/Display` submenu may be adjusted
|
||||
to suit your needs. Set the color scheme, widget style, and other graphic
|
||||
options to your liking. These options are global and affect all projects.
|
||||
< group-dropdown.png
|
||||
|
||||
::: Mixer Strips
|
||||
Groups serve several purposes. Firstly, they allow for some
|
||||
organization of strips. Groups also allow parallel relationships of
|
||||
mixer strips to be made explicit. This has important performance
|
||||
implications in JACK2. Non Mixer supports an unlimited number of
|
||||
groups, each of which can contain an unlimited number of mixer
|
||||
strips.
|
||||
|
||||
::: How to Choose Groupings
|
||||
|
||||
All strips in a group should be completely parallel with no feedback
|
||||
loop connections. A typical group might be named 'Input' and contain
|
||||
all input strips (strips that accept input from Non Timeline and
|
||||
have outputs all connecting to some master bus).
|
||||
|
||||
To put it another way, if you have 100 inputs strips with identical
|
||||
output configurations (e.g. stereo or B-Format), that all connect to
|
||||
a master bus, then you have a candidate for a group.
|
||||
|
||||
::: Considering JACK Overhead
|
||||
|
||||
JACK provides immense flexibility. But, as in most situations, that
|
||||
flexibility comes with a cost. In JACK the cost is a context switch
|
||||
per client. This applies /even for many clients which belong to the
|
||||
same process/, as in Non Mixer. Various factors go into determining
|
||||
the price of a context switch on any given system. It's not very
|
||||
expensive, but it does add up. It becomes problematic in sessions
|
||||
involving many clients (think 100s), each of which having a small
|
||||
DSP load (often smaller than the cost of JACK's context context
|
||||
switch). JACK *could* be smart enough to recognize that some clients
|
||||
belong to the same process and could be executed serially without
|
||||
requiring a context switch, but at the time of writing neither JACK1
|
||||
nor JACK2's scheduling is that smart.
|
||||
|
||||
If you're mixing a normal song (couple of dozen tracks) at low
|
||||
latency, this overhead will probably account for less than 1% of the
|
||||
total DSP load. If you're mixing an entire orchestra at ultra-low
|
||||
latency, then it might account for a quarter or more of the total
|
||||
DSP load.
|
||||
|
||||
Groups mitigate this cost by reducing the number of JACK clients
|
||||
required for a mix. Strips in a group will execute serially without
|
||||
context switches or thread synchronization--reducing the total JACK
|
||||
overhead. However, if you have several groups, then they may all by
|
||||
run in parallel by JACK2.
|
||||
|
||||
A mixer which uses a single JACK client (which is basically the way
|
||||
everything other than Non Mixer has been designed) is not a viable
|
||||
solution by this author's definition, because such a mixer cannot be
|
||||
from/to any other JACK clients without introducing an extra period
|
||||
of latency.
|
||||
|
||||
To illustrate this point here are some figures from an actual song
|
||||
session including the whole Non suite plus a sampler, a synth and an
|
||||
ambisonics convolution reverb with a total of 13 strips in 4 groups
|
||||
in different configurations on the same system.
|
||||
|
||||
JACK's DSP load figures are interpreted thus: if at a 2.7ms software
|
||||
latency setting the average time a proces cycle takes to complete is
|
||||
2.7ms, then the DSP load is 100%. The usable ceiling on DSP load is
|
||||
80%. This is true for both JACK1 and JACK2. The difference is that
|
||||
JACK2 may use all available CPU cores to execute the graph (if
|
||||
there are enough clients in parallel signal flow).
|
||||
|
||||
32-bit Intel Core2 Duo @1.6Ghz -r 48000 -p 256 -n 2 (5.3ms)
|
||||
|
||||
[[ JACK Ver, Groups, DSP Load
|
||||
[[ JACK1, N, 39%
|
||||
[[ JACK1, Y, 27%
|
||||
[[ JACK2, N, 24%
|
||||
[[ JACK2, Y, 31%
|
||||
|
||||
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 256 -n 2 (5.3ms)
|
||||
|
||||
[[ JACK Ver, Groups, DSP Load
|
||||
[[ JACK1, N, 28%
|
||||
[[ JACK1, Y, 12%
|
||||
[[ JACK2, N, 12%
|
||||
[[ JACK2, Y, 11%
|
||||
|
||||
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 128 -n 2 (2.7ms)
|
||||
|
||||
[[ JACK Ver, Groups, DSP Load
|
||||
[[ JACK1, N, 29%
|
||||
[[ JACK1, Y, 17%
|
||||
[[ JACK2, N, 17%
|
||||
[[ JACK2, Y, 17%
|
||||
|
||||
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 32 -n 2 (0.7ms)
|
||||
|
||||
[[ JACK Ver, Groups, DSP Load
|
||||
[[ JACK1, N, x
|
||||
[[ JACK1, Y, x
|
||||
[[ JACK2, N, 43%
|
||||
[[ JACK2, Y, 41%
|
||||
|
||||
As you can see, for multiprocessor systems, JACK2 clearly has an
|
||||
advantage even without grouping.
|
||||
|
||||
Of course, results will vary depending on the system and the mix. On
|
||||
the dual core system, performance actually degraded with JACK2 when
|
||||
using groups--this is because the number of parallel flows that
|
||||
JACK2 detected was reduced and the second core was being under
|
||||
utilized. Similarly, the performance of the 8-core AMD system
|
||||
doesn't seem that great even in the ungrouped mode--this is because
|
||||
the DSP load of each individual client is around the same as the
|
||||
cost of the context switching. It's a wash either way (if each strip
|
||||
had more or more complex modules on it, then the ungrouped mode
|
||||
would probably perform better). Since JACK1 cannot take advantage of
|
||||
more than 1 CPU core, there is no benefit to parallelism and grouped
|
||||
mode always outperforms ungrouped mode.
|
||||
|
||||
So, for maximum capacity the combination of a multicore CPU with
|
||||
JACK2 and mixer groups is best.
|
||||
|
||||
# All strips in a group *MUST* have the same output configuration. All
|
||||
# outputs will be mixed together by identity. That is, the 'AUX \(A\)'
|
||||
# outputs of each strip will be mixed together into a single 'AUX \(A\)'
|
||||
# output of the group. A strip within a group whose output
|
||||
# configuration differs from the group configuration will be marked as
|
||||
# invalid and will not be executed.
|
||||
|
||||
::: Creating a New Group
|
||||
|
||||
Groups can be created by selecting the group dropdown on any mixer
|
||||
strip and choosing 'New Group'. A window will popup asking for a
|
||||
group name. Group names must be unique. The group will then be
|
||||
created and the selected strip added to it.
|
||||
|
||||
::: Adding a Strip to an Existing Group
|
||||
|
||||
To add a strip to an existing group, simply select a group name from
|
||||
the group dropdown on the strip.
|
||||
|
||||
::: Removing a Strip from a Group
|
||||
|
||||
Select '---' from the group dropdown. The strip will be removed from
|
||||
the group and will run in an independent JACK client.
|
||||
|
||||
::: Removing a Group
|
||||
|
||||
Groups are destroyed automatically as soon as they contain zero
|
||||
strips.
|
||||
|
||||
::: Monitoring Group DSP Load
|
||||
|
||||
Above the grop dropdown on each strip is a DSP load meter for the
|
||||
selected group. For ungrouped strips or strips which are the only
|
||||
one in their group, this is simply the DSP load of the single strip.
|
||||
|
||||
If DSP usage goes up when strips are fed silence, then you're
|
||||
probably running a plugin which has denormal issues.
|
||||
|
||||
:: Mixer Strips
|
||||
|
||||
/ Mixer Strip
|
||||
< single-strip.png
|
||||
|
@ -55,12 +202,12 @@
|
|||
To see how an audio signal traveling through this strip will be
|
||||
processed, switch to its /signal/ view.
|
||||
|
||||
:::: Navigation
|
||||
::: Navigation
|
||||
|
||||
A strip is focused when you click on it. Focus can be moved among
|
||||
strips with the `Tab` and `Shift-Tab` keys.
|
||||
|
||||
:::: Control
|
||||
::: Control
|
||||
|
||||
The focused strip can be moved in the display order via the `[` and
|
||||
`]` keys. `Delete` removes a strip (with confirmation dialog). `n`
|
||||
|
@ -68,13 +215,13 @@
|
|||
respectively, and `f` and `s` switch between /fader/ and /signal/
|
||||
views. The strip's context menu can be invoked without the mouse by
|
||||
hitting the `Menu` key (assuming your keyboard has one).
|
||||
|
||||
:::: Signal Chain
|
||||
|
||||
::: Signal Chain
|
||||
|
||||
The signal chain view of a mixer strip provides a way to view and
|
||||
manipulate the signal processing of a mixer strip.
|
||||
|
||||
::::: Modules
|
||||
:::: Modules
|
||||
|
||||
/ Modules
|
||||
< modules.png
|
||||
|
@ -108,10 +255,14 @@
|
|||
= Digital Peak Meter
|
||||
= Mono Pan
|
||||
= Performs intensity panning of a mono signal into a stereo signal.
|
||||
= Aux
|
||||
= Provides auxiliary outputs
|
||||
= Spatializer
|
||||
= Provides advanced Ambisonics spatialization with distance simulation.
|
||||
= Plugin
|
||||
= Hosts a LADSPA plugin
|
||||
|
||||
:::::: OSC Control
|
||||
::::: OSC Control
|
||||
|
||||
The input parameters of all modules are controllable via OSC,
|
||||
regardless of whether the parameter is set as controllable.
|
||||
|
@ -143,12 +294,35 @@
|
|||
|
||||
For the second instance of the Gain module on the strip named 'Foo'.
|
||||
|
||||
There's a possibility to get exact OSC path for module controls.
|
||||
For this you need to switch strip mode to 'Signl', right click a
|
||||
module, for example 'Gain', and open 'Edit parameters' dialog. OSC
|
||||
path will be shown in a statusbar of the main window when you
|
||||
hover a parameter.
|
||||
|
||||
Non-DAW accesses these same signals via a more advanced signal
|
||||
routing layer on top of OSC. Any module parameter is easily
|
||||
controlled via Control Sequences in Non-DAW without the need to
|
||||
specify an OSC URL.
|
||||
|
||||
:::::: Manipulation
|
||||
|
||||
::::: MIDI Control
|
||||
|
||||
Automatic translation between MIDI and Non's OSC Signals can be
|
||||
achieved by adding the headless program `non-midi-mapper` (included in the
|
||||
Non-Mixer distribution) to an NSM session.
|
||||
|
||||
Non-MIDI-Mapper provides JACK MIDI input and output ports that can be
|
||||
connected to a suitable controller device.
|
||||
|
||||
In Non-Mixer, the `Remote Control\/Start Learning` menu item enters learning
|
||||
mode in which Non Mixer can be taught which controls to associated with which
|
||||
MIDI messages by clicking a control in Non-Mixer and moving the desired control
|
||||
on the MIDI device. `Remote Control\/End Learning` ends the learning session.
|
||||
|
||||
The mapping will be saved with the NSM session.
|
||||
|
||||
::::: Manipulation
|
||||
|
||||
Left-clicking on a module brings up a Module Parameter Editor window
|
||||
for the selected module.
|
||||
|
@ -172,28 +346,22 @@
|
|||
boundaries. The normal module I\/O constraints also apply to pasted
|
||||
modules.
|
||||
|
||||
:::::: Module Parameter Editor
|
||||
::::: Module Parameter Editor
|
||||
|
||||
/ Module Parameter Editor
|
||||
< gverb-parameters-knobs.png
|
||||
< module-parameter-editor.png
|
||||
|
||||
The Module Parameter Editor is used to alter the values of a
|
||||
module's parameters, and in addition, to bind its parameters to
|
||||
controls. A menu button in the upper left-hand corner allows you to
|
||||
select between knob, vertical slider and horizontal slider controls.
|
||||
|
||||
/ Horizontal Sliders
|
||||
< gverb-parameters-hsliders.png
|
||||
|
||||
/ Vertical Sliders
|
||||
< gverb-parameters-vsliders.png
|
||||
|
||||
Underneath each control is a bind button. Clicking adds a new
|
||||
control to the chain's /Controls/ view and binds it to the parameter
|
||||
in question. For simplicity, only one control at a time may be bound
|
||||
to a given parameter.
|
||||
|
||||
:::::: Controls
|
||||
::::: Controls
|
||||
|
||||
/ Control View
|
||||
< controls.png
|
||||
|
@ -214,7 +382,7 @@
|
|||
{ events. Hold down the `Ctrl` key while scrolling the mousewheel to
|
||||
{ achieve finer resolution.
|
||||
|
||||
::::::: Control Voltages
|
||||
:::::: Control Voltages
|
||||
|
||||
The control voltage concept should be familiar to anyone who has
|
||||
experience with analog modular synthesizers. MIDI, while having
|
||||
|
@ -242,20 +410,87 @@
|
|||
{ of parameter automation, as LADSPA plugins are incapable of
|
||||
{ processing Control Voltage signals at full audio resolution anyway.
|
||||
|
||||
:::::: Spatialization
|
||||
::::: Spatialization
|
||||
|
||||
:::::: Spatializer Module
|
||||
|
||||
< spatializer-module.png
|
||||
|
||||
The Spatializer Module included with Non Mixer allows one to not
|
||||
only control the position of a sound source (angle and elevation),
|
||||
but also to control it's apparent distance from the listener.
|
||||
|
||||
Distance cues are based on physical properties--the speed of sound
|
||||
in air, the damping effect of humidity, the ratio of reverb early and
|
||||
late reflections, the volume of the sound.
|
||||
|
||||
In legacy mixers, all of these properties must be controlled
|
||||
individually by the engineer. This is nearly always a process of
|
||||
trial and error. Much of a studio engineers' skill lies in his
|
||||
ability to guess at these values and arrive at a reasonably
|
||||
realistic sounding result.
|
||||
|
||||
Non Mixer eliminates the guesswork and combines all of these
|
||||
controls into a single spatialization point encoding both a sound
|
||||
source's position relative to the listener and its distance. No
|
||||
matter where the point is placed, the result will be realistic.
|
||||
|
||||
Use of the Spatializer Modules eliminates much complexity from the
|
||||
mixing process. No more back and forth, no more guessing at values
|
||||
for reverb sends and predelay and EQ. The Spatializer does it all
|
||||
for you.
|
||||
|
||||
The B-Format outputs of the Spatializer Module are in the order
|
||||
standard order WXYZ.
|
||||
|
||||
All Spatializer Module instances will present controls and aziumuth,
|
||||
elevation, and radius. Additionally, a /Highpass/ control is
|
||||
provided to compensate for the proximity effect in close-mic'd
|
||||
signals. The default cutoff is 200Hz. Adjust it according to the
|
||||
nature of the input signal.
|
||||
|
||||
A Spatializer Module fed stereo input will perform stereo encoding
|
||||
and will present a /Width/ control.
|
||||
|
||||
::::::: Reverb Routing
|
||||
|
||||
The Spatializer module is intended to work with an external reverb
|
||||
engine having Ambisonics B-Format inputs for early reflections and a
|
||||
Mono input for reverb tail (and, of course, B-Format outputs).
|
||||
|
||||
< reverb-routing.png
|
||||
|
||||
The Spatializer Module has two sets auxiliary outputs for reverb
|
||||
send. One, consisting of a single mono signal, is intended to be
|
||||
connected to the input of a reverb tail, otherwise known as a
|
||||
diffuse field. Another set of outputs in B-Format is indended to be
|
||||
connected to the B-Format inputs of an early reflection reverb
|
||||
engine. The output of the reverb engine should be 100% 'wet'.
|
||||
|
||||
I have crafted several jconvolver config files that meet these
|
||||
specifications. They can be found in #(url,http:\/\/non.tuxfamily.org\/ambiverb.tar.bz2,ambiverb.tar.bz2)
|
||||
|
||||
The main outputs of the strip should go to a master bus, into which
|
||||
the output of the reverb engine is also fed.
|
||||
|
||||
:::::: LADSPA Plugins
|
||||
|
||||
There are several Ambisonics panners\/encoders released as LADSPA
|
||||
plugins. When one of these plugins is added to a strip, Non Mixer
|
||||
will detect its parameter signature and create a Spatialization
|
||||
Control for it just as with the Spatializer Module.
|
||||
|
||||
/ Spatialization Control on a Strip
|
||||
< spatialization-on-strip.png
|
||||
|
||||
Non-Mixer supports Ambisonic spatialization via the excellent amb-\*
|
||||
LADSPA plugin set and others. Whenever a LADSPA plugin is added to a
|
||||
strip whose set of parameters include parameters named Azimuth and
|
||||
Elevation, Non-Mixer will detect this and automatically attach a
|
||||
Spatializer control to these parameters. The Spatializer will be
|
||||
displayed at the bottom of the mixer strip. A larger version of the
|
||||
control may also be found in the Module Parameter Editor.
|
||||
Whenever a module is added to a strip whose set of parameters
|
||||
include parameters named Azimuth and Elevation (and perhaps Radius),
|
||||
Non-Mixer will detect this and automatically attach a Spatializer
|
||||
control to these parameters. The Spatializer will be displayed at
|
||||
the bottom of the mixer strip. A larger version of the control may
|
||||
also be found in the Module Parameter Editor.
|
||||
|
||||
/ Larger Spatialization Control
|
||||
/ Spatialization Control in the Module Parameter Editor
|
||||
< spatialization-in-mpe.png
|
||||
|
||||
The spatialization control may be visualized as moving the sound
|
||||
|
@ -268,7 +503,23 @@
|
|||
routed (through JACK) into a single master decoder instance on a
|
||||
final strip.
|
||||
|
||||
::: Projects
|
||||
:: Spatialization Console
|
||||
|
||||
< spatialization-console.png
|
||||
|
||||
The Spatialization Console allows the user to view and control all
|
||||
of the source positions in an Ambisonics mix at once.
|
||||
|
||||
The visibility of the Spatialization Console may be toggled with the `F8` key.
|
||||
|
||||
The console will display a point for each Spatializer Module or
|
||||
other Ambisonics panner plugin contained in the mix.
|
||||
|
||||
There are two projections available, Planar and Spherical. The range
|
||||
of the view can be adjusted with the range dropdown in the lower
|
||||
lefthand corner.
|
||||
|
||||
:: Projects
|
||||
|
||||
A Non-Mixer project is a directory where Non-Mixer keeps the strip
|
||||
settings, project specific settings, and some meta-data. A project
|
||||
|
@ -276,7 +527,7 @@
|
|||
|
||||
> $ mv Project-A Project-B
|
||||
|
||||
:::: JACK I/O
|
||||
::: JACK I/O
|
||||
|
||||
Each mixer strip is presented as a separate JACK "client". This
|
||||
helps to avoid the necessity of internally duplicating JACK's
|
||||
|
|
|
@ -12,13 +12,11 @@ OBJS=$(SRCS:.mu=.html)
|
|||
all: $(OBJS)
|
||||
|
||||
upload: all
|
||||
@ ln -sf OVERVIEW.html index.html
|
||||
@ rsync -L mup.css MANUAL.html index.html *.png ssh.tuxfamily.org:/home/non/non-mixer.tuxfamily.org-web/htdocs
|
||||
@ rm -f index.html
|
||||
@ rsync -L mup.css MANUAL.html *.png ssh.tuxfamily.org:/home/non/non-mixer.tuxfamily.org-web/htdocs
|
||||
|
||||
install:
|
||||
@ mkdir -p $(DOCUMENT_PATH)/non-mixer
|
||||
@ cp $(OBJS) *.png mup.css ../../COPYING $(DOCUMENT_PATH)/non-mixer
|
||||
@ install -d "$(DESTDIR)$(DOCUMENT_PATH)"/non-mixer
|
||||
@ cp $(OBJS) *.png mup.css ../../COPYING "$(DESTDIR)$(DOCUMENT_PATH)"/non-mixer
|
||||
# @ ln -sf $(PIXMAP_PATH)/logo.png $(DOCUMENT_PATH)
|
||||
|
||||
clean:
|
||||
|
|
|
@ -1,184 +0,0 @@
|
|||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html><head>
|
||||
<meta name="generator" content="Generated by MUP v3.5">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<link type="text/css" rel="stylesheet" href="mup.css">
|
||||
<title>The Non Mixer</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id=cover>
|
||||
<h1>The Non Mixer</h1>
|
||||
<h3></h3>
|
||||
<address>
|
||||
Jonathan Moore Liles <a href="mailto:male@tuxfamily.org"><male@tuxfamily.org></a><br>
|
||||
February 1, 2010<br>
|
||||
|
||||
</address><img src="icon.png" alt="icon"><hr></div>
|
||||
<div id=body>
|
||||
<div id=toc>
|
||||
<h1 id=toc>Table Of Contents</h1>
|
||||
<ul>
|
||||
<li><a href="#n:1.">1. Overview</a>
|
||||
<ul><li><a href="#n:1.1.">1.1. Description</a>
|
||||
|
||||
<li><a href="#n:1.2.">1.2. Why write another one?</a>
|
||||
|
||||
<li><a href="#n:1.3.">1.3. Features</a>
|
||||
|
||||
<ul><li><a href="#n:1.3.1.">1.3.1. Stand-alone Implementation</a>
|
||||
|
||||
<li><a href="#n:1.3.2.">1.3.2. Modular Signal Processing</a>
|
||||
|
||||
<li><a href="#n:1.3.3.">1.3.3. Parallel Processing</a>
|
||||
|
||||
<li><a href="#n:1.3.4.">1.3.4. Multiple Instances</a>
|
||||
|
||||
<li><a href="#n:1.3.5.">1.3.5. LADSPA Plugins</a>
|
||||
|
||||
<li><a href="#n:1.3.6.">1.3.6. Unlimited Strips</a>
|
||||
|
||||
<li><a href="#n:1.3.7.">1.3.7. Automation</a>
|
||||
|
||||
<li><a href="#n:1.3.8.">1.3.8. Spatialization</a>
|
||||
|
||||
</ul></ul><li><a href="#u:1.">What does freedom have to do with this software?</a>
|
||||
|
||||
<li><a href="#u:2.">Donations</a>
|
||||
|
||||
<li><a href="#u:3.">Distribution</a>
|
||||
|
||||
<li><a href="#u:4.">Requirements</a>
|
||||
|
||||
<li><a href="#u:5.">Community</a>
|
||||
|
||||
</ul></ul><hr></div>
|
||||
<h1 id="n:1.">1. Overview</h1>
|
||||
<center><div class="fig image"><table border=1>
|
||||
<tr><td><img src="non-mixer-complex.png" alt="fig. "></td></tr>
|
||||
</table></div></center>
|
||||
<h2 id="n:1.1.">1.1. Description</h2>
|
||||
<p>
|
||||
The Non Mixer is a powerful, reliable and fast modular Digital Audio Mixer, released under the GNU General Public License (GPL). It utilizes the JACK Audio Connection Kit for inter-application audio I/O and the FLTK GUI toolkit for a fast and lightweight user interface.
|
||||
</p>
|
||||
<p>
|
||||
Please see the <a class=ext href="MANUAL.html">Manual</a> for more information (and lots of screenshots).
|
||||
</p>
|
||||
<h2 id="n:1.2.">1.2. Why write another one?</h2>
|
||||
<p>
|
||||
At the time work began on Non Mixer, there was no other powerful, fast, and light stand-alone free-software JACK mixer available. There was (and is) LiveMix, however LiveMix is neither fast nor light, and it wasn't able to accept the necessary external control data. SpiralSynthModular, strangely enough, was the closest thing the author could find to the tool he needed (it has gain/mix modules and all modules accept Control Voltage input). SSM is truly an excellent, if neglected, program, but the modules-on-a-canvas model with manual routing is far too cumbersome of an arrangement for real world mixing tasks. Instead of creating another monolithic DAW with built-in routing and mixing, the author choose to follow the time tested Unix design philosophy of one tool per task. The most obvious point of division is between the timeline and the mixer. Drawing the line here allows routing and mixing to actually occur within JACK, which is an infinitely more flexible arrangement than the alternative.
|
||||
</p>
|
||||
<h2 id="n:1.3.">1.3. Features</h2>
|
||||
<p>
|
||||
Non-Mixer shares many features in common with other, similar projects. However, Non-Mixer's unique architecture permits surprising new functionality.
|
||||
</p>
|
||||
<h3 id="n:1.3.1.">1.3.1. Stand-alone Implementation</h3>
|
||||
<p>
|
||||
The Non Mixer is a stand-alone application. It is a complement to Non DAW, but neither program requires the other in order to function.
|
||||
</p>
|
||||
<p>
|
||||
Implementing the mixer functionality in a separate program, connected to Non-DAW via JACK presents a number of advantages:
|
||||
</p>
|
||||
<ul><li><span>Eliminates the need for an internal connection management interface</span>
|
||||
<li><span>Improves overall system stability</span>
|
||||
<li><span>Increases parallelism (utilizes multiple cores)</span>
|
||||
<li><span>Adds flexibility</span>
|
||||
<li><span>Eliminates the need for cumbersome concepts and interfaces such as 'sends', 'groups', 'inserts' and 'busses'.</span>
|
||||
</ul><p>
|
||||
Multiple instances of the mixer can be run together in order to organize groups of channels and manage them with your preferred window manager.
|
||||
</p>
|
||||
<p>
|
||||
Each mixer strip runs as a separate JACK client. In JACK2, this can translates into the DSP workload being spread across multiple CPU cores.
|
||||
</p>
|
||||
<p>
|
||||
Since the Mixer is an entirely separate unit, you may use any JACK capable mixer client you want instead of, or in myriad combination with, the Non-DAW Mixer. The one called LiveMix works well, but lacks many features of Non's mixer. All operations on the mixer affect the current mix set state only and are not journaled.
|
||||
</p>
|
||||
<p>
|
||||
The mixer's design is modular, with all DSP occurring in discrete modules. One module hosts LADSPA plugins and the mixer is capable of receiving control (automation) data for any module parameter from Non-DAW (or another program) via JACK.
|
||||
</p>
|
||||
<p>
|
||||
Control data is expressed either as Control Voltage (CV) or Control Signals.
|
||||
</p>
|
||||
<h3 id="n:1.3.2.">1.3.2. Modular Signal Processing</h3>
|
||||
<p>
|
||||
All signal processing in Non Mixer occurs in <i>Modules</i>. This includes input and output from/to JACK. The modular design helps to restrain the total program complexity, and this in turn increases flexibility and reliability. Even the built-in gain stage and meter are modules (and you can place as many meters as you like, wherever you like, in the signal chain, eliminating the post/pre concept).
|
||||
</p>
|
||||
<h3 id="n:1.3.3.">1.3.3. Parallel Processing</h3>
|
||||
<p>
|
||||
Because each mixer strip in Non Mixer runs as a separate JACK client (in its own thread), JACK has the opportunity, upon analysis of the connection graph, to execute some or all strips in parallel. This is a highly desirable behavior for those having multi-CPU and/or multi-core configurations.
|
||||
</p>
|
||||
<h3 id="n:1.3.4.">1.3.4. Multiple Instances</h3>
|
||||
<p>
|
||||
Because Non Mixer is stand-alone, it is possible to run multiple instances. One reason you might want to do this is so that you can group sets of strips out of a large total number of strips. For example, you might want to keep all of your drum strips together. By using multiple Non Mixer instances, you are able to manage these groups of strips with the familiar navigation facilities of your chosen window manager. Once again, a modular design allows us to maintain a good balance of complexity across user interface levels without duplicating and internalizing the functionality already available at a higher level.
|
||||
</p>
|
||||
<h3 id="n:1.3.5.">1.3.5. LADSPA Plugins</h3>
|
||||
<p>
|
||||
LADSPA plugins are hosted by the <i>Plugin</i> module and can be inserted anywhere in the signal chain (contingent on compatibility of the I/O configuration at that point).
|
||||
</p>
|
||||
<h3 id="n:1.3.6.">1.3.6. Unlimited Strips</h3>
|
||||
<p>
|
||||
There is no limit imposed by Non Mixer on the total number of strips or Mixer instances you can create.
|
||||
</p>
|
||||
<h3 id="n:1.3.7.">1.3.7. Automation</h3>
|
||||
<p>
|
||||
Any module parameter may be bound to a <i>control</i>. The control may be controlled via the GUI, or externally via a Control Voltage signal, such as is output by a Non-DAW control sequence. All module parameters are alterable via OSC messages, regardless of whether or not they have <i>controls</i> defined.
|
||||
</p>
|
||||
<h3 id="n:1.3.8.">1.3.8. Spatialization</h3>
|
||||
<p>
|
||||
Plugins supporting Ambisonics panning are automatically assigned a special control called a Spatializer. This allows for easy and positioning of sound sources.
|
||||
</p>
|
||||
<h1 id="u:1.">What does freedom have to do with this software?</h1>
|
||||
<p>
|
||||
Non is <i>free software</i>. This means, briefly, that you are free use it as <b>you</b> wish, free to examine and adapt the source code, free to share it with your friends, and free to publish your changes to the source code. Furthermore, Non is <i>copyleft</i>, which means that you are free from the threat of some other entity taking over and denying you the above freedoms. The <i>free</i> part of <i>free software</i> doesn't refer to price any more than the <i>free</i> in <i>free speech</i> does.
|
||||
</p>
|
||||
<p>
|
||||
To learn why free software is so important to us (and why it should be important to you), please see the Free Software Foundation's website:
|
||||
</p>
|
||||
<p>
|
||||
<a class=ext href="http://www.fsf.org/licensing/essays/free-sw.html">What is Free Software?</a> <a class=ext href="http://www.fsf.org/licensing/essays/copyleft.html">What is Copyleft?</a>
|
||||
</p>
|
||||
<h1 id="u:2.">Donations</h1>
|
||||
<p>
|
||||
Donations can take many forms. You can donate your time in code, either by sending it to me for review or cloning the git repository and publishing one containing your changes. You can donate your time in testing, documentation, artwork, indexing, etc. Or, if you don't feel that you possess the time or skills required for the above forms of donation, you can donate money instead. Money donated will help to ensure that I have the free time, good nutrition and enthusiasm required to implement new features. It can also be a more palpable way of saying "Thanks for caring." or "Job well done!"
|
||||
</p>
|
||||
<p>
|
||||
If you don't love this software, don't feel guilty about not contributing. If you do love it, then please help me improve it--in whatever manner you think is appropriate.
|
||||
</p>
|
||||
<p>
|
||||
<a class=ext href="http://non.tuxfamily.org/donation.html">Make a donation</a>
|
||||
</p>
|
||||
<h1 id="u:3.">Distribution</h1>
|
||||
<p>
|
||||
Development of the Non-DAW and Non-Mixer can be followed with Git:
|
||||
</p>
|
||||
<div class="fig example"><table width=100%><tr><td><pre>
|
||||
git clone git://git.tuxfamily.org/gitroot/non/daw.git
|
||||
</pre></td></tr>
|
||||
</table></div>
|
||||
<p>
|
||||
There are no pre-compiled binaries available.
|
||||
</p>
|
||||
<h1 id="u:4.">Requirements</h1>
|
||||
<p>
|
||||
The following libraries are required to build Non DAW and Non Mixer
|
||||
</p>
|
||||
<ul><li><span>FLTK >= 1.1.7 (with `fluid`)</span>
|
||||
<li><span>JACK >= 0.103.0</span>
|
||||
<li><span>liblrdf >= 0.1.0</span>
|
||||
<li><span>liblo >= 0.26</span>
|
||||
<li><span>libsigc++ >= 2.0.0</span>
|
||||
</ul><h1 id="u:5.">Community</h1>
|
||||
<p>
|
||||
Feel free to drop by the <tt>#non</tt> channel on irc.freenode.net.
|
||||
</p>
|
||||
<p>
|
||||
There is a mailing list <tt>non-mixer@lists.tuxfamily.org</tt>.
|
||||
</p>
|
||||
<p>
|
||||
To subscribe, send a message with the subject 'subscribe' to <a href="mailto:non-mixer-request@lists.tuxfamily.org"><non-mixer-request@lists.tuxfamily.org></a>.
|
||||
</p>
|
||||
<p>
|
||||
You can also browse the <a class=ext href="http://listengine.tuxfamily.org/lists.tuxfamily.org/non-mixer/">archive</a>.
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -1,202 +0,0 @@
|
|||
|
||||
! title The Non Mixer
|
||||
! author Jonathan Moore Liles #(email,male@tuxfamily.org)
|
||||
! date February 1, 2010
|
||||
! extra #(image,icon,icon.png)
|
||||
|
||||
-- Table Of Contents
|
||||
|
||||
: Overview
|
||||
|
||||
< non-mixer-complex.png
|
||||
|
||||
:: Description
|
||||
|
||||
The Non Mixer is a powerful, reliable and fast modular Digital Audio
|
||||
Mixer, released under the GNU General Public License (GPL). It
|
||||
utilizes the JACK Audio Connection Kit for inter-application audio
|
||||
I\/O and the FLTK GUI toolkit for a fast and lightweight user
|
||||
interface.
|
||||
|
||||
Please see the #(url,MANUAL.html,Manual) for more information (and
|
||||
lots of screenshots).
|
||||
|
||||
:: Why write another one?
|
||||
|
||||
At the time work began on Non Mixer, there was no other powerful,
|
||||
fast, and light stand-alone free-software JACK mixer available.
|
||||
There was (and is) LiveMix, however LiveMix is neither fast nor
|
||||
light, and it wasn't able to accept the necessary external control
|
||||
data. SpiralSynthModular, strangely enough, was the closest thing
|
||||
the author could find to the tool he needed (it has gain\/mix
|
||||
modules and all modules accept Control Voltage input). SSM is truly
|
||||
an excellent, if neglected, program, but the modules-on-a-canvas
|
||||
model with manual routing is far too cumbersome of an arrangement
|
||||
for real world mixing tasks. Instead of creating another monolithic
|
||||
DAW with built-in routing and mixing, the author choose to follow
|
||||
the time tested Unix design philosophy of one tool per task. The
|
||||
most obvious point of division is between the timeline and the
|
||||
mixer. Drawing the line here allows routing and mixing to actually
|
||||
occur within JACK, which is an infinitely more flexible arrangement
|
||||
than the alternative.
|
||||
|
||||
:: Features
|
||||
|
||||
Non-Mixer shares many features in common with other, similar
|
||||
projects. However, Non-Mixer's unique architecture permits
|
||||
surprising new functionality.
|
||||
|
||||
::: Stand-alone Implementation
|
||||
|
||||
The Non Mixer is a stand-alone application. It is a complement to Non
|
||||
DAW, but neither program requires the other in order to function.
|
||||
|
||||
Implementing the mixer functionality in a separate program, connected
|
||||
to Non-DAW via JACK presents a number of advantages:
|
||||
|
||||
* Eliminates the need for an internal connection management interface
|
||||
* Improves overall system stability
|
||||
* Increases parallelism (utilizes multiple cores)
|
||||
* Adds flexibility
|
||||
* Eliminates the need for cumbersome concepts and interfaces such as 'sends', 'groups', 'inserts' and 'busses'.
|
||||
|
||||
Multiple instances of the mixer can be run together in order to
|
||||
organize groups of channels and manage them with your preferred
|
||||
window manager.
|
||||
|
||||
Each mixer strip runs as a separate JACK client. In JACK2, this can
|
||||
translates into the DSP workload being spread across multiple CPU
|
||||
cores.
|
||||
|
||||
Since the Mixer is an entirely separate unit, you may use any JACK
|
||||
capable mixer client you want instead of, or in myriad combination
|
||||
with, the Non-DAW Mixer. The one called LiveMix works well, but
|
||||
lacks many features of Non's mixer. All operations on the mixer
|
||||
affect the current mix set state only and are not journaled.
|
||||
|
||||
The mixer's design is modular, with all DSP occurring in discrete
|
||||
modules. One module hosts LADSPA plugins and the mixer is capable of
|
||||
receiving control (automation) data for any module parameter from
|
||||
Non-DAW (or another program) via JACK.
|
||||
|
||||
Control data is expressed either as Control Voltage (CV) or Control
|
||||
Signals.
|
||||
|
||||
::: Modular Signal Processing
|
||||
|
||||
All signal processing in Non Mixer occurs in /Modules/. This
|
||||
includes input and output from\/to JACK. The modular design helps to
|
||||
restrain the total program complexity, and this in turn increases
|
||||
flexibility and reliability. Even the built-in gain stage and meter
|
||||
are modules (and you can place as many meters as you like, wherever
|
||||
you like, in the signal chain, eliminating the post\/pre concept).
|
||||
|
||||
::: Parallel Processing
|
||||
|
||||
Because each mixer strip in Non Mixer runs as a separate JACK client
|
||||
(in its own thread), JACK has the opportunity, upon analysis of the
|
||||
connection graph, to execute some or all strips in parallel. This is
|
||||
a highly desirable behavior for those having multi-CPU and\/or
|
||||
multi-core configurations.
|
||||
|
||||
::: Multiple Instances
|
||||
|
||||
Because Non Mixer is stand-alone, it is possible to run multiple
|
||||
instances. One reason you might want to do this is so that you can
|
||||
group sets of strips out of a large total number of strips. For
|
||||
example, you might want to keep all of your drum strips together. By
|
||||
using multiple Non Mixer instances, you are able to manage these
|
||||
groups of strips with the familiar navigation facilities of your
|
||||
chosen window manager. Once again, a modular design allows us to
|
||||
maintain a good balance of complexity across user interface levels
|
||||
without duplicating and internalizing the functionality already
|
||||
available at a higher level.
|
||||
|
||||
::: LADSPA Plugins
|
||||
|
||||
LADSPA plugins are hosted by the /Plugin/ module and can be inserted
|
||||
anywhere in the signal chain (contingent on compatibility of the
|
||||
I\/O configuration at that point).
|
||||
|
||||
::: Unlimited Strips
|
||||
|
||||
There is no limit imposed by Non Mixer on the total number of strips
|
||||
or Mixer instances you can create.
|
||||
|
||||
::: Automation
|
||||
|
||||
Any module parameter may be bound to a /control/. The control may be
|
||||
controlled via the GUI, or externally via a Control Voltage signal,
|
||||
such as is output by a Non-DAW control sequence.
|
||||
|
||||
All module parameters are alterable via OSC messages, regardless of
|
||||
whether or not they have /controls/ defined.
|
||||
|
||||
::: Spatialization
|
||||
|
||||
Plugins supporting Ambisonics panning are automatically assigned a
|
||||
special control called a Spatializer. This allows for easy and
|
||||
positioning of sound sources.
|
||||
|
||||
; What does freedom have to do with this software?
|
||||
|
||||
Non is /free software/. This means, briefly, that you are free use
|
||||
it as *you* wish, free to examine and adapt the source code, free to
|
||||
share it with your friends, and free to publish your changes to the
|
||||
source code. Furthermore, Non is /copyleft/, which means that you
|
||||
are free from the threat of some other entity taking over and
|
||||
denying you the above freedoms. The /free/ part of /free software/
|
||||
doesn't refer to price any more than the /free/ in /free speech/
|
||||
does.
|
||||
|
||||
To learn why free software is so important to us (and why it should be
|
||||
important to you), please see the Free Software Foundation's website:
|
||||
|
||||
#(url,http:\/\/www.fsf.org\/licensing\/essays\/free-sw.html,What is Free Software?)
|
||||
#(url,http:\/\/www.fsf.org\/licensing\/essays\/copyleft.html,What is Copyleft?)
|
||||
|
||||
; Donations
|
||||
|
||||
Donations can take many forms. You can donate your time in code, either by
|
||||
sending it to me for review or cloning the git repository and publishing one
|
||||
containing your changes. You can donate your time in testing, documentation,
|
||||
artwork, indexing, etc. Or, if you don't feel that you possess the time or
|
||||
skills required for the above forms of donation, you can donate money
|
||||
instead. Money donated will help to ensure that I have the free time, good
|
||||
nutrition and enthusiasm required to implement new features. It can also be
|
||||
a more palpable way of saying "Thanks for caring." or "Job well done!"
|
||||
|
||||
If you don't love this software, don't feel guilty about not contributing.
|
||||
If you do love it, then please help me improve it--in whatever manner you
|
||||
think is appropriate.
|
||||
|
||||
#(url,http:\/\/non.tuxfamily.org\/donation.html,Make a donation)
|
||||
|
||||
; Distribution
|
||||
|
||||
Development of the Non-DAW and Non-Mixer can be followed with Git:
|
||||
|
||||
> git clone git://git.tuxfamily.org/gitroot/non/daw.git
|
||||
|
||||
There are no pre-compiled binaries available.
|
||||
|
||||
; Requirements
|
||||
|
||||
The following libraries are required to build Non DAW and Non Mixer
|
||||
|
||||
* FLTK >= 1.1.7 (with `fluid`)
|
||||
* JACK >= 0.103.0
|
||||
* liblrdf >= 0.1.0
|
||||
* liblo >= 0.26
|
||||
* libsigc++ >= 2.0.0
|
||||
|
||||
; Community
|
||||
|
||||
Feel free to drop by the `#non` channel on irc.freenode.net.
|
||||
|
||||
There is a mailing list `non-mixer@lists.tuxfamily.org`.
|
||||
|
||||
To subscribe, send a message with the subject 'subscribe' to
|
||||
#(email,non-mixer-request@lists.tuxfamily.org).
|
||||
|
||||
You can also browse the #(url,http:\/\/listengine.tuxfamily.org\/lists.tuxfamily.org\/non-mixer\/,archive).
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 8.1 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 13 KiB |
|
@ -1,8 +1,15 @@
|
|||
|
||||
/* Example CSS Style for MUP */
|
||||
|
||||
body
|
||||
{
|
||||
font: normal normal 14pt "Helvetica", sans-serif;
|
||||
/* background: url("http://non.tuxfamily.org/background-pattern.png") fixed; */
|
||||
background-color: #121212; color: lightgray; padding: 0; margin: 0;
|
||||
}
|
||||
|
||||
a:link {
|
||||
color: yellow;
|
||||
color: white;
|
||||
}
|
||||
a:visited {
|
||||
color: olive;
|
||||
|
@ -82,14 +89,17 @@ p:contains("Warning:") {
|
|||
}
|
||||
#cover {
|
||||
position: relative;
|
||||
background: #da0;
|
||||
color: black;
|
||||
/* background: #da0;*/
|
||||
background: #555;
|
||||
color: #aaa;
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
padding: 0.5em;
|
||||
border-top: 4px solid black;
|
||||
border-bottom: 4px solid black;
|
||||
}
|
||||
#cover h1, #cover h3 {
|
||||
text-shadow: #444 0.2em 0.2em 0.2em;
|
||||
text-shadow: #222 0.2em 0.2em 0.2em;
|
||||
color: white;
|
||||
border: none;
|
||||
letter-spacing: 0.2em;
|
||||
|
@ -98,7 +108,7 @@ p:contains("Warning:") {
|
|||
margin-right: 2em;
|
||||
}
|
||||
#cover h1:before, #cover h1:after {
|
||||
content: "::";
|
||||
/* content: "::"; */
|
||||
font-size: 300%;
|
||||
color: black;
|
||||
}
|
||||
|
@ -162,26 +172,26 @@ hr {
|
|||
border-bottom: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
background: #222;
|
||||
color: white;
|
||||
font-family: Arial, sans-serif;
|
||||
}
|
||||
/* */
|
||||
#body {
|
||||
position: relative;
|
||||
margin: 0.5em;
|
||||
margin: 0 auto;
|
||||
padding: 0.5em;
|
||||
max-width: 900px;
|
||||
background-color: #1c1c1c;
|
||||
}
|
||||
/* ;, : */
|
||||
h1 {
|
||||
color: #ff0;
|
||||
color: #fff;
|
||||
border-bottom: solid #444 0.1em;
|
||||
text-shadow: 1px 1px 2px #000;
|
||||
|
||||
}
|
||||
/* ::, :::, ::::, :::::, :::::: */
|
||||
h2, h3, h4, h5, h6 {
|
||||
color: #dd0;
|
||||
color: #fff;
|
||||
text-shadow: 1px 1px 2px #000;
|
||||
|
||||
}
|
||||
|
||||
/* tables, figures */
|
||||
|
@ -215,12 +225,9 @@ h2, h3, h4, h5, h6 {
|
|||
/* < */
|
||||
|
||||
.fig.image table {
|
||||
border: dashed silver 0.2em;
|
||||
border: none;
|
||||
background: transparent;
|
||||
/* Every browser should support border radii */
|
||||
-moz-border-radius: 0.5em;
|
||||
border-radius: 0.5em;
|
||||
|
||||
max-width: 100%;
|
||||
}
|
||||
.fig.image tr, .fig.image td {
|
||||
border: none;
|
||||
|
@ -228,6 +235,11 @@ h2, h3, h4, h5, h6 {
|
|||
padding: 0;
|
||||
}
|
||||
|
||||
.fig.image img
|
||||
{
|
||||
max-width: 900px;
|
||||
}
|
||||
|
||||
/* */
|
||||
p {
|
||||
margin-right: 2%;
|
||||
|
@ -265,14 +277,14 @@ p {
|
|||
margin-top: 0;
|
||||
font-family: Monospace;
|
||||
padding: 1em;
|
||||
border: dashed 0.3em gray;
|
||||
background: #111;
|
||||
border: solid 1px black;
|
||||
background: #222;
|
||||
color: white;
|
||||
display: block;
|
||||
overflow: auto;
|
||||
/* Every browser should support border radii */
|
||||
-moz-border-radius: 0.5em;
|
||||
border-radius: 0.5em;
|
||||
/* -moz-border-radius: 0.5em;
|
||||
border-radius: 0.5em; */
|
||||
}
|
||||
/* " */
|
||||
/*
|
||||
|
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 8.2 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 126 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 437 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 163 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 576 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 8.4 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 16 KiB |
|
@ -1,925 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="96"
|
||||
height="96"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.1 r9760"
|
||||
sodipodi:docname="icon-large.svg"
|
||||
inkscape:export-filename="/home/male/prog/non-sequencer/doc/just-text.png"
|
||||
inkscape:export-xdpi="141.06583"
|
||||
inkscape:export-ydpi="141.06583"
|
||||
style="enable-background:new">
|
||||
<defs
|
||||
id="defs4">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient5418">
|
||||
<stop
|
||||
style="stop-color:#654d4d;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5420" />
|
||||
<stop
|
||||
style="stop-color:#654d4d;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5422" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient5021">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5023" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5025" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient5013">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5015" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5017" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4861">
|
||||
<stop
|
||||
style="stop-color:#a50000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4863" />
|
||||
<stop
|
||||
style="stop-color:#a50000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4865" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5209"
|
||||
osb:paint="solid">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5211" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter5252"
|
||||
x="-0.051939286"
|
||||
width="1.1038786"
|
||||
y="-0.80208468"
|
||||
height="2.6041694"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="5.3552102"
|
||||
id="feGaussianBlur5254" />
|
||||
</filter>
|
||||
<filter
|
||||
id="filter6205"
|
||||
inkscape:label="Black hole"
|
||||
inkscape:menu="Morphology"
|
||||
inkscape:menu-tooltip="Creates a black light inside and outside"
|
||||
height="1.5"
|
||||
width="1.5"
|
||||
y="-0.25"
|
||||
x="-0.25"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur6207"
|
||||
stdDeviation="5"
|
||||
in="SourceAlpha"
|
||||
result="result1" />
|
||||
<feComposite
|
||||
id="feComposite6209"
|
||||
in2="result1"
|
||||
operator="arithmetic"
|
||||
k2="3.2"
|
||||
k1="-1"
|
||||
k4="-2"
|
||||
result="result3"
|
||||
k3="0" />
|
||||
<feColorMatrix
|
||||
id="feColorMatrix6211"
|
||||
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 10 0 "
|
||||
result="result2" />
|
||||
<feComposite
|
||||
id="feComposite6213"
|
||||
in2="result2"
|
||||
result="fbSourceGraphic"
|
||||
in="SourceGraphic"
|
||||
operator="out" />
|
||||
<feBlend
|
||||
id="feBlend6215"
|
||||
in2="fbSourceGraphic"
|
||||
mode="multiply"
|
||||
in="result1"
|
||||
result="result91" />
|
||||
<feBlend
|
||||
id="feBlend6217"
|
||||
in2="result91"
|
||||
mode="screen"
|
||||
in="fbSourceGraphic" />
|
||||
</filter>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6759-3"
|
||||
id="radialGradient6767-0"
|
||||
cx="103.21429"
|
||||
cy="213.43361"
|
||||
fx="103.21429"
|
||||
fy="213.43361"
|
||||
r="8.2009745"
|
||||
gradientTransform="matrix(1,0,0,1.0160278,0,-3.4208767)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient6759-3">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6761-5" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6763-9" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6759-2"
|
||||
id="radialGradient6767-9"
|
||||
cx="103.21429"
|
||||
cy="213.43361"
|
||||
fx="103.21429"
|
||||
fy="213.43361"
|
||||
r="8.2009745"
|
||||
gradientTransform="matrix(1,0,0,1.0160278,0,-3.4208767)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient6759-2">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6761-9" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6763-0" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6759-2-4"
|
||||
id="radialGradient6846-0"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1,0,0,1.0160278,0,-3.4208767)"
|
||||
cx="103.21429"
|
||||
cy="213.43361"
|
||||
fx="103.21429"
|
||||
fy="213.43361"
|
||||
r="8.2009745" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient6759-2-4">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6761-9-1" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6763-0-7" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
id="filter4094"
|
||||
inkscape:label="Black hole"
|
||||
inkscape:menu="Morphology"
|
||||
inkscape:menu-tooltip="Creates a black light inside and outside"
|
||||
height="1.5"
|
||||
width="1.5"
|
||||
y="-0.25"
|
||||
x="-0.25"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4096"
|
||||
stdDeviation="5"
|
||||
in="SourceAlpha"
|
||||
result="result1" />
|
||||
<feComposite
|
||||
id="feComposite4098"
|
||||
in2="result1"
|
||||
operator="arithmetic"
|
||||
k2="3.2"
|
||||
k1="-1"
|
||||
k4="-2"
|
||||
result="result3"
|
||||
k3="0" />
|
||||
<feColorMatrix
|
||||
id="feColorMatrix4100"
|
||||
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 10 0 "
|
||||
result="result2" />
|
||||
<feComposite
|
||||
id="feComposite4102"
|
||||
in2="result2"
|
||||
result="fbSourceGraphic"
|
||||
in="SourceGraphic"
|
||||
operator="out" />
|
||||
<feBlend
|
||||
id="feBlend4104"
|
||||
in2="fbSourceGraphic"
|
||||
mode="multiply"
|
||||
in="result1"
|
||||
result="result91" />
|
||||
<feBlend
|
||||
id="feBlend4106"
|
||||
in2="result91"
|
||||
mode="screen"
|
||||
in="fbSourceGraphic" />
|
||||
</filter>
|
||||
<filter
|
||||
id="filter4108"
|
||||
inkscape:label="Black hole"
|
||||
inkscape:menu="Morphology"
|
||||
inkscape:menu-tooltip="Creates a black light inside and outside"
|
||||
height="1.5"
|
||||
width="1.5"
|
||||
y="-0.25"
|
||||
x="-0.25"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4110"
|
||||
stdDeviation="5"
|
||||
in="SourceAlpha"
|
||||
result="result1" />
|
||||
<feComposite
|
||||
id="feComposite4112"
|
||||
in2="result1"
|
||||
operator="arithmetic"
|
||||
k2="3.2"
|
||||
k1="-1"
|
||||
k4="-2"
|
||||
result="result3"
|
||||
k3="0" />
|
||||
<feColorMatrix
|
||||
id="feColorMatrix4114"
|
||||
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 10 0 "
|
||||
result="result2" />
|
||||
<feComposite
|
||||
id="feComposite4116"
|
||||
in2="result2"
|
||||
result="fbSourceGraphic"
|
||||
in="SourceGraphic"
|
||||
operator="out" />
|
||||
<feBlend
|
||||
id="feBlend4118"
|
||||
in2="fbSourceGraphic"
|
||||
mode="multiply"
|
||||
in="result1"
|
||||
result="result91" />
|
||||
<feBlend
|
||||
id="feBlend4120"
|
||||
in2="result91"
|
||||
mode="screen"
|
||||
in="fbSourceGraphic" />
|
||||
</filter>
|
||||
<filter
|
||||
id="filter2996"
|
||||
inkscape:label="Black hole"
|
||||
inkscape:menu="Morphology"
|
||||
inkscape:menu-tooltip="Creates a black light inside and outside"
|
||||
height="1.5"
|
||||
width="1.5"
|
||||
y="-0.25"
|
||||
x="-0.25"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur2998"
|
||||
stdDeviation="5"
|
||||
in="SourceAlpha"
|
||||
result="result1" />
|
||||
<feComposite
|
||||
id="feComposite3000"
|
||||
in2="result1"
|
||||
operator="arithmetic"
|
||||
k2="3.2"
|
||||
k1="-1"
|
||||
k4="-2"
|
||||
result="result3"
|
||||
k3="0" />
|
||||
<feColorMatrix
|
||||
id="feColorMatrix3002"
|
||||
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 10 0 "
|
||||
result="result2" />
|
||||
<feComposite
|
||||
id="feComposite3004"
|
||||
in2="result2"
|
||||
result="fbSourceGraphic"
|
||||
in="SourceGraphic"
|
||||
operator="out" />
|
||||
<feBlend
|
||||
id="feBlend3006"
|
||||
in2="fbSourceGraphic"
|
||||
mode="multiply"
|
||||
in="result1"
|
||||
result="result91" />
|
||||
<feBlend
|
||||
id="feBlend3008"
|
||||
in2="result91"
|
||||
mode="screen"
|
||||
in="fbSourceGraphic" />
|
||||
</filter>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4523-5"
|
||||
id="linearGradient4533-8"
|
||||
x1="40.691368"
|
||||
y1="-5.0138588"
|
||||
x2="115.70895"
|
||||
y2="122.54021"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-1.4285714,-0.26785715)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4523-5">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4525-8" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4527-2" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4861-0"
|
||||
id="linearGradient4867-9"
|
||||
x1="-277.44415"
|
||||
y1="-50.038612"
|
||||
x2="36.835873"
|
||||
y2="319.67722"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient4861-0">
|
||||
<stop
|
||||
style="stop-color:#d90000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4863-4" />
|
||||
<stop
|
||||
style="stop-color:#a50000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4865-0" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
id="filter4948"
|
||||
color-interpolation-filters="sRGB">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="4.5318938"
|
||||
id="feGaussianBlur4950" />
|
||||
</filter>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5013"
|
||||
id="linearGradient5019"
|
||||
x1="7.3245215"
|
||||
y1="-54.502781"
|
||||
x2="135.65985"
|
||||
y2="191.63652"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.29905175,0,0,0.29902528,0.31202281,223.17555)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5021"
|
||||
id="linearGradient5027"
|
||||
x1="65.545662"
|
||||
y1="-43.027843"
|
||||
x2="294.41019"
|
||||
y2="289.31235"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.29905175,0,0,0.29902528,0.31202281,223.17555)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5013-1"
|
||||
id="linearGradient5019-5"
|
||||
x1="26.703053"
|
||||
y1="29.001957"
|
||||
x2="170.00505"
|
||||
y2="221.94109"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient5013-1">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5015-6" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5017-1" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
color-interpolation-filters="sRGB"
|
||||
inkscape:collect="always"
|
||||
id="filter5281">
|
||||
<feGaussianBlur
|
||||
inkscape:collect="always"
|
||||
stdDeviation="2.0318984"
|
||||
id="feGaussianBlur5283" />
|
||||
</filter>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6116"
|
||||
id="linearGradient5285"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
|
||||
x1="432.34528"
|
||||
y1="197.17313"
|
||||
x2="432.34528"
|
||||
y2="544.38947" />
|
||||
<linearGradient
|
||||
id="linearGradient6116">
|
||||
<stop
|
||||
style="stop-color:#a00000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6118" />
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop6120" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6116"
|
||||
id="linearGradient5287"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
|
||||
x1="432.34528"
|
||||
y1="197.17313"
|
||||
x2="432.34528"
|
||||
y2="544.38947" />
|
||||
<linearGradient
|
||||
id="linearGradient5170">
|
||||
<stop
|
||||
style="stop-color:#a00000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5172" />
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5174" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6116"
|
||||
id="linearGradient5289"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
|
||||
x1="432.34528"
|
||||
y1="197.17313"
|
||||
x2="432.34528"
|
||||
y2="544.38947" />
|
||||
<linearGradient
|
||||
id="linearGradient5177">
|
||||
<stop
|
||||
style="stop-color:#a00000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5179" />
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5181" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6116"
|
||||
id="linearGradient5291"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
|
||||
x1="432.34528"
|
||||
y1="197.17313"
|
||||
x2="432.34528"
|
||||
y2="544.38947" />
|
||||
<linearGradient
|
||||
id="linearGradient5184">
|
||||
<stop
|
||||
style="stop-color:#a00000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5186" />
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5188" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6116"
|
||||
id="linearGradient5293"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
|
||||
x1="432.34528"
|
||||
y1="197.17313"
|
||||
x2="432.34528"
|
||||
y2="544.38947" />
|
||||
<linearGradient
|
||||
id="linearGradient5191">
|
||||
<stop
|
||||
style="stop-color:#a00000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5193" />
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5195" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6116"
|
||||
id="linearGradient5295"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
|
||||
x1="432.34528"
|
||||
y1="197.17313"
|
||||
x2="432.34528"
|
||||
y2="544.38947" />
|
||||
<linearGradient
|
||||
id="linearGradient5198">
|
||||
<stop
|
||||
style="stop-color:#a00000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5200" />
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5202" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6116"
|
||||
id="linearGradient5297"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
|
||||
x1="432.34528"
|
||||
y1="197.17313"
|
||||
x2="432.34528"
|
||||
y2="544.38947" />
|
||||
<linearGradient
|
||||
id="linearGradient5205">
|
||||
<stop
|
||||
style="stop-color:#a00000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5207" />
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5209" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6116"
|
||||
id="linearGradient5299"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
|
||||
x1="432.34528"
|
||||
y1="197.17313"
|
||||
x2="432.34528"
|
||||
y2="544.38947" />
|
||||
<linearGradient
|
||||
id="linearGradient5212">
|
||||
<stop
|
||||
style="stop-color:#a00000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5214" />
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5216" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6116"
|
||||
id="linearGradient5301"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
|
||||
x1="432.34528"
|
||||
y1="197.17313"
|
||||
x2="432.34528"
|
||||
y2="544.38947" />
|
||||
<linearGradient
|
||||
id="linearGradient5219">
|
||||
<stop
|
||||
style="stop-color:#a00000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5221" />
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5223" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6116"
|
||||
id="linearGradient5303"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
|
||||
x1="432.34528"
|
||||
y1="197.17313"
|
||||
x2="432.34528"
|
||||
y2="544.38947" />
|
||||
<linearGradient
|
||||
id="linearGradient5226">
|
||||
<stop
|
||||
style="stop-color:#a00000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5228" />
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5230" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6116"
|
||||
id="linearGradient5305"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
|
||||
x1="432.34528"
|
||||
y1="197.17313"
|
||||
x2="432.34528"
|
||||
y2="544.38947" />
|
||||
<linearGradient
|
||||
id="linearGradient5233">
|
||||
<stop
|
||||
style="stop-color:#a00000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5235" />
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5237" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6116"
|
||||
id="linearGradient5307"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.30012437,0,0,0.30012437,-202.06109,894.75914)"
|
||||
x1="432.34528"
|
||||
y1="197.17313"
|
||||
x2="432.34528"
|
||||
y2="544.38947" />
|
||||
<linearGradient
|
||||
id="linearGradient5240">
|
||||
<stop
|
||||
style="stop-color:#a00000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5242" />
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5244" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5418"
|
||||
id="linearGradient5424"
|
||||
x1="-267.4476"
|
||||
y1="-44.398079"
|
||||
x2="-27.453287"
|
||||
y2="227.74478"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.29905175,0,0,0.29902527,-217.64832,179.79323)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.6"
|
||||
inkscape:cx="54.939906"
|
||||
inkscape:cy="41.18017"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer5"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1030"
|
||||
inkscape:window-x="-2"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
showguides="false"
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:snap-global="false">
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="48.986611,184.92806"
|
||||
id="guide6942" />
|
||||
<sodipodi:guide
|
||||
orientation="0,1"
|
||||
position="96.843761,183.49949"
|
||||
id="guide6944" />
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid6946"
|
||||
empspacing="5"
|
||||
visible="true"
|
||||
enabled="true"
|
||||
snapvisiblegridlinesonly="true" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="42.385351,259.70081"
|
||||
id="guide7007" />
|
||||
<sodipodi:guide
|
||||
orientation="1,0"
|
||||
position="23.192451,157.17033"
|
||||
id="guide7009" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Box"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(310.95069,-161.11145)"
|
||||
style="display:inline">
|
||||
<rect
|
||||
style="opacity:0.98999999;fill:#ffffff;fill-opacity:0.44769874;stroke:#000000;stroke-width:2.54482269;stroke-linecap:square;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:0.73127753;stroke-dasharray:10.17929081, 10.17929081;stroke-dashoffset:0;filter:url(#filter5252)"
|
||||
id="rect5223"
|
||||
width="247.45247"
|
||||
height="16.023874"
|
||||
x="169.8452"
|
||||
y="186.4931"
|
||||
rx="12.85704"
|
||||
ry="12.03072"
|
||||
transform="matrix(0.26144894,0,0,0.10652205,-338.34952,147.35319)" />
|
||||
<rect
|
||||
style="fill:#000000;fill-opacity:1;stroke:#363434;stroke-width:5.52553797;stroke-miterlimit:4;stroke-opacity:0.72246692;stroke-dasharray:none;display:inline;filter:url(#filter4948);enable-background:new"
|
||||
id="rect3597-9"
|
||||
width="312.62057"
|
||||
height="303.76965"
|
||||
x="-307.06512"
|
||||
y="-56.173706"
|
||||
rx="84.17984"
|
||||
ry="78.412369"
|
||||
transform="matrix(0.29904531,0,0,0.30406209,-217.64929,180.19724)" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient5424);fill-opacity:1;stroke:#000000;stroke-width:1.66618872;stroke-miterlimit:4;stroke-opacity:0.44052866;stroke-dasharray:none;display:inline;enable-background:new"
|
||||
id="rect3597"
|
||||
width="93.487717"
|
||||
height="92.364845"
|
||||
x="-309.98273"
|
||||
y="161.9846"
|
||||
rx="25.173586"
|
||||
ry="23.84223" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
|
||||
x="-161.42857"
|
||||
y="44.714287"
|
||||
id="text3313"
|
||||
sodipodi:linespacing="100%"
|
||||
transform="translate(-310.95069,-61.88855)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3315"
|
||||
x="-161.42857"
|
||||
y="44.714287" /></text>
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="Graphic"
|
||||
style="display:inline"
|
||||
transform="translate(0,-223)">
|
||||
<g
|
||||
transform="matrix(0.84235006,0,0,0.87814743,-147.32803,-607.19976)"
|
||||
style="display:inline"
|
||||
id="g4233">
|
||||
<g
|
||||
id="g4249"
|
||||
transform="translate(302.85714,5)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect5625-94"
|
||||
d="m -110.09153,974.32764 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57695 0,1.42764 -1.400586,2.57696 -3.140327,2.57696 l -75.575623,0 c -1.73974,0 -3.14033,-1.14932 -3.14033,-2.57696 0,-1.42763 1.40059,-2.57695 3.14033,-2.57695 z"
|
||||
style="opacity:0.92941176;fill:url(#linearGradient5285);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect5625-1"
|
||||
d="m -110.09153,967.19287 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57696 0,1.42763 -1.400586,2.57696 -3.140327,2.57696 l -75.575623,0 c -1.73974,0 -3.14033,-1.14933 -3.14033,-2.57696 0,-1.42764 1.40059,-2.57696 3.14033,-2.57696 z"
|
||||
style="opacity:0.92941176;fill:url(#linearGradient5287);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect5625-3"
|
||||
d="m -110.09153,960.05817 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57695 0,1.42764 -1.400586,2.57696 -3.140327,2.57696 l -75.575623,0 c -1.73974,0 -3.14033,-1.14932 -3.14033,-2.57696 0,-1.42763 1.40059,-2.57695 3.14033,-2.57695 z"
|
||||
style="opacity:0.92941176;fill:url(#linearGradient5289);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect5625-34"
|
||||
d="m -110.09153,952.9234 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57696 0,1.42763 -1.400586,2.57695 -3.140327,2.57695 l -75.575623,0 c -1.73974,0 -3.14033,-1.14932 -3.14033,-2.57695 0,-1.42764 1.40059,-2.57696 3.14033,-2.57696 z"
|
||||
style="opacity:0.92941176;fill:url(#linearGradient5291);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect5625-5"
|
||||
d="m -110.09153,988.59711 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57695 0,1.42764 -1.400586,2.57696 -3.140327,2.57696 l -75.575623,0 c -1.73974,0 -3.14033,-1.14932 -3.14033,-2.57696 0,-1.42763 1.40059,-2.57695 3.14033,-2.57695 z"
|
||||
style="opacity:0.92941176;fill:url(#linearGradient5293);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect5625-2"
|
||||
d="m -110.09153,1010.0013 75.575623,0 c 1.739741,0 3.140327,1.1493 3.140327,2.5769 0,1.4277 -1.400586,2.577 -3.140327,2.577 l -75.575623,0 c -1.73974,0 -3.14033,-1.1493 -3.14033,-2.577 0,-1.4276 1.40059,-2.5769 3.14033,-2.5769 z"
|
||||
style="opacity:0.92941176;fill:url(#linearGradient5295);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect5625-92"
|
||||
d="m -110.09153,1002.8666 75.575623,0 c 1.739741,0 3.140327,1.1493 3.140327,2.5769 0,1.4277 -1.400586,2.577 -3.140327,2.577 l -75.575623,0 c -1.73974,0 -3.14033,-1.1493 -3.14033,-2.577 0,-1.4276 1.40059,-2.5769 3.14033,-2.5769 z"
|
||||
style="opacity:0.92941176;fill:url(#linearGradient5297);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect5625-12"
|
||||
d="m -110.09153,1017.1361 75.575623,0 c 1.739741,0 3.140327,1.1493 3.140327,2.577 0,1.4276 -1.400586,2.5769 -3.140327,2.5769 l -75.575623,0 c -1.73974,0 -3.14033,-1.1493 -3.14033,-2.5769 0,-1.4277 1.40059,-2.577 3.14033,-2.577 z"
|
||||
style="opacity:0.92941176;fill:url(#linearGradient5299);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect5625-7"
|
||||
d="m -110.09153,1031.4055 75.575623,0 c 1.739741,0 3.140327,1.1493 3.140327,2.577 0,1.4276 -1.400586,2.5769 -3.140327,2.5769 l -75.575623,0 c -1.73974,0 -3.14033,-1.1493 -3.14033,-2.5769 0,-1.4277 1.40059,-2.577 3.14033,-2.577 z"
|
||||
style="opacity:0.92941176;fill:url(#linearGradient5301);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect5625-8"
|
||||
d="m -110.09153,1024.2708 75.575623,0 c 1.739741,0 3.140327,1.1493 3.140327,2.5769 0,1.4276 -1.400586,2.577 -3.140327,2.577 l -75.575623,0 c -1.73974,0 -3.14033,-1.1494 -3.14033,-2.577 0,-1.4276 1.40059,-2.5769 3.14033,-2.5769 z"
|
||||
style="opacity:0.92941176;fill:url(#linearGradient5303);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect5625-36"
|
||||
d="m -110.09153,995.73181 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57696 0,1.42763 -1.400586,2.57693 -3.140327,2.57693 l -75.575623,0 c -1.73974,0 -3.14033,-1.1493 -3.14033,-2.57693 0,-1.42764 1.40059,-2.57696 3.14033,-2.57696 z"
|
||||
style="opacity:0.92941176;fill:url(#linearGradient5305);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="rect5625-35"
|
||||
d="m -110.09153,981.46234 75.575623,0 c 1.739741,0 3.140327,1.14932 3.140327,2.57696 0,1.42763 -1.400586,2.57696 -3.140327,2.57696 l -75.575623,0 c -1.73974,0 -3.14033,-1.14933 -3.14033,-2.57696 0,-1.42764 1.40059,-2.57696 3.14033,-2.57696 z"
|
||||
style="opacity:0.92941176;fill:url(#linearGradient5307);fill-opacity:1;stroke:#000000;stroke-width:1.2043575;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer5"
|
||||
inkscape:label="Shadow"
|
||||
style="opacity:0.67094014;display:inline"
|
||||
transform="translate(0,-223)" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="Text"
|
||||
style="display:inline"
|
||||
transform="translate(0,-223)" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="Gloss"
|
||||
style="opacity:0.47435901;display:inline"
|
||||
transform="translate(0,-223)">
|
||||
<path
|
||||
style="fill:url(#linearGradient5019);fill-opacity:1;stroke:none;display:inline;enable-background:new"
|
||||
d="m 26.927629,225.52102 c -13.666067,0 -24.6717697,10.39098 -24.6717697,23.29594 l 0,42.58307 c 0,3.90838 1.0166466,7.58357 2.8036102,10.81163 C 1.943061,227.97415 67.223598,227.94658 80.756945,228.73555 77.08802,226.69323 72.80951,225.52102 68.224808,225.52102 l -41.297179,0 z"
|
||||
id="path4983"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="fill:url(#linearGradient5027);fill-opacity:1;stroke:none;display:inline;enable-background:new"
|
||||
d="m 92.887232,280.51365 c -3.599605,15.1144 -24.925793,26.61922 -44.577402,34.18231 l 19.914978,0 c 13.666067,0 24.662424,-10.39098 24.662424,-23.29593 l 0,-10.88638 z"
|
||||
id="rect4484"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 14 B |
|
@ -0,0 +1 @@
|
|||
icon-large.svg
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 14 B |
|
@ -1,22 +0,0 @@
|
|||
# -*- mode: makefile; -*-
|
||||
|
||||
all: Mixer
|
||||
|
||||
Mixer_SRCS := $(wildcard src/*.C src/*.fl src/Engine/*.C)
|
||||
|
||||
Mixer_SRCS:=$(Mixer_SRCS:.fl=.C)
|
||||
Mixer_SRCS:=$(sort $(Mixer_SRCS))
|
||||
Mixer_OBJS:=$(Mixer_SRCS:.C=.o)
|
||||
|
||||
Mixer_LIBS := $(FLTK_LIBS) $(JACK_LIBS) $(LASH_LIBS) $(LRDF_LIBS) $(LIBLO_LIBS) $(SIGCPP_LIBS) $(XPM_LIBS)
|
||||
|
||||
Mixer_CFLAGS := $(FLTK_CFLAGS) $(JACK_CFLAGS) $(LIBLO_CFLAGS) $(SIGCPP_CFLAGS) $(XPM_CFLAGS)
|
||||
|
||||
src/mixer: $(Mixer_OBJS) FL/libfl_widgets.a nonlib/libnonlib.a
|
||||
@ echo -n Linking mixer...
|
||||
@ $(CXX) $(CXXFLAGS) $(Mixer_LIBS) $(Mixer_OBJS) -o $@ -LFL -lfl_widgets -Lnonlib -lnonlib -ldl && echo $(DONE)
|
||||
|
||||
Mixer: src/mixer
|
||||
|
||||
Mixer_clean:
|
||||
rm -f $(Mixer_OBJS) src/mixer
|
|
@ -1,8 +1,9 @@
|
|||
[Desktop Entry]
|
||||
Name=Non Mixer
|
||||
Comment=Modular Digital Audio Workstation - Mixer
|
||||
Comment[fr]=Station de travail audio-numérique modulaire - Mixeur
|
||||
Exec=@BIN_PATH@/non-mixer
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Icon=non-mixer
|
||||
Categories=Application;AudioVideo;Audio;
|
||||
Categories=AudioVideo;Audio;
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
../nonlib
|
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 864 B |
After Width: | Height: | Size: 116 KiB |
After Width: | Height: | Size: 225 KiB |
After Width: | Height: | Size: 8.0 KiB |
|
@ -1 +0,0 @@
|
|||
../scripts/
|
|
@ -0,0 +1,177 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2013 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#include <FL/fl_draw.H>
|
||||
#include "AUX_Module.H"
|
||||
#include "dsp.h"
|
||||
|
||||
/* The purpose of this module is to provide auxiliary outputs, with
|
||||
* gain. This allows one to create a 'send' type topology without
|
||||
* having to use an extra strip to control the 'send' gain. */
|
||||
|
||||
AUX_Module::AUX_Module ( ) : JACK_Module ( false )
|
||||
{
|
||||
is_default( false );
|
||||
|
||||
{
|
||||
Port p( this, Port::INPUT, Port::CONTROL, "Gain (dB)" );
|
||||
p.hints.type = Port::Hints::LINEAR;
|
||||
p.hints.ranged = true;
|
||||
p.hints.minimum = -70.0f;
|
||||
p.hints.maximum = 6.0f;
|
||||
p.hints.default_value = 0.0f;
|
||||
|
||||
p.connect_to( new float );
|
||||
p.control_value( p.hints.default_value );
|
||||
|
||||
add_port( p );
|
||||
}
|
||||
|
||||
log_create();
|
||||
|
||||
color( FL_DARK1 );
|
||||
|
||||
smoothing.sample_rate( sample_rate() );
|
||||
}
|
||||
|
||||
AUX_Module::~AUX_Module ( )
|
||||
{
|
||||
configure_outputs(0);
|
||||
delete (float*)control_input[0].buffer();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
AUX_Module::number ( int n )
|
||||
{
|
||||
JACK_Module::number(n);
|
||||
|
||||
char s[10];
|
||||
snprintf( s, sizeof(s), "aux-%c", 'A' + n );
|
||||
prefix( s );
|
||||
snprintf( s, sizeof(s), "Aux (%c)", 'A' + n );
|
||||
copy_label( s );
|
||||
}
|
||||
|
||||
void
|
||||
AUX_Module::handle_sample_rate_change ( nframes_t n )
|
||||
{
|
||||
smoothing.sample_rate( n );
|
||||
}
|
||||
|
||||
void
|
||||
AUX_Module::process ( nframes_t nframes )
|
||||
{
|
||||
if ( unlikely( bypass() ) )
|
||||
{
|
||||
for ( unsigned int i = 0; i < audio_input.size(); ++i )
|
||||
{
|
||||
if ( audio_input[i].connected() )
|
||||
buffer_fill_with_silence( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), nframes );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
float gt = DB_CO( control_input[0].control_value() );
|
||||
|
||||
sample_t gainbuf[nframes];
|
||||
|
||||
bool use_gainbuf = smoothing.apply( gainbuf, nframes, gt );
|
||||
|
||||
if ( unlikely( use_gainbuf ) )
|
||||
{
|
||||
for ( unsigned int i = 0; i < audio_input.size(); ++i )
|
||||
{
|
||||
if ( audio_input[i].connected() )
|
||||
buffer_copy_and_apply_gain_buffer( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), (sample_t*)audio_input[i].buffer(), gainbuf, nframes );
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( unsigned int i = 0; i < audio_input.size(); ++i )
|
||||
{
|
||||
if ( audio_input[i].connected() )
|
||||
buffer_copy_and_apply_gain( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), (sample_t*)audio_input[i].buffer(), nframes, gt );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
AUX_Module::draw ( void )
|
||||
{
|
||||
int W = 5;
|
||||
|
||||
child(0)->size( w() - W, h() );
|
||||
Module::draw_box(x(),y(),w() - W,h());
|
||||
Module::draw_label(x(),y(),w() - W,h());
|
||||
|
||||
Module *m = this;
|
||||
|
||||
fl_color( fl_darker( FL_FOREGROUND_COLOR ) );
|
||||
|
||||
int spacing, offset;
|
||||
|
||||
spacing = h() / m->ninputs();
|
||||
offset = spacing / 2;
|
||||
for ( int i = m->ninputs(); i--; )
|
||||
{
|
||||
int xi = offset + ( spacing * i );
|
||||
fl_rectf( m->x() + m->w() - W, m->y() + xi, W, 2 );
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
AUX_Module::configure_outputs ( int n )
|
||||
{
|
||||
int on = audio_output.size();
|
||||
|
||||
if ( n > on )
|
||||
{
|
||||
for ( int i = on; i < n; ++i )
|
||||
{
|
||||
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( int i = on; i > n; --i )
|
||||
{
|
||||
audio_output.back().disconnect();
|
||||
audio_output.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
AUX_Module::configure_inputs ( int n )
|
||||
{
|
||||
bool b = JACK_Module::configure_inputs( n );
|
||||
|
||||
if ( b )
|
||||
{
|
||||
return configure_outputs( n );
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2013 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "JACK_Module.H"
|
||||
#include "dsp.h"
|
||||
|
||||
class AUX_Module : public JACK_Module
|
||||
{
|
||||
Value_Smoothing_Filter smoothing;
|
||||
|
||||
public:
|
||||
|
||||
virtual void number ( int v );
|
||||
|
||||
virtual const char *name ( void ) const { return "AUX"; }
|
||||
|
||||
int can_support_inputs ( int n ) { return n > 0 ? n : -1; }
|
||||
|
||||
virtual bool configure_outputs ( int n );
|
||||
virtual bool configure_inputs ( int n );
|
||||
|
||||
AUX_Module ( );
|
||||
virtual ~AUX_Module ( );
|
||||
|
||||
LOG_CREATE_FUNC( AUX_Module );
|
||||
|
||||
virtual void handle_sample_rate_change ( nframes_t n );
|
||||
|
||||
protected:
|
||||
|
||||
virtual void draw ( void );
|
||||
virtual void process ( nframes_t nframes );
|
||||
|
||||
};
|
||||
|
|
@ -72,11 +72,11 @@
|
|||
#include "FL/test_press.H"
|
||||
|
||||
#include "debug.h"
|
||||
#include "Engine/Engine.H"
|
||||
#include "Group.H"
|
||||
|
||||
#include "Mixer_Strip.H"
|
||||
#include <dsp.h>
|
||||
|
||||
#include "Mixer.H"
|
||||
extern char *instance_name;
|
||||
|
||||
|
||||
|
@ -86,7 +86,8 @@ extern char *instance_name;
|
|||
Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "")
|
||||
|
||||
{
|
||||
_engine = NULL;
|
||||
/* not really deleting here, but reusing this variable */
|
||||
_deleting = true;
|
||||
|
||||
int X = 0;
|
||||
int Y = 0;
|
||||
|
@ -127,7 +128,7 @@ Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "")
|
|||
o->type( Fl_Scroll::VERTICAL );
|
||||
{ Fl_Pack *o = modules_pack = new Fl_Pack( X, Y, W, H );
|
||||
o->type( Fl_Pack::VERTICAL );
|
||||
o->spacing( 10 );
|
||||
o->spacing( 6 );
|
||||
o->end();
|
||||
Fl_Group::current()->resizable( o );
|
||||
}
|
||||
|
@ -144,11 +145,9 @@ Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "")
|
|||
o->color( FL_BACKGROUND_COLOR );
|
||||
o->box( FL_NO_BOX );
|
||||
o->type( Fl_Scroll::VERTICAL );
|
||||
{ Fl_Flowpack *o = controls_pack = new Fl_Flowpack( X, Y, W, H );
|
||||
o->type( FL_VERTICAL );
|
||||
o->hspacing( 10 );
|
||||
o->vspacing( 10 );
|
||||
o->box( FL_NO_BOX );
|
||||
{ Fl_Pack *o = controls_pack = new Fl_Pack( X, Y, W, H );
|
||||
o->type( Fl_Pack::VERTICAL );
|
||||
o->spacing( 5 );
|
||||
// o->color( FL_RED );
|
||||
o->end();
|
||||
Fl_Group::current()->resizable( o );
|
||||
|
@ -163,6 +162,8 @@ Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "")
|
|||
end();
|
||||
|
||||
log_create();
|
||||
|
||||
_deleting = false;
|
||||
}
|
||||
|
||||
Chain::~Chain ( )
|
||||
|
@ -171,15 +172,31 @@ Chain::~Chain ( )
|
|||
|
||||
log_destroy();
|
||||
|
||||
engine()->lock();
|
||||
_deleting = true;
|
||||
|
||||
/* FIXME: client may already be dead during teardown if group is destroyed first. */
|
||||
if ( client() )
|
||||
client()->lock();
|
||||
|
||||
for ( unsigned int i = scratch_port.size(); i--; )
|
||||
free( (sample_t*)scratch_port[i].buffer() );
|
||||
scratch_port.clear();
|
||||
|
||||
/* if we leave this up to FLTK, it will happen after we've
|
||||
already destroyed the engine */
|
||||
already destroyed the client */
|
||||
modules_pack->clear();
|
||||
modules_pack = NULL;
|
||||
controls_pack->clear();
|
||||
modules_pack = NULL;
|
||||
|
||||
delete _engine;
|
||||
_engine = NULL;
|
||||
if ( client() )
|
||||
client()->unlock();
|
||||
}
|
||||
|
||||
Group *
|
||||
Chain::client ( void )
|
||||
{
|
||||
return strip()->group();
|
||||
}
|
||||
|
||||
|
||||
|
@ -221,7 +238,7 @@ Chain::set ( Log_Entry &e )
|
|||
|
||||
|
||||
void
|
||||
Chain::log_children ( void )
|
||||
Chain::log_children ( void ) const
|
||||
{
|
||||
log_create();
|
||||
|
||||
|
@ -247,13 +264,12 @@ Chain::initialize_with_default ( void )
|
|||
m->is_default( true );
|
||||
m->chain( this );
|
||||
m->configure_outputs( 1 );
|
||||
m->initialize();
|
||||
add( m );
|
||||
}
|
||||
|
||||
{ Module *m = new Gain_Module();
|
||||
m->is_default( true );
|
||||
m->initialize();
|
||||
m->chain(this);
|
||||
add( m );
|
||||
}
|
||||
|
||||
|
@ -265,7 +281,6 @@ Chain::initialize_with_default ( void )
|
|||
{ JACK_Module *m = new JACK_Module();
|
||||
m->is_default( true );
|
||||
m->chain( this );
|
||||
m->initialize();
|
||||
add( m );
|
||||
}
|
||||
}
|
||||
|
@ -293,6 +308,38 @@ void Chain::cb_handle(Fl_Widget* o, void* v) {
|
|||
((Chain*)(v))->cb_handle(o);
|
||||
}
|
||||
|
||||
void
|
||||
Chain::remove ( Controller_Module *m )
|
||||
{
|
||||
DMESSAGE( "Removing controller module from chain" );
|
||||
|
||||
client()->lock();
|
||||
|
||||
m->disconnect();
|
||||
|
||||
controls_pack->remove( m );
|
||||
modules_pack->remove( m );
|
||||
|
||||
build_process_queue();
|
||||
|
||||
client()->unlock();
|
||||
|
||||
redraw();
|
||||
}
|
||||
|
||||
void
|
||||
Chain::send_feedback ( bool force )
|
||||
{
|
||||
for ( int i = 0; i < modules(); i++ )
|
||||
module(i)->send_feedback( force );
|
||||
}
|
||||
|
||||
void
|
||||
Chain::schedule_feedback ( void )
|
||||
{
|
||||
for ( int i = 0; i < modules(); i++ )
|
||||
module(i)->schedule_feedback();
|
||||
}
|
||||
|
||||
/* remove a module from the chain. this isn't guaranteed to succeed,
|
||||
* because removing the module might result in an invalid routing */
|
||||
|
@ -311,11 +358,15 @@ Chain::remove ( Module *m )
|
|||
fl_alert( "Can't remove module at this point because the resultant chain is invalid" );
|
||||
}
|
||||
|
||||
client()->lock();
|
||||
|
||||
strip()->handle_module_removed( m );
|
||||
|
||||
modules_pack->remove( m );
|
||||
|
||||
configure_ports();
|
||||
|
||||
client()->unlock();
|
||||
}
|
||||
|
||||
/* determine number of output ports, signal if changed. */
|
||||
|
@ -324,10 +375,10 @@ Chain::configure_ports ( void )
|
|||
{
|
||||
int nouts = 0;
|
||||
|
||||
engine()->lock();
|
||||
client()->lock();
|
||||
|
||||
for ( int i = 0; i < modules(); ++i )
|
||||
{
|
||||
{
|
||||
module( i )->configure_inputs( nouts );
|
||||
nouts = module( i )->noutputs();
|
||||
}
|
||||
|
@ -338,39 +389,82 @@ Chain::configure_ports ( void )
|
|||
|
||||
if ( scratch_port.size() < req_buffers )
|
||||
{
|
||||
for ( unsigned int i = scratch_port.size(); i--; )
|
||||
delete[] (sample_t*)scratch_port[i].buffer();
|
||||
scratch_port.clear();
|
||||
|
||||
for ( unsigned int i = 0; i < req_buffers; ++i )
|
||||
{
|
||||
Module::Port p( NULL, Module::Port::OUTPUT, Module::Port::AUDIO );
|
||||
p.connect_to( new sample_t[engine()->nframes()] );
|
||||
buffer_fill_with_silence( (sample_t*)p.buffer(), engine()->nframes() );
|
||||
for ( unsigned int i = req_buffers - scratch_port.size(); i--; )
|
||||
{
|
||||
Module::Port p( NULL, Module::Port::OUTPUT, Module::Port::AUDIO );
|
||||
p.set_buffer( buffer_alloc( client()->nframes() ) );
|
||||
buffer_fill_with_silence( (sample_t*)p.buffer(), client()->nframes() );
|
||||
scratch_port.push_back( p );
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( scratch_port.size() > req_buffers )
|
||||
{
|
||||
for ( unsigned int i = scratch_port.size() - req_buffers; i--; )
|
||||
{
|
||||
free(scratch_port.back().buffer());
|
||||
scratch_port.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
build_process_queue();
|
||||
|
||||
engine()->unlock();
|
||||
client()->unlock();
|
||||
|
||||
parent()->redraw();
|
||||
}
|
||||
|
||||
/** invoked from the JACK latency callback... We need to update the latency values on this chains ports */
|
||||
void
|
||||
Chain::set_latency ( JACK::Port::direction_e dir )
|
||||
{
|
||||
nframes_t tmax = 0;
|
||||
nframes_t tmin = 0;
|
||||
nframes_t added_min = 0;
|
||||
nframes_t added_max = 0;
|
||||
|
||||
for ( int i = 0; i < modules(); i++ )
|
||||
{
|
||||
Module *m;
|
||||
|
||||
if ( dir == JACK::Port::Input )
|
||||
m = module( i );
|
||||
else
|
||||
m = module( (modules() - 1) - i );
|
||||
|
||||
nframes_t min,max;
|
||||
min = max = 0;
|
||||
|
||||
nframes_t a = m->get_module_latency();
|
||||
|
||||
added_min += a;
|
||||
added_max += a;
|
||||
|
||||
if ( dir == JACK::Port::Input ? m->aux_audio_input.size() : m->aux_audio_output.size() )
|
||||
{
|
||||
m->get_latency( dir, &min, &max );
|
||||
|
||||
tmin = 0;
|
||||
added_min = 0;
|
||||
}
|
||||
|
||||
if ( min > tmin )
|
||||
tmin = min;
|
||||
if ( max > tmax )
|
||||
tmax = max;
|
||||
|
||||
m->set_latency( dir, tmin + added_min, tmax + added_max );
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
Chain::get_module_instance_number ( Module *m )
|
||||
{
|
||||
int n = 0;
|
||||
|
||||
for ( int i = 0; i < modules(); ++i )
|
||||
{
|
||||
if ( module(i) == m )
|
||||
break;
|
||||
|
||||
if ( ! strcmp( module(i)->name(), m->name() ) )
|
||||
if ( ! strcmp( module(i)->base_label(), m->base_label() ) )
|
||||
n++;
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
|
@ -426,43 +520,42 @@ Chain::maximum_name_length ( void )
|
|||
return JACK::Client::maximum_name_length() - ( strlen( instance_name ) + 1 );
|
||||
}
|
||||
|
||||
void
|
||||
Chain::freeze_ports ( void )
|
||||
{
|
||||
for ( int i = 0; i < modules(); i++ )
|
||||
{
|
||||
Module *m = module(i);
|
||||
m->freeze_ports();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Chain::thaw_ports ( void )
|
||||
{
|
||||
for ( int i = 0; i < modules(); i++ )
|
||||
{
|
||||
Module *m = module(i);
|
||||
m->thaw_ports();
|
||||
}
|
||||
}
|
||||
|
||||
/* rename chain... we have to let our modules know our name has
|
||||
* changed so they can take the appropriate action (in particular the
|
||||
* JACK module). */
|
||||
void
|
||||
Chain::name ( const char *name )
|
||||
{
|
||||
char ename[512];
|
||||
snprintf( ename, sizeof(ename), "%s/%s", instance_name, name );
|
||||
|
||||
if ( ! _engine )
|
||||
{
|
||||
_engine = new Engine( &Chain::process, this );
|
||||
|
||||
engine()->buffer_size_callback( &Chain::buffer_size, this );
|
||||
|
||||
const char *jack_name = engine()->init( ename );
|
||||
|
||||
if ( ! jack_name )
|
||||
{
|
||||
_engine = NULL;
|
||||
|
||||
fl_alert( "Could not create JACK client. Perhaps the sound device already in use. In any event, now I'll die." );
|
||||
exit( 1 );
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DMESSAGE( "Renaming JACK client from \"%s\" to \"%s\"", _name, ename );
|
||||
|
||||
_name = engine()->name( ename );
|
||||
/* FIXME: discarding the name jack picked is technically wrong! */
|
||||
|
||||
}
|
||||
|
||||
_name = name;
|
||||
|
||||
if ( strip()->group() )
|
||||
{
|
||||
if ( strip()->group()->single() )
|
||||
/* we are the owner of this group and its only member, so
|
||||
* rename it */
|
||||
strip()->group()->name(name);
|
||||
}
|
||||
|
||||
for ( int i = 0; i < modules(); ++i )
|
||||
{
|
||||
module( i )->handle_chain_name_changed();
|
||||
|
@ -490,22 +583,28 @@ Chain::add ( Controller_Module *m )
|
|||
bool
|
||||
Chain::insert ( Module *m, Module *n )
|
||||
{
|
||||
client()->lock();
|
||||
|
||||
engine()->lock();
|
||||
Module::sample_rate( client()->sample_rate() );
|
||||
n->resize_buffers( client()->nframes() );
|
||||
|
||||
/* inserting a new instance */
|
||||
if ( -1 == n->number() )
|
||||
n->number( get_module_instance_number( n ) );
|
||||
|
||||
if ( !m )
|
||||
{
|
||||
if ( modules() == 0 && n->can_support_inputs( 0 ) >= 0 )
|
||||
{
|
||||
n->chain( this );
|
||||
n->configure_inputs( 0 );
|
||||
modules_pack->add( n );
|
||||
n->chain( this );
|
||||
}
|
||||
else if ( n->can_support_inputs( module( modules() - 1 )->noutputs() ) >= 0 )
|
||||
{
|
||||
n->chain( this );
|
||||
n->configure_inputs( module( modules() - 1 )->noutputs() );
|
||||
modules_pack->add( n );
|
||||
n->chain( this );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -518,6 +617,8 @@ Chain::insert ( Module *m, Module *n )
|
|||
{
|
||||
int i = modules_pack->find( m );
|
||||
|
||||
n->chain( this );
|
||||
|
||||
if ( 0 == i )
|
||||
{
|
||||
/* inserting to head of chain*/
|
||||
|
@ -542,9 +643,15 @@ Chain::insert ( Module *m, Module *n )
|
|||
}
|
||||
|
||||
modules_pack->insert( *n, i );
|
||||
n->chain( this );
|
||||
}
|
||||
|
||||
|
||||
strip()->handle_module_added( n );
|
||||
|
||||
configure_ports();
|
||||
|
||||
client()->unlock();
|
||||
|
||||
DMESSAGE( "Module \"%s\" has %i:%i audio and %i:%i control ports",
|
||||
n->name(),
|
||||
n->ninputs(),
|
||||
|
@ -552,19 +659,14 @@ Chain::insert ( Module *m, Module *n )
|
|||
n->ncontrol_inputs(),
|
||||
n->ncontrol_outputs() );
|
||||
|
||||
strip()->handle_module_added( n );
|
||||
|
||||
configure_ports();
|
||||
|
||||
engine()->unlock();
|
||||
|
||||
n->initialize();
|
||||
return true;
|
||||
|
||||
err:
|
||||
|
||||
DMESSAGE( "Insert failed" );
|
||||
client()->unlock();
|
||||
|
||||
engine()->unlock();
|
||||
DMESSAGE( "Insert failed" );
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@ -573,13 +675,13 @@ err:
|
|||
void
|
||||
Chain::add_control ( Controller_Module *m )
|
||||
{
|
||||
engine()->lock();
|
||||
client()->lock();
|
||||
|
||||
controls_pack->add( m );
|
||||
|
||||
configure_ports();
|
||||
|
||||
engine()->unlock();
|
||||
client()->unlock();
|
||||
|
||||
controls_pack->redraw();
|
||||
}
|
||||
|
@ -596,7 +698,7 @@ Chain::draw_connections ( Module *m )
|
|||
|
||||
fl_push_clip( X, Y, W, H );
|
||||
|
||||
Fl_Color c =fl_color_average( FL_WHITE, FL_YELLOW, 0.50 );
|
||||
Fl_Color c = FL_FOREGROUND_COLOR;
|
||||
fl_color( c );
|
||||
|
||||
if ( m->ninputs() )
|
||||
|
@ -605,7 +707,7 @@ Chain::draw_connections ( Module *m )
|
|||
offset = spacing / 2;
|
||||
|
||||
for ( int i = m->ninputs(); i--; )
|
||||
fl_rectf( m->x() + offset + ( spacing * i ), m->y() - 5, 2, 5 );
|
||||
fl_rectf( m->x() + offset + ( spacing * i ), m->y() - 3, 2, 3 );
|
||||
}
|
||||
|
||||
fl_color( fl_darker( c ) );
|
||||
|
@ -615,7 +717,7 @@ Chain::draw_connections ( Module *m )
|
|||
spacing = w() / m->noutputs();
|
||||
offset = spacing / 2;
|
||||
for ( int i = m->noutputs(); i--; )
|
||||
fl_rectf( m->x() + offset + ( spacing * i ), m->y() + m->h(), 2, 5 );
|
||||
fl_rectf( m->x() + offset + ( spacing * i ), m->y() + m->h(), 2, 3 );
|
||||
}
|
||||
|
||||
fl_pop_clip();
|
||||
|
@ -637,6 +739,8 @@ Chain::add_to_process_queue ( Module *m )
|
|||
void
|
||||
Chain::build_process_queue ( void )
|
||||
{
|
||||
client()->lock();
|
||||
|
||||
process_queue.clear();
|
||||
|
||||
for ( int i = 0; i < modules(); ++i )
|
||||
|
@ -668,14 +772,16 @@ Chain::build_process_queue ( void )
|
|||
/* connect all the ports to the buffers */
|
||||
for ( int i = 0; i < modules(); ++i )
|
||||
{
|
||||
|
||||
Module *m = module( i );
|
||||
|
||||
for ( unsigned int j = 0; j < m->audio_input.size(); ++j )
|
||||
{
|
||||
m->audio_input[j].connect_to( &scratch_port[j] );
|
||||
m->audio_input[j].set_buffer( scratch_port[j].buffer() );
|
||||
}
|
||||
for ( unsigned int j = 0; j < m->audio_output.size(); ++j )
|
||||
{
|
||||
m->audio_output[j].connect_to( &scratch_port[j] );
|
||||
m->audio_output[j].set_buffer( scratch_port[j].buffer() );
|
||||
}
|
||||
|
||||
m->handle_port_connection_change();
|
||||
|
@ -702,6 +808,8 @@ Chain::build_process_queue ( void )
|
|||
/* delete[] s; */
|
||||
/* } */
|
||||
/* } */
|
||||
|
||||
client()->unlock();
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -732,6 +840,59 @@ Chain::resize ( int X, int Y, int W, int H )
|
|||
controls_pack->size( W, controls_pack->h() );
|
||||
}
|
||||
|
||||
void
|
||||
Chain::get_output_ports ( std::list<std::string> &sl)
|
||||
{
|
||||
for ( int i = 0; i < modules(); i++ )
|
||||
{
|
||||
Module *m = module(i);
|
||||
|
||||
for ( unsigned int j = 0; j < m->aux_audio_output.size(); j++ )
|
||||
{
|
||||
char *s;
|
||||
|
||||
asprintf( &s, "%s/%s",
|
||||
"*",
|
||||
m->aux_audio_output[j].jack_port()->name() );
|
||||
|
||||
sl.push_back( s );
|
||||
|
||||
free(s);
|
||||
|
||||
if ( ! strip()->group()->single() )
|
||||
{
|
||||
asprintf( &s, "%s/%s",
|
||||
strip()->group()->name(),
|
||||
m->aux_audio_output[j].jack_port()->name() );
|
||||
|
||||
|
||||
sl.push_back( s );
|
||||
|
||||
free(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Chain::auto_connect_outputs ( void )
|
||||
{
|
||||
for ( int i = 0; i < modules(); i++ )
|
||||
{
|
||||
module(i)->auto_connect_outputs();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Chain::auto_disconnect_outputs ( void )
|
||||
{
|
||||
for ( int i = 0; i < modules(); i++ )
|
||||
{
|
||||
module(i)->auto_disconnect_outputs();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*****************/
|
||||
|
@ -762,38 +923,25 @@ Chain::do_export ( const char *filename )
|
|||
|
||||
|
||||
/**********/
|
||||
/* Engine */
|
||||
/* Client */
|
||||
/**********/
|
||||
|
||||
void
|
||||
Chain::process ( nframes_t nframes, void *v )
|
||||
{
|
||||
((Chain*)v)->process( nframes );
|
||||
}
|
||||
|
||||
void
|
||||
Chain::process ( nframes_t nframes )
|
||||
{
|
||||
for ( std::list<Module*>::const_iterator i = process_queue.begin(); i != process_queue.end(); ++i )
|
||||
{
|
||||
Module *m = *i;
|
||||
|
||||
if ( ! m->bypass() )
|
||||
m->process( nframes );
|
||||
Module *m = *i;
|
||||
|
||||
m->process( nframes );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Chain::buffer_size ( nframes_t nframes, void *v )
|
||||
{
|
||||
((Chain*)v)->buffer_size( nframes );
|
||||
}
|
||||
|
||||
void
|
||||
Chain::buffer_size ( nframes_t nframes )
|
||||
{
|
||||
for ( unsigned int i = scratch_port.size(); i--; )
|
||||
delete[] (sample_t*)scratch_port[i].buffer();
|
||||
free(scratch_port[i].buffer());
|
||||
scratch_port.clear();
|
||||
|
||||
configure_ports();
|
||||
|
@ -805,3 +953,69 @@ Chain::buffer_size ( nframes_t nframes )
|
|||
m->resize_buffers( nframes );
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
Chain::sample_rate_change ( nframes_t nframes )
|
||||
{
|
||||
Module::sample_rate ( nframes );
|
||||
for ( int i = 0; i < modules(); ++i )
|
||||
{
|
||||
Module *m = module(i);
|
||||
|
||||
m->handle_sample_rate_change( nframes );
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* handle jack port connection change */
|
||||
void
|
||||
Chain::port_connect ( jack_port_id_t a, jack_port_id_t b, int connect )
|
||||
{
|
||||
if ( _deleting )
|
||||
return;
|
||||
|
||||
/* this is called from JACK non-RT thread... */
|
||||
|
||||
if ( jack_port_is_mine( client()->jack_client(), jack_port_by_id( client()->jack_client(), a ) ) ||
|
||||
jack_port_is_mine( client()->jack_client(), jack_port_by_id( client()->jack_client(), b ) ))
|
||||
{
|
||||
Fl::awake( Chain::update_connection_status, this );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Chain::update ( void )
|
||||
{
|
||||
for ( int i = 0; i < controls_pack->children(); ++i )
|
||||
{
|
||||
Controller_Module *cm = (Controller_Module*)controls_pack->child( i );
|
||||
cm->update();
|
||||
}
|
||||
|
||||
for ( int i = 0; i < modules(); i++ )
|
||||
{
|
||||
Module *m = module(i);
|
||||
m->update();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Chain::update_connection_status ( void *v )
|
||||
{
|
||||
((Chain*)v)->update_connection_status();
|
||||
}
|
||||
|
||||
void
|
||||
Chain::update_connection_status ( void )
|
||||
{
|
||||
for ( int i = 0; i < modules(); i++ )
|
||||
{
|
||||
Module *m = module(i);
|
||||
|
||||
if ( !strcmp( m->basename(), "JACK" ) )
|
||||
{
|
||||
((JACK_Module*)m)->update_connection_status();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,17 +28,17 @@
|
|||
#include <vector>
|
||||
#include <list>
|
||||
#include "Loggable.H"
|
||||
#include "Group.H"
|
||||
|
||||
class Mixer_Strip;
|
||||
class Fl_Flowpack;
|
||||
class Fl_Flip_Button;
|
||||
class Engine;
|
||||
class Controller_Module;
|
||||
|
||||
class Chain : public Fl_Group, public Loggable {
|
||||
|
||||
Fl_Flip_Button *tab_button;
|
||||
Fl_Flowpack *controls_pack;
|
||||
Fl_Pack *controls_pack;
|
||||
Fl_Group *chain_tab;
|
||||
Fl_Group *control_tab;
|
||||
Fl_Pack *modules_pack;
|
||||
|
@ -50,10 +50,10 @@ class Chain : public Fl_Group, public Loggable {
|
|||
|
||||
std::vector <Module::Port> scratch_port;
|
||||
|
||||
Engine *_engine;
|
||||
|
||||
Fl_Callback *_configure_outputs_callback;
|
||||
void *_configure_outputs_userdata;
|
||||
|
||||
bool _deleting;
|
||||
|
||||
private:
|
||||
|
||||
|
@ -67,11 +67,8 @@ private:
|
|||
void build_process_queue ( void );
|
||||
void add_to_process_queue ( Module *m );
|
||||
|
||||
static void process ( nframes_t, void * );
|
||||
void process ( nframes_t );
|
||||
|
||||
static void buffer_size ( nframes_t nframes, void *v );
|
||||
void buffer_size ( nframes_t nframes );
|
||||
static void update_connection_status ( void *v );
|
||||
void update_connection_status ( void );
|
||||
|
||||
protected:
|
||||
|
||||
|
@ -80,10 +77,21 @@ protected:
|
|||
|
||||
public:
|
||||
|
||||
void auto_connect_outputs ( void );
|
||||
void auto_disconnect_outputs ( void );
|
||||
|
||||
void get_output_ports ( std::list<std::string> &sl);
|
||||
|
||||
void port_connect ( jack_port_id_t a, jack_port_id_t b, int connect );
|
||||
void buffer_size ( nframes_t nframes );
|
||||
int sample_rate_change ( nframes_t nframes );
|
||||
void process ( nframes_t );
|
||||
|
||||
Chain ( int X, int Y, int W, int H, const char *L = 0 );
|
||||
Chain ( );
|
||||
virtual ~Chain ( );
|
||||
|
||||
void update ( void );
|
||||
void draw ( void );
|
||||
void resize ( int X, int Y, int W, int H );
|
||||
|
||||
|
@ -92,6 +100,9 @@ public:
|
|||
const char *name ( void ) const { return _name; }
|
||||
void name ( const char *name );
|
||||
|
||||
void send_feedback ( bool force );
|
||||
void schedule_feedback ( void );
|
||||
|
||||
int get_module_instance_number ( Module *m );
|
||||
|
||||
void configure_ports ( void );
|
||||
|
@ -99,8 +110,9 @@ public:
|
|||
|
||||
bool can_support_input_channels ( int n );
|
||||
|
||||
int modules ( void ) const { return modules_pack->children(); }
|
||||
int modules ( void ) const { return modules_pack ? modules_pack->children() : 0; }
|
||||
Module *module ( int n ) const { return (Module*)modules_pack->child( n ); }
|
||||
void remove ( Controller_Module *m );
|
||||
void remove ( Module *m );
|
||||
bool add ( Module *m );
|
||||
bool add ( Controller_Module *m );
|
||||
|
@ -119,13 +131,20 @@ public:
|
|||
_configure_outputs_userdata = v;
|
||||
}
|
||||
|
||||
void set_latency ( JACK::Port::direction_e );
|
||||
|
||||
Fl_Callback * configure_outputs_callback ( void ) const { return _configure_outputs_callback; }
|
||||
|
||||
void log_children ( void );
|
||||
virtual void log_children ( void ) const;
|
||||
|
||||
static unsigned int maximum_name_length ( void );
|
||||
|
||||
Engine *engine ( void ) const { return _engine; }
|
||||
Group *client ( void );
|
||||
|
||||
void freeze_ports ( void );
|
||||
void thaw_ports ( void );
|
||||
|
||||
// void client ( Client * );
|
||||
|
||||
LOG_CREATE_FUNC( Chain );
|
||||
};
|
||||
|
|
|
@ -30,33 +30,51 @@
|
|||
#include <FL/Fl_Menu_Button.H>
|
||||
#include <FL/Fl_Menu_.H>
|
||||
#include <FL/Fl_Light_Button.H>
|
||||
#include "FL/Crystal_Boxtypes.H"
|
||||
#include <FL/fl_draw.H>
|
||||
#include "FL/Fl_Arc_Dial.H"
|
||||
#include "FL/Fl_DialX.H"
|
||||
#include "FL/Fl_Labelpad_Group.H"
|
||||
#include "FL/Fl_Value_SliderX.H"
|
||||
#include "Panner.H"
|
||||
#include "FL/test_press.H"
|
||||
#include "FL/menu_popup.H"
|
||||
|
||||
#include "Engine/Engine.H"
|
||||
#include "Chain.H"
|
||||
#include "OSC/Endpoint.H"
|
||||
|
||||
// needed for mixer->endpoint
|
||||
#include "Mixer.H"
|
||||
#include "Spatialization_Console.H"
|
||||
#include "string_util.h"
|
||||
|
||||
|
||||
|
||||
const float CONTROL_UPDATE_FREQ = 0.2f;
|
||||
bool Controller_Module::learn_by_number = false;
|
||||
bool Controller_Module::_learn_mode = false;
|
||||
|
||||
Controller_Module* Controller_Module::_learning_control = NULL;
|
||||
|
||||
|
||||
|
||||
void
|
||||
Controller_Module::take_focus ( void )
|
||||
{
|
||||
bool v = visible_focus();
|
||||
|
||||
if ( ! v )
|
||||
set_visible_focus();
|
||||
|
||||
Fl_Widget::take_focus();
|
||||
|
||||
if ( ! v )
|
||||
clear_visible_focus();
|
||||
}
|
||||
|
||||
Controller_Module::Controller_Module ( bool is_default ) : Module( is_default, 50, 100, name() )
|
||||
{
|
||||
// label( "" );
|
||||
box( FL_NO_BOX );
|
||||
|
||||
_horizontal = true;
|
||||
_pad = true;
|
||||
control = 0;
|
||||
control_value =0.0f;
|
||||
|
@ -71,15 +89,12 @@ Controller_Module::Controller_Module ( bool is_default ) : Module( is_default, 5
|
|||
|
||||
end();
|
||||
|
||||
Fl::add_timeout( CONTROL_UPDATE_FREQ, update_cb, this );
|
||||
|
||||
// clear_visible_focus();
|
||||
log_create();
|
||||
}
|
||||
|
||||
Controller_Module::~Controller_Module ( )
|
||||
{
|
||||
Fl::remove_timeout( update_cb, this );
|
||||
|
||||
log_destroy();
|
||||
|
||||
/* shutdown JACK port, if we have one */
|
||||
|
@ -89,9 +104,32 @@ Controller_Module::~Controller_Module ( )
|
|||
void
|
||||
Controller_Module::handle_chain_name_changed()
|
||||
{
|
||||
if ( type() == SPATIALIZATION )
|
||||
{
|
||||
if ( Mixer::spatialization_console )
|
||||
Mixer::spatialization_console->update();
|
||||
}
|
||||
|
||||
// change_osc_path( generate_osc_path() );
|
||||
}
|
||||
|
||||
void
|
||||
Controller_Module::handle_control_disconnect ( Module::Port *p )
|
||||
{
|
||||
if ( type() == SPATIALIZATION )
|
||||
{
|
||||
if ( Mixer::spatialization_console )
|
||||
Mixer::spatialization_console->update();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Controller_Module::disconnect ( void )
|
||||
{
|
||||
for ( unsigned int i = 0; i < control_output.size(); ++i )
|
||||
control_output[i].disconnect();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
|
@ -100,11 +138,21 @@ Controller_Module::get ( Log_Entry &e ) const
|
|||
Module::get( e );
|
||||
|
||||
Port *p = control_output[0].connected_port();
|
||||
Module *m = p->module();
|
||||
|
||||
e.add( ":module", m );
|
||||
e.add( ":port", m->control_input_port_index( p ) );
|
||||
e.add( ":mode", mode() );
|
||||
if ( !p )
|
||||
{
|
||||
e.add( ":module", "" );
|
||||
e.add( ":port", "" );
|
||||
e.add( ":mode", "" );
|
||||
}
|
||||
else
|
||||
{
|
||||
Module *m = p->module();
|
||||
|
||||
e.add( ":module", m );
|
||||
e.add( ":port", m->control_input_port_index( p ) );
|
||||
e.add( ":mode", mode() );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -141,7 +189,6 @@ Controller_Module::set ( Log_Entry &e )
|
|||
{
|
||||
connect_to( &module->control_input[port] );
|
||||
module->chain()->add_control( this );
|
||||
label( module->control_input[port].name() );
|
||||
}
|
||||
|
||||
for ( int i = 0; i < e.size(); ++i )
|
||||
|
@ -163,45 +210,141 @@ Controller_Module::set ( Log_Entry &e )
|
|||
void
|
||||
Controller_Module::mode ( Mode m )
|
||||
{
|
||||
|
||||
if( mode() != CV && m == CV )
|
||||
{
|
||||
if ( control_output[0].connected() )
|
||||
{
|
||||
chain()->engine()->lock();
|
||||
chain()->client()->lock();
|
||||
|
||||
Port *p = control_output[0].connected_port();
|
||||
|
||||
char prefix[512];
|
||||
|
||||
JACK::Port po( chain()->engine(), JACK::Port::Input, p->name(), 0, "CV" );
|
||||
const Module *m = p->module();
|
||||
|
||||
if ( m->number() >= 0 )
|
||||
/* we do it this way now to ensure uniqueness */
|
||||
snprintf( prefix, sizeof(prefix), "CV-%s/%s", m->label(), p->name() );
|
||||
else
|
||||
snprintf( prefix, sizeof(prefix), "CV-%s", p->name() );
|
||||
|
||||
if ( ! po.activate() )
|
||||
{
|
||||
fl_alert( "Could not activate JACK port \"%s\"", po.name() );
|
||||
chain()->engine()->unlock();
|
||||
return;
|
||||
}
|
||||
add_aux_cv_input( prefix, 0 );
|
||||
|
||||
if ( po.valid() )
|
||||
{
|
||||
jack_input.push_back( po );
|
||||
}
|
||||
|
||||
chain()->engine()->unlock();
|
||||
chain()->client()->unlock();
|
||||
}
|
||||
}
|
||||
else if ( mode() == CV && m != CV )
|
||||
{
|
||||
chain()->engine()->lock();
|
||||
chain()->client()->lock();
|
||||
|
||||
jack_input.back().shutdown();
|
||||
jack_input.pop_back();
|
||||
aux_audio_input.back().jack_port()->shutdown();
|
||||
|
||||
delete aux_audio_input.back().jack_port();
|
||||
|
||||
chain()->engine()->unlock();
|
||||
aux_audio_input.pop_back();
|
||||
|
||||
chain()->client()->unlock();
|
||||
}
|
||||
|
||||
_mode = m ;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
Controller_Module::connect_spatializer_radius_to ( Module *m )
|
||||
{
|
||||
Port *radius_port = NULL;
|
||||
float radius_value = 0.0f;
|
||||
|
||||
for ( unsigned int i = 0; i < m->control_input.size(); ++i )
|
||||
{
|
||||
Port *p = &m->control_input[i];
|
||||
|
||||
if ( !strcasecmp( "Radius", p->name() ) )
|
||||
/* 90.0f == p->hints.maximum && */
|
||||
/* -90.0f == p->hints.minimum ) */
|
||||
{
|
||||
radius_port = p;
|
||||
radius_value = p->control_value();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! radius_port )
|
||||
return false;
|
||||
|
||||
if ( control_output.size() != 3 )
|
||||
{
|
||||
control_output.clear();
|
||||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
|
||||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
|
||||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
|
||||
}
|
||||
|
||||
|
||||
control_output[2].connect_to( radius_port );
|
||||
|
||||
maybe_create_panner();
|
||||
|
||||
Panner *o = (Panner*)control;
|
||||
|
||||
o->point( 0 )->radius( radius_value );
|
||||
|
||||
if ( Mixer::spatialization_console )
|
||||
Mixer::spatialization_console->update();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
Controller_Module::maybe_create_panner ( void )
|
||||
{
|
||||
if ( _type != SPATIALIZATION )
|
||||
{
|
||||
clear();
|
||||
|
||||
Panner *o = new Panner( 0,0, 92,92 );
|
||||
|
||||
o->box(FL_FLAT_BOX);
|
||||
o->color(FL_GRAY0);
|
||||
o->selection_color(FL_BACKGROUND_COLOR);
|
||||
o->labeltype(FL_NORMAL_LABEL);
|
||||
o->labelfont(0);
|
||||
o->labelcolor(FL_FOREGROUND_COLOR);
|
||||
o->align(FL_ALIGN_TOP);
|
||||
o->when(FL_WHEN_CHANGED);
|
||||
label( "Spatialization" );
|
||||
|
||||
o->align(FL_ALIGN_TOP);
|
||||
o->labelsize( 10 );
|
||||
// o->callback( cb_panner_value_handle, new callback_data( this, azimuth_port_number, elevation_port_number ) );
|
||||
|
||||
|
||||
o->callback( cb_spatializer_handle, this );
|
||||
|
||||
control = (Fl_Valuator*)o;
|
||||
|
||||
if ( _pad )
|
||||
{
|
||||
Fl_Labelpad_Group *flg = new Fl_Labelpad_Group( o );
|
||||
flg->position( x(), y() );
|
||||
flg->set_visible_focus();
|
||||
size( flg->w(), flg->h() );
|
||||
add( flg );
|
||||
}
|
||||
else
|
||||
{
|
||||
// o->clear_visible_focus();
|
||||
o->resize( x(), y(), w(), h() );
|
||||
add( o );
|
||||
resizable( o );
|
||||
init_sizes();
|
||||
}
|
||||
|
||||
_type = SPATIALIZATION;
|
||||
}
|
||||
}
|
||||
|
||||
/** attempt to transform this controller into a spatialization
|
||||
controller and connect to the given module's spatialization
|
||||
control inputs. Returns true on success, false if given module
|
||||
|
@ -209,6 +352,8 @@ Controller_Module::mode ( Mode m )
|
|||
bool
|
||||
Controller_Module::connect_spatializer_to ( Module *m )
|
||||
{
|
||||
connect_spatializer_radius_to( m );
|
||||
|
||||
/* these are for detecting related parameter groups which can be
|
||||
better represented by a single control */
|
||||
Port *azimuth_port = NULL;
|
||||
|
@ -237,62 +382,45 @@ Controller_Module::connect_spatializer_to ( Module *m )
|
|||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( ! ( azimuth_port && elevation_port ) )
|
||||
return false;
|
||||
|
||||
control_output.clear();
|
||||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
|
||||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
|
||||
if ( control_output.size() != 3 )
|
||||
{
|
||||
control_output.clear();
|
||||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
|
||||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
|
||||
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
|
||||
}
|
||||
|
||||
control_output[0].connect_to( azimuth_port );
|
||||
control_output[1].connect_to( elevation_port );
|
||||
|
||||
{
|
||||
clear();
|
||||
maybe_create_panner();
|
||||
|
||||
Panner *o = (Panner*)control;
|
||||
|
||||
Panner *o = new Panner( 0,0, 100, 100 );
|
||||
o->point( 0 )->azimuth( azimuth_value );
|
||||
o->point( 0 )->elevation( elevation_value );
|
||||
|
||||
if ( Mixer::spatialization_console )
|
||||
Mixer::spatialization_console->update();
|
||||
|
||||
o->box(FL_THIN_UP_BOX);
|
||||
o->color(FL_GRAY0);
|
||||
o->selection_color(FL_BACKGROUND_COLOR);
|
||||
o->labeltype(FL_NORMAL_LABEL);
|
||||
o->labelfont(0);
|
||||
o->labelcolor(FL_FOREGROUND_COLOR);
|
||||
o->align(FL_ALIGN_TOP);
|
||||
o->when(FL_WHEN_CHANGED);
|
||||
o->label( "Spatialization" );
|
||||
return true;
|
||||
}
|
||||
|
||||
o->align(FL_ALIGN_TOP);
|
||||
o->labelsize( 10 );
|
||||
// o->callback( cb_panner_value_handle, new callback_data( this, azimuth_port_number, elevation_port_number ) );
|
||||
void
|
||||
Controller_Module::apply_label ( Port *p, Fl_Widget *o )
|
||||
{
|
||||
char path[256];
|
||||
|
||||
o->point( 0 )->azimuth( azimuth_value );
|
||||
o->point( 0 )->elevation( elevation_value );
|
||||
if ( is_default() )
|
||||
snprintf( path, sizeof(path) - 1, "%s", p->name() );
|
||||
else
|
||||
snprintf( path, sizeof(path) - 1, "%s/%s", p->module()->label(), p->name() );
|
||||
|
||||
o->callback( cb_spatializer_handle, this );
|
||||
|
||||
control = (Fl_Valuator*)o;
|
||||
|
||||
if ( _pad )
|
||||
{
|
||||
Fl_Labelpad_Group *flg = new Fl_Labelpad_Group( o );
|
||||
flg->position( x(), y() );
|
||||
flg->set_visible_focus();
|
||||
size( flg->w(), flg->h() );
|
||||
add( flg );
|
||||
}
|
||||
else
|
||||
{
|
||||
o->resize( x(), y(), w(), h() );
|
||||
add( o );
|
||||
resizable( o );
|
||||
init_sizes();
|
||||
}
|
||||
|
||||
_type = SPATIALIZATION;
|
||||
return true;
|
||||
}
|
||||
o->copy_label(path);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -306,9 +434,11 @@ Controller_Module::connect_to ( Port *p )
|
|||
|
||||
if ( p->hints.type == Module::Port::Hints::BOOLEAN )
|
||||
{
|
||||
Fl_Light_Button *o = new Fl_Light_Button( 0, 0, 40, 40, p->name() );
|
||||
Fl_Button *o = new Fl_Button( 0, 0, 40, 40 );
|
||||
w = o;
|
||||
o->type( FL_TOGGLE_BUTTON );
|
||||
o->value( p->control_value() );
|
||||
o->selection_color( fl_color_average( FL_GRAY, FL_CYAN, 0.5 ) );
|
||||
|
||||
_type = TOGGLE;
|
||||
|
||||
|
@ -318,7 +448,8 @@ Controller_Module::connect_to ( Port *p )
|
|||
else if ( p->hints.type == Module::Port::Hints::INTEGER )
|
||||
{
|
||||
|
||||
Fl_Counter *o = new Fl_Counter(0, 0, 58, 24, p->name() );
|
||||
Fl_Counter *o = new Fl_Counter(0, 0, 58, 24 );
|
||||
|
||||
control = o;
|
||||
w = o;
|
||||
|
||||
|
@ -335,54 +466,79 @@ Controller_Module::connect_to ( Port *p )
|
|||
|
||||
o->value( p->control_value() );
|
||||
}
|
||||
else if ( p->hints.type == Module::Port::Hints::LOGARITHMIC )
|
||||
// else if ( p->hints.type == Module::Port::Hints::LOGARITHMIC )
|
||||
else
|
||||
{
|
||||
Fl_Value_SliderX *o = new Fl_Value_SliderX(0, 0, 30, 250, p->name() );
|
||||
Fl_Value_SliderX *o = new Fl_Value_SliderX(0, 0, 30, 250 );
|
||||
|
||||
control = o;
|
||||
w = o;
|
||||
|
||||
o->type(4);
|
||||
o->color(FL_BACKGROUND_COLOR);
|
||||
o->selection_color((Fl_Color)1);
|
||||
if ( ! _horizontal )
|
||||
{
|
||||
o->size( 30, 250 );
|
||||
o->type(FL_VERT_NICE_SLIDER);
|
||||
}
|
||||
else
|
||||
{
|
||||
o->size(250,20);
|
||||
o->type(FL_HOR_NICE_SLIDER);
|
||||
}
|
||||
|
||||
// o->type(4);
|
||||
o->color( FL_BACKGROUND2_COLOR );
|
||||
o->selection_color( fl_color_average( FL_GRAY, FL_CYAN, 0.5 ) );
|
||||
o->minimum(1.5);
|
||||
o->maximum(0);
|
||||
o->value(1);
|
||||
o->textsize(6);
|
||||
// o->textsize(9);
|
||||
|
||||
if ( p->hints.ranged )
|
||||
{
|
||||
o->minimum( p->hints.maximum );
|
||||
o->maximum( p->hints.minimum );
|
||||
if ( ! _horizontal )
|
||||
{
|
||||
o->minimum( p->hints.maximum );
|
||||
o->maximum( p->hints.minimum );
|
||||
}
|
||||
else
|
||||
{
|
||||
o->minimum( p->hints.minimum );
|
||||
o->maximum( p->hints.maximum );
|
||||
}
|
||||
}
|
||||
|
||||
o->precision(2);
|
||||
|
||||
o->value( p->control_value() );
|
||||
|
||||
_type = SLIDER;
|
||||
}
|
||||
else
|
||||
{
|
||||
{ Fl_Arc_Dial *o = new Fl_Arc_Dial( 0, 0, 50, 50, p->name() );
|
||||
w = o;
|
||||
control = o;
|
||||
/* else */
|
||||
/* { */
|
||||
/* { Fl_DialX *o = new Fl_DialX( 0, 0, 50, 50, p->name() ); */
|
||||
/* w = o; */
|
||||
/* control = o; */
|
||||
|
||||
if ( p->hints.ranged )
|
||||
{
|
||||
DMESSAGE( "Min: %f, max: %f", p->hints.minimum, p->hints.maximum );
|
||||
o->minimum( p->hints.minimum );
|
||||
o->maximum( p->hints.maximum );
|
||||
}
|
||||
/* if ( p->hints.ranged ) */
|
||||
/* { */
|
||||
/* DMESSAGE( "Min: %f, max: %f", p->hints.minimum, p->hints.maximum ); */
|
||||
/* o->minimum( p->hints.minimum ); */
|
||||
/* o->maximum( p->hints.maximum ); */
|
||||
/* } */
|
||||
|
||||
o->color( fl_darker( FL_GRAY ) );
|
||||
o->selection_color( FL_WHITE );
|
||||
o->value( p->control_value() );
|
||||
}
|
||||
/* o->color( fl_darker( FL_GRAY ) ); */
|
||||
/* o->selection_color( FL_WHITE ); */
|
||||
/* o->value( p->control_value() ); */
|
||||
/* } */
|
||||
|
||||
_type = KNOB;
|
||||
}
|
||||
/* _type = KNOB; */
|
||||
/* } */
|
||||
|
||||
apply_label(p,control);
|
||||
|
||||
control_value = p->control_value();
|
||||
|
||||
w->set_visible_focus();
|
||||
w->clear_visible_focus();
|
||||
w->align(FL_ALIGN_TOP);
|
||||
w->labelsize( 10 );
|
||||
w->callback( cb_handle, this );
|
||||
|
@ -394,29 +550,30 @@ Controller_Module::connect_to ( Port *p )
|
|||
size( flg->w(), flg->h() );
|
||||
flg->position( x(), y() );
|
||||
add( flg );
|
||||
resizable(flg);
|
||||
// init_sizes();
|
||||
}
|
||||
else
|
||||
{
|
||||
/* HACK: hide label */
|
||||
w->labeltype( FL_NO_LABEL );
|
||||
if ( _type == TOGGLE )
|
||||
{
|
||||
w->align( FL_ALIGN_INSIDE );
|
||||
}
|
||||
else
|
||||
{
|
||||
w->labeltype( FL_NO_LABEL );
|
||||
}
|
||||
w->resize( x(), y(), this->w(), h() );
|
||||
add( w );
|
||||
resizable( w );
|
||||
// init_sizes();
|
||||
init_sizes();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Controller_Module::update_cb ( void *v )
|
||||
Controller_Module::update ( void )
|
||||
{
|
||||
((Controller_Module*)v)->update_cb();
|
||||
}
|
||||
|
||||
void
|
||||
Controller_Module::update_cb ( void )
|
||||
{
|
||||
Fl::repeat_timeout( CONTROL_UPDATE_FREQ, update_cb, this );
|
||||
|
||||
/* we only need this in CV (JACK) mode, because with other forms
|
||||
* of control the change happens in the GUI thread and we know it */
|
||||
if ( mode() != CV )
|
||||
|
@ -465,6 +622,11 @@ Controller_Module::cb_spatializer_handle ( Fl_Widget *w )
|
|||
control_output[0].connected_port()->control_value( pan->point( 0 )->azimuth() );
|
||||
control_output[1].connected_port()->control_value( pan->point( 0 )->elevation() );
|
||||
}
|
||||
|
||||
if ( control_output[2].connected() )
|
||||
{
|
||||
control_output[2].connected_port()->control_value( pan->point( 0 )->radius() );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -486,6 +648,185 @@ Controller_Module::menu_cb ( const Fl_Menu_ *m )
|
|||
mode( GUI );
|
||||
else if ( ! strcmp( picked, "Mode/Control Voltage (JACK)" ) )
|
||||
mode( CV );
|
||||
else if ( ! strcmp( picked, "/Remove" ) )
|
||||
command_remove();
|
||||
else if ( ! strncmp( picked, "Connect To/", strlen( "Connect To/" ) ) )
|
||||
{
|
||||
char *peer_name = index( picked, '/' ) + 1;
|
||||
|
||||
*index( peer_name, '/' ) = 0;
|
||||
|
||||
// OSC::Signal s = (OSC::Signal*)m->mvalue()->user_data();
|
||||
const char *path = ((OSC::Signal*)m->mvalue()->user_data())->path();
|
||||
|
||||
/* if ( ! _osc_output()->is_connected_to( ((OSC::Signal*)m->mvalue()->user_data()) ) ) */
|
||||
/* { */
|
||||
/* _persistent_osc_connections.push_back( strdup(path) ); */
|
||||
|
||||
Port *p = control_output[0].connected_port();
|
||||
|
||||
if ( learn_by_number )
|
||||
mixer->osc_endpoint->add_translation( path, p->osc_number_path());
|
||||
else
|
||||
mixer->osc_endpoint->add_translation( path, p->osc_path() );
|
||||
}
|
||||
else if ( ! strncmp( picked, "Disconnect From/", strlen( "Disconnect From/" ) ) )
|
||||
{
|
||||
/* char *peer_name = index( picked, '/' ) + 1; */
|
||||
|
||||
/* *index( peer_name, '/' ) = 0; */
|
||||
|
||||
// OSC::Signal s = (OSC::Signal*)m->mvalue()->user_data();
|
||||
const char *path = (const char*)m->mvalue()->user_data();
|
||||
|
||||
/* if ( ! _osc_output()->is_connected_to( ((OSC::Signal*)m->mvalue()->user_data()) ) ) */
|
||||
/* { */
|
||||
/* _persistent_osc_connections.push_back( strdup(path) ); */
|
||||
|
||||
// Port *p = control_output[0].connected_port();
|
||||
|
||||
mixer->osc_endpoint->del_translation( path );
|
||||
|
||||
/* if ( learn_by_number ) */
|
||||
/* { */
|
||||
/* char *our_path = p->osc_number_path(); */
|
||||
|
||||
/* mixer->osc_endpoint->add_translation( path, our_path ); */
|
||||
|
||||
/* free(our_path); */
|
||||
/* } */
|
||||
/* else */
|
||||
/* mixer->osc_endpoint->add_translation( path, p->osc_path() ); */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* } */
|
||||
/* else */
|
||||
/* { */
|
||||
/* /\* timeline->osc->disconnect_signal( _osc_output(), path ); *\/ */
|
||||
|
||||
/* /\* for ( std::list<char*>::iterator i = _persistent_osc_connections.begin(); *\/ */
|
||||
/* /\* i != _persistent_osc_connections.end(); *\/ */
|
||||
/* /\* ++i ) *\/ */
|
||||
/* /\* { *\/ */
|
||||
/* /\* if ( !strcmp( *i, path ) ) *\/ */
|
||||
/* /\* { *\/ */
|
||||
/* /\* free( *i ); *\/ */
|
||||
/* /\* i = _persistent_osc_connections.erase( i ); *\/ */
|
||||
/* /\* break; *\/ */
|
||||
/* /\* } *\/ */
|
||||
/* /\* } *\/ */
|
||||
|
||||
/* //free( path ); */
|
||||
/* } */
|
||||
|
||||
|
||||
|
||||
}
|
||||
static Fl_Menu_Button *peer_menu;
|
||||
static const char *peer_prefix;
|
||||
|
||||
void
|
||||
Controller_Module::peer_callback( OSC::Signal *sig, OSC::Signal::State state, void *v )
|
||||
{
|
||||
char *s;
|
||||
|
||||
DMESSAGE( "Paramter limits: %f %f", sig->parameter_limits().min, sig->parameter_limits().max );
|
||||
|
||||
/* only show outputs */
|
||||
if ( sig->direction() != OSC::Signal::Output )
|
||||
return;
|
||||
|
||||
|
||||
/* only list CV signals for now */
|
||||
if ( ! ( sig->parameter_limits().min == 0.0 &&
|
||||
sig->parameter_limits().max == 1.0 ) )
|
||||
return;
|
||||
|
||||
if ( ! v )
|
||||
{
|
||||
/* if( state == OSC::Signal::Created ) */
|
||||
/* timeline->connect_osc(); */
|
||||
/* else */
|
||||
/* timeline->update_osc_connection_state(); */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* building menu */
|
||||
// const char *name = sig->peer_name();
|
||||
|
||||
assert( sig->path() );
|
||||
|
||||
char *path = strdup( sig->path() );
|
||||
|
||||
unescape_url( path );
|
||||
|
||||
asprintf( &s, "%s/%s", peer_prefix, path );
|
||||
|
||||
peer_menu->add( s, 0, NULL, (void*)( sig ), 0 );
|
||||
|
||||
/* FL_MENU_TOGGLE | */
|
||||
/* ( ((Controller_Module*)v)->_osc_output()->is_connected_to( sig ) ? FL_MENU_VALUE : 0 ) ); */
|
||||
|
||||
free( path );
|
||||
|
||||
free( s );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Controller_Module::add_osc_peers_to_menu ( Fl_Menu_Button *m, const char *prefix )
|
||||
{
|
||||
mixer->osc_endpoint->peer_signal_notification_callback( &Controller_Module::peer_callback, NULL );
|
||||
|
||||
peer_menu = m;
|
||||
peer_prefix = prefix;
|
||||
|
||||
mixer->osc_endpoint->list_peer_signals( this );
|
||||
}
|
||||
|
||||
void
|
||||
Controller_Module::add_osc_connections_to_menu ( Fl_Menu_Button *m, const char *prefix )
|
||||
{
|
||||
/* peer_menu = m; */
|
||||
const char *peer_prefix = prefix;
|
||||
|
||||
// mixer->osc_endpoint->list_peer_signals( this );
|
||||
|
||||
Port *p = control_output[0].connected_port();
|
||||
|
||||
const char *number_path = p->osc_number_path();
|
||||
const char *name_path = p->osc_path();
|
||||
|
||||
const char *paths[] = { number_path,name_path,NULL };
|
||||
|
||||
for ( const char **cpath = paths; *cpath; cpath++ )
|
||||
{
|
||||
const char ** conn = mixer->osc_endpoint->get_connections( *cpath );
|
||||
|
||||
if ( conn )
|
||||
{
|
||||
for ( const char **s = conn; *s; s++ )
|
||||
{
|
||||
/* building menu */
|
||||
|
||||
char *path = strdup( *s );
|
||||
|
||||
unescape_url( path );
|
||||
|
||||
char *ns;
|
||||
asprintf( &ns, "%s/%s", peer_prefix, path );
|
||||
|
||||
peer_menu->add( ns, 0, NULL, const_cast<char*>(*s), 0 );
|
||||
|
||||
free( path );
|
||||
// free(*s);
|
||||
}
|
||||
|
||||
free( conn );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** build the context menu for this control */
|
||||
|
@ -494,22 +835,54 @@ Controller_Module::menu ( void )
|
|||
{
|
||||
static Fl_Menu_Button m( 0, 0, 0, 0, "Controller" );
|
||||
|
||||
Fl_Menu_Item items[] =
|
||||
{
|
||||
{ "Mode", 0, 0, 0, FL_SUBMENU },
|
||||
{ "GUI + OSC", 0, 0, 0, FL_MENU_RADIO | ( mode() == GUI ? FL_MENU_VALUE : 0 ) },
|
||||
{ "Control Voltage (JACK)", 0, 0, 0, FL_MENU_RADIO | ( mode() == CV ? FL_MENU_VALUE : 0 ) },
|
||||
{ 0 },
|
||||
{ 0 },
|
||||
};
|
||||
m.clear();
|
||||
|
||||
menu_set_callback( items, &Controller_Module::menu_cb, (void*)this );
|
||||
if ( mode() == GUI )
|
||||
{
|
||||
add_osc_peers_to_menu( &m, "Connect To" );
|
||||
add_osc_connections_to_menu( &m, "Disconnect From" );
|
||||
}
|
||||
|
||||
m.copy( items, (void*)this );
|
||||
m.add( "Mode/GUI + OSC", 0, 0, 0, FL_MENU_RADIO | ( mode() == GUI ? FL_MENU_VALUE : 0 ));
|
||||
m.add( "Mode/Control Voltage (JACK)", 0, 0, 0, FL_MENU_RADIO | ( mode() == CV ? FL_MENU_VALUE : 0 ));
|
||||
m.add( "Remove", 0, 0, 0, is_default() ? FL_MENU_INACTIVE : 0 );
|
||||
|
||||
// menu_set_callback( m.items(), &Controller_Module::menu_cb, (void*)this );
|
||||
m.callback( &Controller_Module::menu_cb, (void*)this );
|
||||
// m.copy( items, (void*)this );
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
void
|
||||
Controller_Module::draw ( void )
|
||||
{
|
||||
Fl_Group::draw();
|
||||
draw_box(x(),y(),w(),h());
|
||||
|
||||
if ( learn_mode() )
|
||||
{
|
||||
fl_rectf( x(),y(),w(),h(),
|
||||
fl_color_add_alpha(
|
||||
this == _learning_control
|
||||
? FL_RED
|
||||
: FL_GREEN,
|
||||
60 ) );
|
||||
}
|
||||
}
|
||||
|
||||
void Controller_Module::learning_callback ( void *userdata )
|
||||
{
|
||||
((Controller_Module*)userdata)->learning_callback();
|
||||
}
|
||||
|
||||
void Controller_Module::learning_callback ( void )
|
||||
{
|
||||
_learning_control = NULL;
|
||||
this->redraw();
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
Controller_Module::handle ( int m )
|
||||
{
|
||||
|
@ -518,10 +891,33 @@ Controller_Module::handle ( int m )
|
|||
{
|
||||
case FL_PUSH:
|
||||
{
|
||||
if ( test_press( FL_BUTTON3 ) )
|
||||
if ( learn_mode() )
|
||||
{
|
||||
tooltip( "Now learning control. Move the desired control on your controller" );
|
||||
|
||||
_learning_control = this;
|
||||
|
||||
this->redraw();
|
||||
|
||||
//connect_to( &module->control_input[port] );
|
||||
Port *p = control_output[0].connected_port();
|
||||
|
||||
if ( p )
|
||||
{
|
||||
const char * path = learn_by_number ? p->osc_number_path() : p->osc_path();
|
||||
|
||||
DMESSAGE( "Will learn %s", path );
|
||||
|
||||
mixer->osc_endpoint->learn( path, Controller_Module::learning_callback, this );
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ( Fl::event_button3() )
|
||||
{
|
||||
/* context menu */
|
||||
if ( type() != SPATIALIZATION )
|
||||
/* if ( type() != SPATIALIZATION ) */
|
||||
menu_popup( &menu() );
|
||||
|
||||
return 1;
|
||||
|
@ -538,6 +934,13 @@ void
|
|||
Controller_Module::handle_control_changed ( Port *p )
|
||||
{
|
||||
/* ignore changes initiated while mouse is over widget */
|
||||
|
||||
if ( type() == SPATIALIZATION )
|
||||
{
|
||||
if ( Mixer::spatialization_console )
|
||||
Mixer::spatialization_console->handle_control_changed( this );
|
||||
}
|
||||
|
||||
if ( contains( Fl::pushed() ) )
|
||||
return;
|
||||
|
||||
|
@ -559,7 +962,16 @@ Controller_Module::handle_control_changed ( Port *p )
|
|||
pan->point( 0 )->azimuth( control_output[0].control_value() );
|
||||
pan->point( 0 )->elevation( control_output[1].control_value() );
|
||||
|
||||
pan->redraw();
|
||||
if ( control_output[2].connected() )
|
||||
{
|
||||
// Port *pp = control_output[2].connected_port();
|
||||
float v = control_output[2].control_value();
|
||||
// float s = pp->hints.maximum - pp->hints.minimum;
|
||||
|
||||
pan->point( 0 )->radius( v );
|
||||
}
|
||||
if ( visible_r() )
|
||||
pan->redraw();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -570,8 +982,20 @@ Controller_Module::handle_control_changed ( Port *p )
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
Controller_Module::command_remove ( void )
|
||||
{
|
||||
if ( is_default() )
|
||||
fl_alert( "Default modules may not be deleted." );
|
||||
else
|
||||
{
|
||||
chain()->remove( this );
|
||||
Fl::delete_widget( this );
|
||||
}
|
||||
}
|
||||
|
||||
/**********/
|
||||
/* Engine */
|
||||
/* Client */
|
||||
/**********/
|
||||
|
||||
void
|
||||
|
@ -590,7 +1014,7 @@ Controller_Module::process ( nframes_t nframes )
|
|||
|
||||
if ( mode() == CV )
|
||||
{
|
||||
f = *((float*)jack_input[0].buffer( nframes ));
|
||||
f = *((float*)aux_audio_input[0].jack_port()->buffer( nframes ));
|
||||
|
||||
const Port *p = control_output[0].connected_port();
|
||||
|
||||
|
|
|
@ -32,10 +32,8 @@ class Fl_Valuator;
|
|||
class Controller_Module : public Module
|
||||
{
|
||||
|
||||
static void update_cb ( void *v );
|
||||
void update_cb ( void );
|
||||
|
||||
bool _pad;
|
||||
bool _horizontal;
|
||||
|
||||
volatile float control_value;
|
||||
|
||||
|
@ -43,11 +41,24 @@ class Controller_Module : public Module
|
|||
static void menu_cb ( Fl_Widget *w, void *v );
|
||||
void menu_cb ( const Fl_Menu_ *m );
|
||||
|
||||
char *_osc_path;
|
||||
char *_osc_path_cv;
|
||||
|
||||
static void peer_callback( OSC::Signal *sig, OSC::Signal::State state, void *v );
|
||||
void peer_callback( OSC::Signal *sig, OSC::Signal::State state );
|
||||
void add_osc_peers_to_menu ( Fl_Menu_Button *m, const char *prefix );
|
||||
void add_osc_connections_to_menu ( Fl_Menu_Button *m, const char *prefix );
|
||||
|
||||
static void learning_callback ( void *userdata );
|
||||
void learning_callback ( void );
|
||||
|
||||
public:
|
||||
|
||||
static bool _learn_mode;
|
||||
static Controller_Module *_learning_control;
|
||||
|
||||
static bool learn_by_number;
|
||||
static bool learn_mode ( void ) { return _learn_mode; }
|
||||
static void learn_mode ( bool b ) { _learn_mode = b; }
|
||||
|
||||
enum Mode { GUI, CV, OSC, MIDI };
|
||||
|
||||
enum Type { KNOB,
|
||||
|
@ -59,6 +70,7 @@ public:
|
|||
Mode mode ( void ) const { return _mode; }
|
||||
void mode ( Mode v );
|
||||
|
||||
void horizontal ( bool v ) { _horizontal = v; }
|
||||
Type type ( void ) const { return _type; }
|
||||
|
||||
Controller_Module ( bool is_default = false );
|
||||
|
@ -78,22 +90,26 @@ public:
|
|||
|
||||
void connect_to ( Port *p );
|
||||
bool connect_spatializer_to ( Module *m );
|
||||
bool connect_spatializer_radius_to ( Module *m );
|
||||
void disconnect ( void );
|
||||
|
||||
void handle_control_changed ( Port *p );
|
||||
void handle_chain_name_changed ( void );
|
||||
void handle_control_disconnect ( Port *p );
|
||||
|
||||
virtual void command_remove ( void );
|
||||
|
||||
LOG_CREATE_FUNC( Controller_Module );
|
||||
|
||||
virtual void update ( void );
|
||||
|
||||
void process ( nframes_t nframes );
|
||||
|
||||
void draw ( void )
|
||||
{
|
||||
draw_box();
|
||||
Fl_Group::draw();
|
||||
}
|
||||
void draw ( void );
|
||||
|
||||
int handle ( int m );
|
||||
|
||||
void take_focus ( void );
|
||||
// void set_control_value ( float f ) { control_value = f; }
|
||||
|
||||
protected:
|
||||
|
@ -103,10 +119,11 @@ protected:
|
|||
|
||||
private:
|
||||
|
||||
void apply_label ( Port *p, Fl_Widget *o );
|
||||
void maybe_create_panner ( void );
|
||||
char *generate_osc_path ( void );
|
||||
void change_osc_path ( char *path );
|
||||
|
||||
std::vector<JACK::Port> jack_input;
|
||||
Mode _mode;
|
||||
Type _type;
|
||||
|
||||
|
|
251
mixer/src/DPM.C
|
@ -43,117 +43,167 @@ DPM::DPM ( int X, int Y, int W, int H, const char *L ) :
|
|||
|
||||
_last_drawn_hi_segment = 0;
|
||||
|
||||
pixels_per_segment( 4 );
|
||||
pixels_per_segment( 5 );
|
||||
|
||||
type( FL_VERTICAL );
|
||||
|
||||
// resize( X, Y, W, H );
|
||||
|
||||
dim( 0.70f );
|
||||
dim( 0.95f );
|
||||
|
||||
box( FL_FLAT_BOX );
|
||||
|
||||
color(FL_BLACK);
|
||||
|
||||
/* color( fl_color_average( FL_BLACK, FL_BACKGROUND_COLOR, 0.25f ) ); */
|
||||
|
||||
/* initialize gradients */
|
||||
if ( DPM::_gradient[ 0 ] == 0 )
|
||||
DPM::blend( FL_GREEN, FL_RED );
|
||||
{
|
||||
int breaks[] = {0,80,90,110,127};
|
||||
|
||||
box( FL_ROUNDED_BOX );
|
||||
color( FL_BACKGROUND_COLOR );
|
||||
Fl_Color cols[] = {
|
||||
fl_darker( FL_CYAN ),
|
||||
FL_CYAN,
|
||||
fl_lighter( FL_CYAN ),
|
||||
fl_color_average( FL_YELLOW, FL_RED, 0.50f ),
|
||||
FL_RED
|
||||
};
|
||||
|
||||
for ( int i = 0; i < 4; ++i )
|
||||
{
|
||||
cols[i] = fl_color_average( cols[i], FL_BACKGROUND_COLOR, 0.60f );
|
||||
}
|
||||
|
||||
DPM::blend( 5,
|
||||
breaks,
|
||||
cols,
|
||||
color() );
|
||||
|
||||
}
|
||||
|
||||
resize( X,Y,W,H);
|
||||
}
|
||||
|
||||
/* which marks to draw beside meter */
|
||||
const int marks [] = { -70, -50, -40, -30, -20, -10, -3, 0, 4 };
|
||||
|
||||
void
|
||||
DPM::draw_label ( void )
|
||||
DPM::public_draw_label ( int X, int Y, int W, int H )
|
||||
{
|
||||
/* dirty hack */
|
||||
if ( parent()->child( 0 ) == this )
|
||||
fl_push_clip(X,Y,W,H);
|
||||
fl_rectf( X,Y,W,H, FL_BACKGROUND_COLOR);
|
||||
|
||||
fl_font( FL_TIMES, 8 );
|
||||
fl_color( active_r() ? FL_FOREGROUND_COLOR : fl_inactive( FL_FOREGROUND_COLOR ) );
|
||||
/* draw marks */
|
||||
char pat[5];
|
||||
if ( type() == FL_HORIZONTAL )
|
||||
{
|
||||
fl_font( FL_TIMES, 8 );
|
||||
fl_color( FL_WHITE );
|
||||
/* draw marks */
|
||||
char pat[5];
|
||||
if ( type() == FL_HORIZONTAL )
|
||||
{
|
||||
for ( int i = sizeof( marks ) / sizeof( marks[0] ); i-- ; )
|
||||
{
|
||||
sprintf( pat, "%d", marks[ i ] );
|
||||
for ( int i = sizeof( marks ) / sizeof( marks[0] ); i-- ; )
|
||||
{
|
||||
sprintf( pat, "%d", marks[ i ] );
|
||||
|
||||
int v = w() * deflection( (float)marks[ i ] );
|
||||
int v = w() * deflection( (float)marks[ i ] );
|
||||
|
||||
fl_draw( pat, x() + v, (y() + h() + 8), 19, 8, (Fl_Align) (FL_ALIGN_RIGHT | FL_ALIGN_TOP) );
|
||||
}
|
||||
fl_draw( pat, X + v, (Y + H + 8), W, 8, (Fl_Align) (FL_ALIGN_RIGHT | FL_ALIGN_TOP) );
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( int i = sizeof( marks ) / sizeof( marks[0] ); i-- ; )
|
||||
{
|
||||
sprintf( pat, "%d", marks[ i ] );
|
||||
|
||||
int v = h() * deflection( (float)marks[ i ] );
|
||||
|
||||
fl_draw( pat, x() - 20, (y() + h() - 8) - v, 19, 8, (Fl_Align) (FL_ALIGN_RIGHT | FL_ALIGN_TOP) );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( int i = sizeof( marks ) / sizeof( marks[0] ); i-- ; )
|
||||
{
|
||||
sprintf( pat, "%d", marks[ i ] );
|
||||
|
||||
int v = h() * deflection( (float)marks[ i ] );
|
||||
|
||||
fl_draw( pat, X, (Y + H - 4) - v, W, 8, (Fl_Align) (FL_ALIGN_RIGHT | FL_ALIGN_TOP) );
|
||||
}
|
||||
}
|
||||
|
||||
fl_pop_clip();
|
||||
}
|
||||
|
||||
void
|
||||
DPM::resize ( int X, int Y, int W, int H )
|
||||
{
|
||||
if ( type() == FL_HORIZONTAL )
|
||||
_segments = floor( W / (double)_pixels_per_segment );
|
||||
else
|
||||
_segments = floor( H / (double)_pixels_per_segment );
|
||||
|
||||
// _last_drawn_hi_segment = 0;
|
||||
|
||||
int old_segments = _segments;
|
||||
|
||||
Fl_Widget::resize( X, Y, W, H );
|
||||
|
||||
int tx,ty,tw,th;
|
||||
bbox(tx,ty,tw,th);
|
||||
|
||||
if ( type() == FL_HORIZONTAL )
|
||||
_segments = floor( tw / (double)_pixels_per_segment );
|
||||
else
|
||||
_segments = floor( th / (double)_pixels_per_segment );
|
||||
|
||||
if ( old_segments != _segments )
|
||||
_last_drawn_hi_segment = 0;
|
||||
}
|
||||
|
||||
void DPM::bbox ( int &X, int &Y, int &W, int &H )
|
||||
{
|
||||
/* X = x() + 2; */
|
||||
/* Y = y() + 2; */
|
||||
/* W = w() - 4; */
|
||||
/* H = h() - 4; */
|
||||
X = x();
|
||||
Y = y();
|
||||
W = w();
|
||||
H = h();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
DPM::draw ( void )
|
||||
{
|
||||
|
||||
snprintf( peak_string, sizeof( peak_string ), "%.1f", peak() );
|
||||
tooltip( peak_string );
|
||||
|
||||
if ( ! fl_not_clipped( x(), y(), w(), h() ) )
|
||||
return;
|
||||
|
||||
int X = x() + 2;
|
||||
int Y = y() + 2;
|
||||
int W = w() - 4;
|
||||
int H = h() - 4;
|
||||
|
||||
int X,Y,W,H;
|
||||
bbox(X,Y,W,H);
|
||||
|
||||
int v = pos( value() );
|
||||
int pv = pos( peak() );
|
||||
|
||||
int clipv = pos( 0 );
|
||||
|
||||
int bh = h() / _segments;
|
||||
int bw = w() / _segments;
|
||||
int bh = H / _segments;
|
||||
/* int bh = _pixels_per_segment; */
|
||||
/* int bw = _pixels_per_segment; */
|
||||
int bw = W / _segments;
|
||||
|
||||
if ( 0 == fl_not_clipped(X,Y,W,H ) )
|
||||
return;
|
||||
|
||||
if ( damage() == FL_DAMAGE_ALL )
|
||||
if ( damage() & FL_DAMAGE_ALL )
|
||||
{
|
||||
draw_label();
|
||||
/* draw_label(); */
|
||||
|
||||
draw_box( FL_UP_FRAME, x(), y(), w(), h(), FL_BLACK );
|
||||
draw_box( box(), X, Y, W, H, color() );
|
||||
}
|
||||
|
||||
fl_push_clip( X, Y, W, H );
|
||||
|
||||
|
||||
const int active = active_r();
|
||||
|
||||
int hi, lo;
|
||||
|
||||
|
||||
/* only draw as many segments as necessary */
|
||||
if ( damage() == FL_DAMAGE_USER1 )
|
||||
{
|
||||
if ( v > _last_drawn_hi_segment )
|
||||
if ( v == _last_drawn_hi_segment )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if ( v > _last_drawn_hi_segment )
|
||||
{
|
||||
hi = v;
|
||||
lo = _last_drawn_hi_segment;
|
||||
}
|
||||
else
|
||||
else if ( v < _last_drawn_hi_segment )
|
||||
{
|
||||
hi = _last_drawn_hi_segment;
|
||||
lo = v;
|
||||
|
@ -167,53 +217,50 @@ DPM::draw ( void )
|
|||
|
||||
_last_drawn_hi_segment = v;
|
||||
|
||||
fl_push_clip( X, Y, W, H );
|
||||
|
||||
for ( int p = lo; p <= hi; p++ )
|
||||
for ( int p = lo; p <= hi + 1; ++p )
|
||||
{
|
||||
Fl_Color c = DPM::div_color( p );
|
||||
|
||||
if ( p > v && p != pv )
|
||||
c = dim_div_color( p );
|
||||
|
||||
if ( ! active )
|
||||
c = fl_inactive( c );
|
||||
|
||||
int yy = 0;
|
||||
int xx = 0;
|
||||
|
||||
if ( type() == FL_HORIZONTAL )
|
||||
{
|
||||
xx = X + p * bw;
|
||||
fl_rectf( X + (p * bw), Y, bw, H, c );
|
||||
}
|
||||
else
|
||||
{
|
||||
yy = Y + H - ((p + 1) * bh);
|
||||
fl_rectf( X, yy, W, bh, c );
|
||||
}
|
||||
|
||||
if ( _pixels_per_segment > 3 )
|
||||
{
|
||||
fl_color( FL_BLACK );
|
||||
|
||||
if ( type() == FL_HORIZONTAL )
|
||||
{
|
||||
fl_line( xx, Y, xx, Y + H - 1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
fl_line( X, yy, X + W - 1, yy );
|
||||
}
|
||||
}
|
||||
/* } */
|
||||
/* else */
|
||||
/* { */
|
||||
/* if ( type() == FL_HORIZONTAL ) */
|
||||
/* fl_draw_box( box(), X + (p * bw), Y, bw, H, c ); */
|
||||
/* else */
|
||||
/* fl_draw_box( box(), X, Y + H - ((p + 1) * bh), W, bh, c ); */
|
||||
/* } */
|
||||
Fl_Color c;
|
||||
|
||||
if ( p <= v || p == pv )
|
||||
{
|
||||
if ( p == clipv )
|
||||
c = fl_color_average( FL_YELLOW, div_color( p ), 0.40 );
|
||||
else
|
||||
c = div_color( p );
|
||||
}
|
||||
else
|
||||
c = fl_darker( FL_BACKGROUND_COLOR );//FL_DARK1; // fl_color_average( FL_BACKGROUND_COLOR, FL_BLACK, 0.50f );// FL_BACKGROUND_COLOR; //dim_div_color( p );
|
||||
|
||||
if ( ! active )
|
||||
c = fl_inactive( c );
|
||||
|
||||
int yy = 0;
|
||||
int xx = 0;
|
||||
|
||||
if ( type() == FL_HORIZONTAL )
|
||||
{
|
||||
xx = X + p * bw;
|
||||
fl_rectf( xx + 1, Y, bw - 1, H, c );
|
||||
}
|
||||
else
|
||||
{
|
||||
yy = Y + H - ((p+1) * bh);
|
||||
fl_rectf( X, yy + 1, W, bh - 1, c );
|
||||
}
|
||||
}
|
||||
|
||||
fl_pop_clip();
|
||||
}
|
||||
|
||||
void
|
||||
DPM::update ( void )
|
||||
{
|
||||
/* do falloff */
|
||||
float f = value() - 0.33f;
|
||||
if ( f < -80.0f )
|
||||
f = -80.0f;
|
||||
|
||||
value(f);
|
||||
}
|
||||
|
|
|
@ -30,12 +30,12 @@ class DPM : public Meter
|
|||
int _segments;
|
||||
int _pixels_per_segment;
|
||||
int _last_drawn_hi_segment;
|
||||
|
||||
float _value;
|
||||
|
||||
|
||||
int pos ( float v )
|
||||
{
|
||||
return deflection( v ) * _segments;
|
||||
float pv = deflection( v ) * ( _segments - 1 );
|
||||
|
||||
return pv;
|
||||
}
|
||||
|
||||
static float _dim;
|
||||
|
@ -53,47 +53,52 @@ class DPM : public Meter
|
|||
{
|
||||
return _dim_gradient[ i * 127 / _segments ];
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
virtual void draw_label ( void );
|
||||
virtual void draw ( void );
|
||||
virtual void resize ( int, int, int, int );
|
||||
/* virtual void draw_label ( void ); */
|
||||
|
||||
void bbox ( int &X, int &Y, int &W, int &H );
|
||||
|
||||
public:
|
||||
|
||||
void public_draw_label ( int X, int Y, int W, int H );
|
||||
|
||||
DPM ( int X, int Y, int W, int H, const char *L = 0 );
|
||||
|
||||
void value ( float v )
|
||||
{
|
||||
if ( _value != v )
|
||||
{
|
||||
if ( pos( v ) != pos( _value ) )
|
||||
Meter::value( v );
|
||||
}
|
||||
|
||||
_value = v;
|
||||
}
|
||||
|
||||
float value ( void ) const
|
||||
{
|
||||
return _value;
|
||||
}
|
||||
|
||||
void pixels_per_segment ( int v ) { _pixels_per_segment = v; }
|
||||
|
||||
float dim ( void ) const { return _dim; }
|
||||
void dim ( float v ) { _dim = v; redraw(); }
|
||||
void dim ( float v ) { _dim = v; if ( visible_r() ) redraw(); }
|
||||
|
||||
|
||||
virtual void value ( float v )
|
||||
{
|
||||
/* only trigger redraw for changes at or above our resolution*/
|
||||
if ( pos( value() ) != pos( v ) && visible_r() )
|
||||
damage( FL_DAMAGE_USER1 );
|
||||
|
||||
Meter::value( v );
|
||||
}
|
||||
|
||||
virtual float value ( void ) { return Meter::value(); }
|
||||
|
||||
void update ( void );
|
||||
|
||||
static
|
||||
void
|
||||
blend ( Fl_Color min, Fl_Color max )
|
||||
blend ( int nbreaks, int* b, Fl_Color *c, Fl_Color bc )
|
||||
{
|
||||
for ( int i = 128; i-- ; )
|
||||
_gradient[ i ] = fl_color_average( max, min, i / (float)128 );
|
||||
for ( int i = 0; i < nbreaks - 1; i++ )
|
||||
{
|
||||
int k = 0;
|
||||
for ( int j = b[i]; j <= b[i+1]; j++, k++ )
|
||||
_gradient[ j ] = fl_color_average( c[i+1], c[i], ( k ) / (float)(b[i+1] - b[i] ));
|
||||
}
|
||||
|
||||
for ( int i = 128; i-- ; )
|
||||
for ( int i = 0; i < 128; i++ )
|
||||
_dim_gradient[ i ] = fl_color_average( FL_BLACK, _gradient[ i ], _dim );
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,130 +0,0 @@
|
|||
|
||||
/*******************************************************************************/
|
||||
/* Copyright (C) 2008 Jonathan Moore Liles */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify it */
|
||||
/* under the terms of the GNU General Public License as published by the */
|
||||
/* Free Software Foundation; either version 2 of the License, or (at your */
|
||||
/* option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, but WITHOUT */
|
||||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
|
||||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
|
||||
/* more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License along */
|
||||
/* with This program; see the file COPYING. If not,write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
|
||||
#include "Engine.H"
|
||||
|
||||
#include "../Mixer.H" // for process()
|
||||
|
||||
/* This is the home of the JACK process callback */
|
||||
|
||||
// #include "const.h"
|
||||
#include "debug.h"
|
||||
#include "Thread.H"
|
||||
|
||||
|
||||
|
||||
Engine::Engine ( void (*process_callback)(nframes_t nframes, void *), void *user_data ) : _thread( "RT" )
|
||||
{
|
||||
_process_callback = process_callback;
|
||||
_process_callback_user_data = user_data;
|
||||
_buffer_size_callback = 0;
|
||||
_buffers_dropped = 0;
|
||||
}
|
||||
|
||||
Engine::~Engine ( )
|
||||
{
|
||||
deactivate();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
Engine::buffer_size_callback ( void ( *buffer_size_callback ) ( nframes_t, void * ), void *user_data )
|
||||
{
|
||||
_buffer_size_callback = buffer_size_callback;
|
||||
_buffer_size_callback_user_data = user_data;
|
||||
}
|
||||
|
||||
/*************/
|
||||
/* Callbacks */
|
||||
/*************/
|
||||
|
||||
/* THREAD: RT */
|
||||
/** This is the jack xrun callback */
|
||||
int
|
||||
Engine::xrun ( void )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* THREAD: RT */
|
||||
void
|
||||
Engine::freewheel ( bool starting )
|
||||
{
|
||||
if ( starting )
|
||||
DMESSAGE( "entering freewheeling mode" );
|
||||
else
|
||||
DMESSAGE( "leaving freewheeling mode" );
|
||||
}
|
||||
|
||||
/* THREAD: RT (non-RT) */
|
||||
int
|
||||
Engine::buffer_size ( nframes_t nframes )
|
||||
{
|
||||
/* JACK calls this in the RT thread, even though it's a
|
||||
* non-realtime operation. This mucks up our ability to do
|
||||
* THREAD_ASSERT, so just lie and say this is the UI thread... */
|
||||
|
||||
_thread.set( "UI" );
|
||||
|
||||
_buffer_size_callback( nframes, _buffer_size_callback_user_data );
|
||||
|
||||
_thread.set( "RT" );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* THREAD: RT */
|
||||
int
|
||||
Engine::process ( nframes_t nframes )
|
||||
{
|
||||
/* FIXME: wrong place for this */
|
||||
_thread.set( "RT" );
|
||||
|
||||
if ( ! trylock() )
|
||||
{
|
||||
/* the data structures we need to access here (tracks and
|
||||
* their ports, but not track contents) may be in an
|
||||
* inconsistent state at the moment. Just punt and drop this
|
||||
* buffer. */
|
||||
++_buffers_dropped;
|
||||
return 0;
|
||||
}
|
||||
|
||||
_process_callback(nframes, _process_callback_user_data);
|
||||
|
||||
unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* TRHEAD: RT */
|
||||
void
|
||||
Engine::thread_init ( void )
|
||||
{
|
||||
_thread.set( "RT" );
|
||||
}
|
||||
|
||||
/* THREAD: RT */
|
||||
void
|
||||
Engine::shutdown ( void )
|
||||
{
|
||||
}
|
|
@ -30,26 +30,45 @@ Gain_Module::Gain_Module ( )
|
|||
add_port( Port( this, Port::INPUT, Port::AUDIO ) );
|
||||
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) );
|
||||
|
||||
Port p( this, Port::INPUT, Port::CONTROL, "Gain (dB)" );
|
||||
p.hints.type = Port::Hints::LOGARITHMIC;
|
||||
p.hints.ranged = true;
|
||||
p.hints.minimum = -70.0f;
|
||||
p.hints.maximum = 6.0f;
|
||||
p.hints.default_value = 0.0f;
|
||||
{
|
||||
Port p( this, Port::INPUT, Port::CONTROL, "Gain (dB)" );
|
||||
p.hints.type = Port::Hints::LINEAR;
|
||||
p.hints.ranged = true;
|
||||
p.hints.minimum = -70.0f;
|
||||
p.hints.maximum = 6.0f;
|
||||
p.hints.default_value = 0.0f;
|
||||
|
||||
p.connect_to( new float );
|
||||
p.control_value( p.hints.default_value );
|
||||
p.connect_to( new float );
|
||||
p.control_value( p.hints.default_value );
|
||||
|
||||
add_port( p );
|
||||
add_port( p );
|
||||
}
|
||||
|
||||
{
|
||||
Port p( this, Port::INPUT, Port::CONTROL, "Mute" );
|
||||
p.hints.type = Port::Hints::BOOLEAN;
|
||||
p.hints.ranged = true;
|
||||
p.hints.minimum = 0.0f;
|
||||
p.hints.maximum = 1.0f;
|
||||
p.hints.default_value = 0.0f;
|
||||
|
||||
p.connect_to( new float );
|
||||
p.control_value( p.hints.default_value );
|
||||
|
||||
add_port( p );
|
||||
}
|
||||
|
||||
end();
|
||||
|
||||
log_create();
|
||||
|
||||
smoothing.sample_rate( sample_rate() );
|
||||
}
|
||||
|
||||
Gain_Module::~Gain_Module ( )
|
||||
{
|
||||
delete (float*)control_input[0].buffer();
|
||||
delete (float*)control_input[1].buffer();
|
||||
log_destroy();
|
||||
}
|
||||
|
||||
|
@ -71,6 +90,12 @@ Gain_Module::configure_inputs ( int n )
|
|||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
Gain_Module::handle_sample_rate_change ( nframes_t n )
|
||||
{
|
||||
smoothing.sample_rate( n );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********/
|
||||
|
@ -80,13 +105,38 @@ Gain_Module::configure_inputs ( int n )
|
|||
void
|
||||
Gain_Module::process ( nframes_t nframes )
|
||||
{
|
||||
float g = DB_CO( control_input[0].control_value() );
|
||||
|
||||
for ( int i = audio_input.size(); i--; )
|
||||
if ( unlikely( bypass() ) )
|
||||
{
|
||||
if ( audio_input[i].connected() && audio_output[i].connected() )
|
||||
/* nothing to do */
|
||||
}
|
||||
else
|
||||
{
|
||||
const float gt = DB_CO( control_input[1].control_value() ? -90.f : control_input[0].control_value() );
|
||||
|
||||
sample_t gainbuf[nframes];
|
||||
|
||||
bool use_gainbuf = smoothing.apply( gainbuf, nframes, gt );
|
||||
|
||||
if ( unlikely( use_gainbuf ) )
|
||||
{
|
||||
buffer_apply_gain( (sample_t*)audio_input[i].buffer(), nframes, g );
|
||||
for ( int i = audio_input.size(); i--; )
|
||||
{
|
||||
if ( audio_input[i].connected() && audio_output[i].connected() )
|
||||
{
|
||||
sample_t *out = (sample_t*)audio_input[i].buffer();
|
||||
|
||||
buffer_apply_gain_buffer( out, gainbuf, nframes );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
for ( int i = audio_input.size(); i--; )
|
||||
{
|
||||
if ( audio_input[i].connected() && audio_output[i].connected() )
|
||||
{
|
||||
buffer_apply_gain( (sample_t*)audio_input[i].buffer(), nframes, gt );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|