From 4648cb274e135abc361df1afbcdda36c8e3edf2f Mon Sep 17 00:00:00 2001 From: Vries Date: Wed, 14 Feb 2024 17:50:57 +0100 Subject: [PATCH] Switch to rmarkdown documentation and added github pages with pkgdown --- .Rbuildignore | 6 + .github/.gitignore | 1 + .github/workflows/pkgdown.yaml | 48 ++ .gitignore | 1 + DESCRIPTION | 17 +- LICENSE.md | 595 +++++++++++++++++++++++ NEWS => NEWS.md | 6 + ProTrackR.Rproj | 2 +- R/01supporting_functions.r | 146 +++--- R/02PTCell.r | 266 +++++----- R/03PTTrack.r | 24 +- R/04PTPattern.r | 26 +- R/05PTSample.r | 452 ++++++++--------- R/06PTModule.r | 352 +++++++------- R/07PTBlock.r | 88 ++-- R/08coercion.r | 254 +++++----- R/09playing_routines.r | 174 +++---- R/10ModArchiveHelpers.r | 96 ++-- R/11MODPlugHelpers.r | 40 +- R/12ModLandHelpers.r | 46 +- R/ProTrackR-package.r | 156 +++--- R/data.r | 52 +- README.Rmd | 92 ++++ README.md | 90 ++++ _pkgdown.yml | 11 + man/PTCell-class.Rd | 24 +- man/PTCell-method.Rd | 14 +- man/PTModule-class.Rd | 10 +- man/PTPattern-class.Rd | 2 +- man/PTPattern-method.Rd | 6 +- man/PTSample-class.Rd | 50 +- man/PTSample-method.Rd | 6 +- man/PTTrack-class.Rd | 4 +- man/PTTrack-method.Rd | 6 +- man/ProTrackR-package.Rd | 139 +++--- man/as.character.Rd | 2 +- man/as.raw.Rd | 10 +- man/effect.Rd | 2 +- man/figures/README-power_cyberride-1.png | Bin 0 -> 113391 bytes man/fineTune.Rd | 2 +- man/funk_table.Rd | 2 +- man/loopLength.Rd | 10 +- man/loopSample.Rd | 2 +- man/loopStart.Rd | 10 +- man/mod.intro.Rd | 2 +- man/modArchive.Rd | 33 +- man/modLand.Rd | 13 +- man/modToWave.Rd | 22 +- man/name.Rd | 2 +- man/note.Rd | 10 +- man/noteManipulation.Rd | 2 +- man/noteToPeriod.Rd | 2 +- man/nybble.Rd | 2 +- man/nybbleToSignedInt.Rd | 4 +- man/octave.Rd | 2 +- man/patternOrder.Rd | 2 +- man/patternOrderLength.Rd | 2 +- man/paula_clock.Rd | 8 +- man/period_table.Rd | 10 +- man/playMod.Rd | 4 +- man/playSample.Rd | 10 +- man/playWave.Rd | 12 +- man/playingtable.Rd | 12 +- man/plot.Rd | 8 +- man/print.Rd | 2 +- man/rawToCharNull.Rd | 2 +- man/rawToPTModule.Rd | 8 +- man/rawToSignedInt.Rd | 4 +- man/rawToUnsignedInt.Rd | 6 +- man/read.module.Rd | 2 +- man/read.sample.Rd | 16 +- man/resample.Rd | 4 +- man/sampleNumber.Rd | 2 +- man/sampleRate.Rd | 8 +- man/signedIntToNybble.Rd | 4 +- man/signedIntToRaw.Rd | 4 +- man/trackerFlag.Rd | 14 +- man/unsignedIntToRaw.Rd | 2 +- man/volume.Rd | 2 +- man/waveform.Rd | 8 +- man/write.module.Rd | 2 +- man/write.sample.Rd | 8 +- 82 files changed, 2216 insertions(+), 1386 deletions(-) create mode 100644 .github/.gitignore create mode 100644 .github/workflows/pkgdown.yaml create mode 100644 LICENSE.md rename NEWS => NEWS.md (98%) create mode 100644 README.Rmd create mode 100644 README.md create mode 100644 _pkgdown.yml create mode 100644 man/figures/README-power_cyberride-1.png diff --git a/.Rbuildignore b/.Rbuildignore index 91114bf..f702134 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -1,2 +1,8 @@ ^.*\.Rproj$ ^\.Rproj\.user$ +^LICENSE\.md$ +^README\.Rmd$ +^_pkgdown\.yml$ +^docs$ +^pkgdown$ +^\.github$ diff --git a/.github/.gitignore b/.github/.gitignore new file mode 100644 index 0000000..2d19fc7 --- /dev/null +++ b/.github/.gitignore @@ -0,0 +1 @@ +*.html diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml new file mode 100644 index 0000000..a7276e8 --- /dev/null +++ b/.github/workflows/pkgdown.yaml @@ -0,0 +1,48 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help +on: + push: + branches: [main, master] + pull_request: + branches: [main, master] + release: + types: [published] + workflow_dispatch: + +name: pkgdown + +jobs: + pkgdown: + runs-on: ubuntu-latest + # Only restrict concurrency for non-PR jobs + concurrency: + group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }} + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-pandoc@v2 + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::pkgdown, local::. + needs: website + + - name: Build site + run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) + shell: Rscript {0} + + - name: Deploy to GitHub pages 🚀 + if: github.event_name != 'pull_request' + uses: JamesIves/github-pages-deploy-action@v4.5.0 + with: + clean: false + branch: gh-pages + folder: docs diff --git a/.gitignore b/.gitignore index 5b6a065..234f028 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .Rhistory .RData .Ruserdata +docs diff --git a/DESCRIPTION b/DESCRIPTION index 82e5d43..dd4862d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,11 +1,13 @@ Package: ProTrackR Type: Package Title: Manipulate and Play 'ProTracker' Modules -Version: 0.3.8 -Date: 2023-08-22 -Authors@R: c(person("Pepijn", "de Vries", role =c("aut", "cre", "dtc"), - email = "pepijn.devries@outlook.com")) -Author: Pepijn de Vries [aut, cre, dtc] +Version: 0.3.9 +Date: 2024-02-14 +Authors@R: c(person("Pepijn", "de Vries", role = c("aut", "cre", "dtc"), + email = "pepijn.devries@outlook.com", + comment = c(ORCID = "0000-0002-7961-6646"))) +Author: + Pepijn de Vries [aut, cre, dtc] (0000-0002-7961-6646) Maintainer: Pepijn de Vries Description: 'ProTracker' is a popular music tracker to sequence music on a Commodore Amiga machine. This package offers the @@ -15,11 +17,14 @@ Description: 'ProTracker' is a popular music tracker to sequence intends to contribute to this popularity and therewith keeping the legacy of 'ProTracker' and the Commodore Amiga alive. -License: GPL-3 +License: GPL (>= 3) LazyData: True Depends: audio, lattice, signal, tuneR (>= 1.0) Imports: graphics, methods, stats, utils, XML Suggests: AmigaFFH (>= 0.2.0) Encoding: UTF-8 RoxygenNote: 7.2.3 +Roxygen: list(markdown = TRUE) NeedsCompilation: no +URL: https://pepijn-devries.github.io/ProTrackR/, https:://www.github.com/pepijn-devries/ProTrackR/ +BugReports: https://github.com/pepijn-devries/ProTrackR/issues diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..175443c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,595 @@ +GNU General Public License +========================== + +_Version 3, 29 June 2007_ +_Copyright © 2007 Free Software Foundation, Inc. <>_ + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + +## Preamble + +The GNU General Public License is a free, copyleft license for software and other +kinds of works. + +The licenses for most software and other practical works are designed to take away +your freedom to share and change the works. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change all versions of a +program--to make sure it remains free software for all its users. We, the Free +Software Foundation, use the GNU General Public License for most of our software; it +applies also to any other work released this way by its authors. You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General +Public Licenses are designed to make sure that you have the freedom to distribute +copies of free software (and charge for them if you wish), that you receive source +code or can get it if you want it, that you can change the software or use pieces of +it in new free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you these rights or +asking you to surrender the rights. Therefore, you have certain responsibilities if +you distribute copies of the software, or if you modify it: responsibilities to +respect the freedom of others. + +For example, if you distribute copies of such a program, whether gratis or for a fee, +you must pass on to the recipients the same freedoms that you received. You must make +sure that they, too, receive or can get the source code. And you must show them these +terms so they know their rights. + +Developers that use the GNU GPL protect your rights with two steps: **(1)** assert +copyright on the software, and **(2)** offer you this License giving you legal permission +to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains that there is +no warranty for this free software. For both users' and authors' sake, the GPL +requires that modified versions be marked as changed, so that their problems will not +be attributed erroneously to authors of previous versions. + +Some devices are designed to deny users access to install or run modified versions of +the software inside them, although the manufacturer can do so. This is fundamentally +incompatible with the aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we have designed +this version of the GPL to prohibit the practice for those products. If such problems +arise substantially in other domains, we stand ready to extend this provision to +those domains in future versions of the GPL, as needed to protect the freedom of +users. + +Finally, every program is threatened constantly by software patents. States should +not allow patents to restrict development and use of software on general-purpose +computers, but in those that do, we wish to avoid the special danger that patents +applied to a free program could make it effectively proprietary. To prevent this, the +GPL assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and modification follow. + +## TERMS AND CONDITIONS + +### 0. Definitions + +“This License” refers to version 3 of the GNU General Public License. + +“Copyright” also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + +“The Program” refers to any copyrightable work licensed under this +License. Each licensee is addressed as “you”. “Licensees” and +“recipients” may be individuals or organizations. + +To “modify” a work means to copy from or adapt all or part of the work in +a fashion requiring copyright permission, other than the making of an exact copy. The +resulting work is called a “modified version” of the earlier work or a +work “based on” the earlier work. + +A “covered work” means either the unmodified Program or a work based on +the Program. + +To “propagate” a work means to do anything with it that, without +permission, would make you directly or secondarily liable for infringement under +applicable copyright law, except executing it on a computer or modifying a private +copy. Propagation includes copying, distribution (with or without modification), +making available to the public, and in some countries other activities as well. + +To “convey” a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through a computer +network, with no transfer of a copy, is not conveying. + +An interactive user interface displays “Appropriate Legal Notices” to the +extent that it includes a convenient and prominently visible feature that **(1)** +displays an appropriate copyright notice, and **(2)** tells the user that there is no +warranty for the work (except to the extent that warranties are provided), that +licensees may convey the work under this License, and how to view a copy of this +License. If the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +### 1. Source Code + +The “source code” for a work means the preferred form of the work for +making modifications to it. “Object code” means any non-source form of a +work. + +A “Standard Interface” means an interface that either is an official +standard defined by a recognized standards body, or, in the case of interfaces +specified for a particular programming language, one that is widely used among +developers working in that language. + +The “System Libraries” of an executable work include anything, other than +the work as a whole, that **(a)** is included in the normal form of packaging a Major +Component, but which is not part of that Major Component, and **(b)** serves only to +enable use of the work with that Major Component, or to implement a Standard +Interface for which an implementation is available to the public in source code form. +A “Major Component”, in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system (if any) on which +the executable work runs, or a compiler used to produce the work, or an object code +interpreter used to run it. + +The “Corresponding Source” for a work in object code form means all the +source code needed to generate, install, and (for an executable work) run the object +code and to modify the work, including scripts to control those activities. However, +it does not include the work's System Libraries, or general-purpose tools or +generally available free programs which are used unmodified in performing those +activities but which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for the work, and +the source code for shared libraries and dynamically linked subprograms that the work +is specifically designed to require, such as by intimate data communication or +control flow between those subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can regenerate +automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same work. + +### 2. Basic Permissions + +All rights granted under this License are granted for the term of copyright on the +Program, and are irrevocable provided the stated conditions are met. This License +explicitly affirms your unlimited permission to run the unmodified Program. The +output from running a covered work is covered by this License only if the output, +given its content, constitutes a covered work. This License acknowledges your rights +of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, without +conditions so long as your license otherwise remains in force. You may convey covered +works to others for the sole purpose of having them make modifications exclusively +for you, or provide you with facilities for running those works, provided that you +comply with the terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for you must do so +exclusively on your behalf, under your direction and control, on terms that prohibit +them from making any copies of your copyrighted material outside their relationship +with you. + +Conveying under any other circumstances is permitted solely under the conditions +stated below. Sublicensing is not allowed; section 10 makes it unnecessary. + +### 3. Protecting Users' Legal Rights From Anti-Circumvention Law + +No covered work shall be deemed part of an effective technological measure under any +applicable law fulfilling obligations under article 11 of the WIPO copyright treaty +adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention +of such measures. + +When you convey a covered work, you waive any legal power to forbid circumvention of +technological measures to the extent such circumvention is effected by exercising +rights under this License with respect to the covered work, and you disclaim any +intention to limit operation or modification of the work as a means of enforcing, +against the work's users, your or third parties' legal rights to forbid circumvention +of technological measures. + +### 4. Conveying Verbatim Copies + +You may convey verbatim copies of the Program's source code as you receive it, in any +medium, provided that you conspicuously and appropriately publish on each copy an +appropriate copyright notice; keep intact all notices stating that this License and +any non-permissive terms added in accord with section 7 apply to the code; keep +intact all notices of the absence of any warranty; and give all recipients a copy of +this License along with the Program. + +You may charge any price or no price for each copy that you convey, and you may offer +support or warranty protection for a fee. + +### 5. Conveying Modified Source Versions + +You may convey a work based on the Program, or the modifications to produce it from +the Program, in the form of source code under the terms of section 4, provided that +you also meet all of these conditions: + +* **a)** The work must carry prominent notices stating that you modified it, and giving a +relevant date. +* **b)** The work must carry prominent notices stating that it is released under this +License and any conditions added under section 7. This requirement modifies the +requirement in section 4 to “keep intact all notices”. +* **c)** You must license the entire work, as a whole, under this License to anyone who +comes into possession of a copy. This License will therefore apply, along with any +applicable section 7 additional terms, to the whole of the work, and all its parts, +regardless of how they are packaged. This License gives no permission to license the +work in any other way, but it does not invalidate such permission if you have +separately received it. +* **d)** If the work has interactive user interfaces, each must display Appropriate Legal +Notices; however, if the Program has interactive interfaces that do not display +Appropriate Legal Notices, your work need not make them do so. + +A compilation of a covered work with other separate and independent works, which are +not by their nature extensions of the covered work, and which are not combined with +it such as to form a larger program, in or on a volume of a storage or distribution +medium, is called an “aggregate” if the compilation and its resulting +copyright are not used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work in an aggregate +does not cause this License to apply to the other parts of the aggregate. + +### 6. Conveying Non-Source Forms + +You may convey a covered work in object code form under the terms of sections 4 and +5, provided that you also convey the machine-readable Corresponding Source under the +terms of this License, in one of these ways: + +* **a)** Convey the object code in, or embodied in, a physical product (including a +physical distribution medium), accompanied by the Corresponding Source fixed on a +durable physical medium customarily used for software interchange. +* **b)** Convey the object code in, or embodied in, a physical product (including a +physical distribution medium), accompanied by a written offer, valid for at least +three years and valid for as long as you offer spare parts or customer support for +that product model, to give anyone who possesses the object code either **(1)** a copy of +the Corresponding Source for all the software in the product that is covered by this +License, on a durable physical medium customarily used for software interchange, for +a price no more than your reasonable cost of physically performing this conveying of +source, or **(2)** access to copy the Corresponding Source from a network server at no +charge. +* **c)** Convey individual copies of the object code with a copy of the written offer to +provide the Corresponding Source. This alternative is allowed only occasionally and +noncommercially, and only if you received the object code with such an offer, in +accord with subsection 6b. +* **d)** Convey the object code by offering access from a designated place (gratis or for +a charge), and offer equivalent access to the Corresponding Source in the same way +through the same place at no further charge. You need not require recipients to copy +the Corresponding Source along with the object code. If the place to copy the object +code is a network server, the Corresponding Source may be on a different server +(operated by you or a third party) that supports equivalent copying facilities, +provided you maintain clear directions next to the object code saying where to find +the Corresponding Source. Regardless of what server hosts the Corresponding Source, +you remain obligated to ensure that it is available for as long as needed to satisfy +these requirements. +* **e)** Convey the object code using peer-to-peer transmission, provided you inform +other peers where the object code and Corresponding Source of the work are being +offered to the general public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded from the +Corresponding Source as a System Library, need not be included in conveying the +object code work. + +A “User Product” is either **(1)** a “consumer product”, which +means any tangible personal property which is normally used for personal, family, or +household purposes, or **(2)** anything designed or sold for incorporation into a +dwelling. In determining whether a product is a consumer product, doubtful cases +shall be resolved in favor of coverage. For a particular product received by a +particular user, “normally used” refers to a typical or common use of +that class of product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected to use, the +product. A product is a consumer product regardless of whether the product has +substantial commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + +“Installation Information” for a User Product means any methods, +procedures, authorization keys, or other information required to install and execute +modified versions of a covered work in that User Product from a modified version of +its Corresponding Source. The information must suffice to ensure that the continued +functioning of the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or specifically for +use in, a User Product, and the conveying occurs as part of a transaction in which +the right of possession and use of the User Product is transferred to the recipient +in perpetuity or for a fixed term (regardless of how the transaction is +characterized), the Corresponding Source conveyed under this section must be +accompanied by the Installation Information. But this requirement does not apply if +neither you nor any third party retains the ability to install modified object code +on the User Product (for example, the work has been installed in ROM). + +The requirement to provide Installation Information does not include a requirement to +continue to provide support service, warranty, or updates for a work that has been +modified or installed by the recipient, or for the User Product in which it has been +modified or installed. Access to a network may be denied when the modification itself +materially and adversely affects the operation of the network or violates the rules +and protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, in accord with +this section must be in a format that is publicly documented (and with an +implementation available to the public in source code form), and must require no +special password or key for unpacking, reading or copying. + +### 7. Additional Terms + +“Additional permissions” are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. Additional +permissions that are applicable to the entire Program shall be treated as though they +were included in this License, to the extent that they are valid under applicable +law. If additional permissions apply only to part of the Program, that part may be +used separately under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option remove any +additional permissions from that copy, or from any part of it. (Additional +permissions may be written to require their own removal in certain cases when you +modify the work.) You may place additional permissions on material, added by you to a +covered work, for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you add to a +covered work, you may (if authorized by the copyright holders of that material) +supplement the terms of this License with terms: + +* **a)** Disclaiming warranty or limiting liability differently from the terms of +sections 15 and 16 of this License; or +* **b)** Requiring preservation of specified reasonable legal notices or author +attributions in that material or in the Appropriate Legal Notices displayed by works +containing it; or +* **c)** Prohibiting misrepresentation of the origin of that material, or requiring that +modified versions of such material be marked in reasonable ways as different from the +original version; or +* **d)** Limiting the use for publicity purposes of names of licensors or authors of the +material; or +* **e)** Declining to grant rights under trademark law for use of some trade names, +trademarks, or service marks; or +* **f)** Requiring indemnification of licensors and authors of that material by anyone +who conveys the material (or modified versions of it) with contractual assumptions of +liability to the recipient, for any liability that these contractual assumptions +directly impose on those licensors and authors. + +All other non-permissive additional terms are considered “further +restrictions” within the meaning of section 10. If the Program as you received +it, or any part of it, contains a notice stating that it is governed by this License +along with a term that is a further restriction, you may remove that term. If a +license document contains a further restriction but permits relicensing or conveying +under this License, you may add to a covered work material governed by the terms of +that license document, provided that the further restriction does not survive such +relicensing or conveying. + +If you add terms to a covered work in accord with this section, you must place, in +the relevant source files, a statement of the additional terms that apply to those +files, or a notice indicating where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the form of a +separately written license, or stated as exceptions; the above requirements apply +either way. + +### 8. Termination + +You may not propagate or modify a covered work except as expressly provided under +this License. Any attempt otherwise to propagate or modify it is void, and will +automatically terminate your rights under this License (including any patent licenses +granted under the third paragraph of section 11). + +However, if you cease all violation of this License, then your license from a +particular copyright holder is reinstated **(a)** provisionally, unless and until the +copyright holder explicitly and finally terminates your license, and **(b)** permanently, +if the copyright holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is reinstated permanently +if the copyright holder notifies you of the violation by some reasonable means, this +is the first time you have received notice of violation of this License (for any +work) from that copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the licenses of +parties who have received copies or rights from you under this License. If your +rights have been terminated and not permanently reinstated, you do not qualify to +receive new licenses for the same material under section 10. + +### 9. Acceptance Not Required for Having Copies + +You are not required to accept this License in order to receive or run a copy of the +Program. Ancillary propagation of a covered work occurring solely as a consequence of +using peer-to-peer transmission to receive a copy likewise does not require +acceptance. However, nothing other than this License grants you permission to +propagate or modify any covered work. These actions infringe copyright if you do not +accept this License. Therefore, by modifying or propagating a covered work, you +indicate your acceptance of this License to do so. + +### 10. Automatic Licensing of Downstream Recipients + +Each time you convey a covered work, the recipient automatically receives a license +from the original licensors, to run, modify and propagate that work, subject to this +License. You are not responsible for enforcing compliance by third parties with this +License. + +An “entity transaction” is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an organization, or +merging organizations. If propagation of a covered work results from an entity +transaction, each party to that transaction who receives a copy of the work also +receives whatever licenses to the work the party's predecessor in interest had or +could give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if the predecessor +has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the rights granted or +affirmed under this License. For example, you may not impose a license fee, royalty, +or other charge for exercise of rights granted under this License, and you may not +initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging +that any patent claim is infringed by making, using, selling, offering for sale, or +importing the Program or any portion of it. + +### 11. Patents + +A “contributor” is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The work thus +licensed is called the contributor's “contributor version”. + +A contributor's “essential patent claims” are all patent claims owned or +controlled by the contributor, whether already acquired or hereafter acquired, that +would be infringed by some manner, permitted by this License, of making, using, or +selling its contributor version, but do not include claims that would be infringed +only as a consequence of further modification of the contributor version. For +purposes of this definition, “control” includes the right to grant patent +sublicenses in a manner consistent with the requirements of this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free patent license +under the contributor's essential patent claims, to make, use, sell, offer for sale, +import and otherwise run, modify and propagate the contents of its contributor +version. + +In the following three paragraphs, a “patent license” is any express +agreement or commitment, however denominated, not to enforce a patent (such as an +express permission to practice a patent or covenant not to sue for patent +infringement). To “grant” such a patent license to a party means to make +such an agreement or commitment not to enforce a patent against the party. + +If you convey a covered work, knowingly relying on a patent license, and the +Corresponding Source of the work is not available for anyone to copy, free of charge +and under the terms of this License, through a publicly available network server or +other readily accessible means, then you must either **(1)** cause the Corresponding +Source to be so available, or **(2)** arrange to deprive yourself of the benefit of the +patent license for this particular work, or **(3)** arrange, in a manner consistent with +the requirements of this License, to extend the patent license to downstream +recipients. “Knowingly relying” means you have actual knowledge that, but +for the patent license, your conveying the covered work in a country, or your +recipient's use of the covered work in a country, would infringe one or more +identifiable patents in that country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or arrangement, you +convey, or propagate by procuring conveyance of, a covered work, and grant a patent +license to some of the parties receiving the covered work authorizing them to use, +propagate, modify or convey a specific copy of the covered work, then the patent +license you grant is automatically extended to all recipients of the covered work and +works based on it. + +A patent license is “discriminatory” if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on the +non-exercise of one or more of the rights that are specifically granted under this +License. You may not convey a covered work if you are a party to an arrangement with +a third party that is in the business of distributing software, under which you make +payment to the third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties who would receive +the covered work from you, a discriminatory patent license **(a)** in connection with +copies of the covered work conveyed by you (or copies made from those copies), or **(b)** +primarily for and in connection with specific products or compilations that contain +the covered work, unless you entered into that arrangement, or that patent license +was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting any implied +license or other defenses to infringement that may otherwise be available to you +under applicable patent law. + +### 12. No Surrender of Others' Freedom + +If conditions are imposed on you (whether by court order, agreement or otherwise) +that contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot convey a covered work so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not convey it at all. For example, if you +agree to terms that obligate you to collect a royalty for further conveying from +those to whom you convey the Program, the only way you could satisfy both those terms +and this License would be to refrain entirely from conveying the Program. + +### 13. Use with the GNU Affero General Public License + +Notwithstanding any other provision of this License, you have permission to link or +combine any covered work with a work licensed under version 3 of the GNU Affero +General Public License into a single combined work, and to convey the resulting work. +The terms of this License will continue to apply to the part which is the covered +work, but the special requirements of the GNU Affero General Public License, section +13, concerning interaction through a network will apply to the combination as such. + +### 14. Revised Versions of this License + +The Free Software Foundation may publish revised and/or new versions of the GNU +General Public License from time to time. Such new versions will be similar in spirit +to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies that +a certain numbered version of the GNU General Public License “or any later +version” applies to it, you have the option of following the terms and +conditions either of that numbered version or of any later version published by the +Free Software Foundation. If the Program does not specify a version number of the GNU +General Public License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions of the GNU +General Public License can be used, that proxy's public statement of acceptance of a +version permanently authorizes you to choose that version for the Program. + +Later license versions may give you additional or different permissions. However, no +additional obligations are imposed on any author or copyright holder as a result of +your choosing to follow a later version. + +### 15. Disclaimer of Warranty + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER +EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE +QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +### 16. Limitation of Liability + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY +COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS +PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, +INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE +OR LOSSES SUSTAINED BY 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. + +### 17. Interpretation of Sections 15 and 16 + +If the disclaimer of warranty and limitation of liability provided above cannot be +given local legal effect according to their terms, reviewing courts shall apply local +law that most closely approximates an absolute waiver of all civil liability in +connection with the Program, unless a warranty or assumption of liability accompanies +a copy of the Program in return for a fee. + +_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 free software which everyone +can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them +to the start of each source file to most effectively state the exclusion of warranty; +and each file should have at least the “copyright” line and a pointer to +where the full notice is found. + + + Copyright (C) + + 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 3 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. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If the program does terminal interaction, make it output a short notice like this +when it starts in an interactive mode: + + Copyright (C) + This program 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. + +The hypothetical commands `show w` and `show c` should show the appropriate parts of +the General Public License. Of course, your program's commands might be different; +for a GUI interface, you would use an “about box”. + +You should also get your employer (if you work as a programmer) or school, if any, to +sign a “copyright disclaimer” for the program, if necessary. For more +information on this, and how to apply and follow the GNU GPL, see +<>. + +The GNU 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 Lesser General Public License instead of this +License. But first, please read +<>. diff --git a/NEWS b/NEWS.md similarity index 98% rename from NEWS rename to NEWS.md index 1e43a77..2897646 100644 --- a/NEWS +++ b/NEWS.md @@ -1,3 +1,9 @@ +ProTrackR v0.3.9 (Release date: 2023-02-14) +============= + + * Added `pkgdown` website and README + * switched to RMarkdown mode for roxygen2 documentation + ProTrackR v0.3.8 (Release date: 2023-08-22) ============= diff --git a/ProTrackR.Rproj b/ProTrackR.Rproj index eaa6b81..1788e68 100644 --- a/ProTrackR.Rproj +++ b/ProTrackR.Rproj @@ -15,4 +15,4 @@ LaTeX: pdfLaTeX BuildType: Package PackageUseDevtools: Yes PackageInstallArgs: --no-multiarch --with-keep.source -PackageRoxygenize: rd,collate,namespace +PackageRoxygenize: rd,collate,namespace,vignette diff --git a/R/01supporting_functions.r b/R/01supporting_functions.r index 8b0ed80..d1354af 100644 --- a/R/01supporting_functions.r +++ b/R/01supporting_functions.r @@ -1,14 +1,14 @@ #' Convert raw vectors into a character string #' -#' A function that converts \code{raw} data into a \code{character} string. +#' A function that converts `raw` data into a `character` string. #' -#' The function \code{\link{rawToChar}} will fail on vectors of \code{raw} data -#' with embedded \code{0x00} data. This function will not fail on embedded \code{0x00} values. -#' Instead, it will replace embedded \code{0x00} data with white spaces. Note that -#' leading and trailing \code{0x00} data will be omitted from the result. +#' The function `rawToChar()` will fail on vectors of `raw` data +#' with embedded `0x00` data. This function will not fail on embedded `0x00` values. +#' Instead, it will replace embedded `0x00` data with white spaces. Note that +#' leading and trailing `0x00` data will be omitted from the result. #' -#' @param raw_dat A vector of class \code{raw} to be converted into a \code{character}. -#' @returns A \code{character} string based on the \code{raw} data +#' @param raw_dat A vector of class `raw` to be converted into a `character`. +#' @returns A `character` string based on the `raw` data #' @examples #' ## generate some raw data with an embedded 0x00: #' some.raw.data <- as.raw(c(0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, @@ -47,15 +47,15 @@ rawToCharNull <- function(raw_dat) { #' Convert raw vector into a single unsigned integer value #' -#' This function converts \code{raw} data into an unsigned integer +#' This function converts `raw` data into an unsigned integer #' #' This function converts a vector of raw data into a single unsigned integer. -#' for conversion of raw data into a vector of unsigned integers [0,255] use -#' `\code{\link{as.integer}(x)}'. For an inverse of this function -#' see \code{\link{unsignedIntToRaw}}. +#' for conversion of raw data into a vector of unsigned integers `\[0,255\`] use +#' `as.integer()`. For an inverse of this function +#' see `unsignedIntToRaw()`. #' -#' @param raw_dat A vector of class \code{raw} to be converted into an unsigned integer -#' @returns A single unsigned integer value based on the provided \code{raw} data +#' @param raw_dat A vector of class `raw` to be converted into an unsigned integer +#' @returns A single unsigned integer value based on the provided `raw` data #' @examples #' ## generate some raw data: #' some.raw.data <- as.raw(c(0x01, 0x1e, 0x3f)) @@ -80,19 +80,19 @@ rawToUnsignedInt <- #' Convert unsigned integer into a raw vector #' -#' This function converts an unsigned integer into a vector of \code{raw} data. +#' This function converts an unsigned integer into a vector of `raw` data. #' #' This function converts an unsigned integer value into a vector (with -#' a specified length, namely \code{length.out}) of \code{raw} data. For the -#' inverse of this function use \code{\link{rawToUnsignedInt}(raw_dat)} +#' a specified length, namely `length.out`) of `raw` data. For the +#' inverse of this function use `rawToUnsignedInt()`. #' #' @param int_dat A single integer value. If a list or vector of values. #' is provided, only the first element is evaluated. Input data are converted #' to absolute integer values. #' @param length.out Required length of the vector that will hold the resulting. -#' \code{raw} data. Defaults to 1. If the value of \code{int_dat} is to large to convert into -#' \code{raw} data of length \code{length.out}, data will be clipped. -#' @returns A vector of length \code{length.out}, holding \code{raw} data. +#' `raw` data. Defaults to 1. If the value of `int_dat` is to large to convert into +#' `raw` data of length `length.out`, data will be clipped. +#' @returns A vector of length `length.out`, holding `raw` data. #' @examples #' ## generate some unsigned integer: #' some.integer <- 43251 @@ -135,16 +135,16 @@ unsignedIntToRaw <- #' Convert signed integers (short) into a raw vector #' -#' This function converts signed integer values into a vector of \code{raw} data. +#' This function converts signed integer values into a vector of `raw` data. #' -#' This function converts signed integer values [-128,127] into a vector of -#' \code{raw} data. The function +#' This function converts signed integer values \[-128,127\] into a vector of +#' `raw` data. The function #' will fail on values that are out of range (< -128 or > 127). To convert -#' raw data into a vector of unsigned integers use \code{\link{as.integer}(x)}. -#' For the inverse of this function see \code{\link{rawToSignedInt}(raw_dat)}. +#' raw data into a vector of unsigned integers use `as.integer()`. +#' For the inverse of this function see `rawToSignedInt()`. #' #' @param int_dat A vector of integer values, ranging from -128 up to 127. -#' @returns A vector of the same length as \code{int_dat}, holding \code{raw} data. +#' @returns A vector of the same length as `int_dat`, holding `raw` data. #' @examples #' ## generate some signed integers: #' some.integers <- c(-100, 40, 0, 30, -123) @@ -170,14 +170,14 @@ signedIntToRaw <- #' Convert a raw vector into signed integers (short) #' -#' This function converts a vector of \code{raw} data into signed integer values. +#' This function converts a vector of `raw` data into signed integer values. #' -#' This function converts a vector of \code{raw} data into signed integer values -#' [-128,127]. To convert unsigned integers into raw data use \code{\link{as.raw}(x)}. -#' For the inverse of this function see \code{\link{signedIntToRaw}(int_dat)}. +#' This function converts a vector of `raw` data into signed integer values +#' \[-128,127\]. To convert unsigned integers into raw data use `as.raw()`. +#' For the inverse of this function see `signedIntToRaw()`. #' -#' @param raw_dat A vector of \code{raw} data. -#' @returns A vector of the same length as \code{raw_dat}, holding signed integer values. +#' @param raw_dat A vector of `raw` data. +#' @returns A vector of the same length as `raw_dat`, holding signed integer values. #' @examples #' ## generate some raw data: #' some.raw.data <- as.raw(c(0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x90)) @@ -212,16 +212,16 @@ rawToSignedInt <- #' #' These functions return the note and octave that is closest to the provided period value. #' -#' ProTracker uses a \link{period_table} to link period values to certain +#' ProTracker uses a [period_table] to link period values to certain #' octaves and notes. This function serves to look up corresponding #' notes and octaves for specific period values. #' #' @rdname periodToChar #' @name periodToChar -#' @param period \code{integer} value of a period value. -#' @returns \code{periodToChar} returns a \code{character} representing the combination +#' @param period `integer` value of a period value. +#' @returns `periodToChar` returns a `character` representing the combination #' of octave and note that is closest to -#' \code{period} in the ProTracker period table. +#' `period` in the ProTracker period table. #' @examples #' ## Note C# in octave 3 is closest to a period of 200 in the table: #' periodToChar(200) @@ -247,18 +247,18 @@ periodToChar <- #' #' Extracts the ProTracker period value for a specific note. #' -#' ProTracker uses a \link{period_table} to link period values to certain +#' ProTracker uses a [period_table] to link period values to certain #' octaves and notes. This function serves to look up corresponding #' period values for specific notes and octaves. #' #' @rdname noteToPeriod #' @name noteToPeriod -#' @param note \code{character} string representing a note and octave for which the +#' @param note `character` string representing a note and octave for which the #' ProTracker period value needs to be determined -#' @param finetune \code{integer} value ranging from -8 up to 7. A value used to +#' @param finetune `integer` value ranging from -8 up to 7. A value used to #' tune an audio sample. -#' @returns Returns the \code{numeric} ProTracker period value for a corresponding -#' note, octave and \code{\link{fineTune}}. Returns 0 if a note could not be found in the +#' @returns Returns the `numeric` ProTracker period value for a corresponding +#' note, octave and `fineTune()`. Returns 0 if a note could not be found in the #' table. #' @examples #' ## Determine the period value corresponding with note 'A-3': @@ -313,8 +313,8 @@ noteToPeriod <- #' Calculate the sample rate for a note or a ProTracker period value. #' #' The timing on a Commodore Amiga depends on the video mode, which could be -#' either `\href{https://en.wikipedia.org/wiki/PAL}{PAL}' -#' or `\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. Therefore sample +#' either '[PAL](https://en.wikipedia.org/wiki/PAL)' +#' or '[NTSC](https://en.wikipedia.org/wiki/NTSC)'. Therefore sample #' rates also depend on these modes. As the PAL is mostly used in Europe, and #' the Amiga was most popular in Europe, PAL is used by default. #' @@ -322,15 +322,15 @@ noteToPeriod <- #' @name sampleRate #' @aliases periodToSampleRate #' @aliases noteToSampleRate -#' @param period A ProTracker \code{integer} value of a period value for which the sample rate +#' @param period A ProTracker `integer` value of a period value for which the sample rate #' is to be calculated. -#' @param note A \code{character} string representing a note for which the sample +#' @param note A `character` string representing a note for which the sample #' rate is to be calculated. -#' @param finetune An \code{integer} value ranging from -8 up to 7. A value used to +#' @param finetune An `integer` value ranging from -8 up to 7. A value used to #' tune an audio sample. -#' @param video The video mode used to calculate the sample rate. A \code{character} -#' string that can have either the value `\href{https://en.wikipedia.org/wiki/PAL}{PAL}' -#' or `\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. PAL is used by default. +#' @param video The video mode used to calculate the sample rate. A `character` +#' string that can have either the value '[PAL](https://en.wikipedia.org/wiki/PAL)' +#' or '[NTSC](https://en.wikipedia.org/wiki/NTSC)'. PAL is used by default. #' @returns Returns the sample rate in samples per seconds. #' @examples #' ## calculate the sample rate for a ProTracker period value of 200 @@ -373,24 +373,24 @@ periodToSampleRate <- #' Get the high or low nybble of a raw value #' -#' Get the high or low nybble of a raw value and return as integer value [0,15]. +#' Get the high or low nybble of a raw value and return as integer value \[0,15\]. #' -#' A \code{raw} is basically a byte, composed of 8 bits (zeros and ones). +#' A `raw` is basically a byte, composed of 8 bits (zeros and ones). #' A nybble is a 4 bit value. Hence, a raw value (or byte) is composed of #' two nybbles. The leftmost nybble of a raw value is refered to as the #' high nybble, the rightmost nybble is referred to as the low nybble. #' These functions return either the high or low nybbles of raw data as integer -#' values [0,15]. +#' values \[0,15\]. #' As ProTracker stores some information as nybbles this function can be #' used to retrieve this info. #' #' @rdname nybble #' @name nybble -#' @param raw_dat A vector of class \code{raw} from which the high or low nybble value +#' @param raw_dat A vector of class `raw` from which the high or low nybble value #' needs to be extracted. #' @param which A character string indicating whether the high or low nybble should -#' be returnd. It should either be "\code{low}" (default) or "\code{high}". -#' @returns A vector of the same length as \code{raw_dat} holding integer values. +#' be returnd. It should either be `"low"` (default) or `"high"`. +#' @returns A vector of the same length as `raw_dat` holding integer values. #' @examples #' ## this will return 0x0f: #' hiNybble(as.raw(0xf3)) @@ -442,16 +442,16 @@ hiNybble <- #' #' Nybbles are 4 bit values, where each byte (8 bits) holds two nybbles. #' A high nybble (left-hand side of a byte) and a low nybble (right-hand -#' side of a byte). This function extracts a nybble from \code{raw} data -#' and converts it into a signed \code{integer} value ranging from -8 up to 7. +#' side of a byte). This function extracts a nybble from `raw` data +#' and converts it into a signed `integer` value ranging from -8 up to 7. #' @rdname nybbleToSignedInt #' @name nybbleToSignedInt -#' @param raw_dat \code{raw} data (either a single value or a \code{vector}), +#' @param raw_dat `raw` data (either a single value or a `vector`), #' from which a nybble will be extracted and converted. -#' @param which A \code{character} string indicating whether the "\code{low}" (default) -#' or "\code{high}" nybble of \code{raw_dat} needs to be converted into a signed -#' \code{integer}. -#' @returns Returns \code{integer} values of the same length as \code{raw_dat}, +#' @param which A `character` string indicating whether the `"low"` (default) +#' or `"high"` nybble of `raw_dat` needs to be converted into a signed +#' `integer`. +#' @returns Returns `integer` values of the same length as `raw_dat`, #' ranging from -8 up to 7. #' @examples #' ## generate some raw data: @@ -481,23 +481,23 @@ nybbleToSignedInt <- function(raw_dat, which = c("low", "high")) #' Convert a signed integer to a nybble in raw data. #' #' This function converts a signed integer ranging from -8 up to 7 into -#' either the high or low nybble of a byte, represented by \code{raw} data. +#' either the high or low nybble of a byte, represented by `raw` data. #' #' Nybbles are 4 bit values, where each byte (8 bits) holds two nybbles. #' A high nybble (left-hand side of a byte) and a low nybble (right-hand -#' side of a byte). This function converts a signed \code{integer} value +#' side of a byte). This function converts a signed `integer` value #' ranging from -8 up to 7 to a nybble and sets it as either a high or a low -#' nybble in \code{raw} data. +#' nybble in `raw` data. #' @rdname signedIntToNybble #' @name signedIntToNybble -#' @param int_dat A single\code{intger} value or a \code{vector} of -#' \code{integer} data ranging from -8 up to 7. +#' @param int_dat A single `integer` value or a `vector` of +#' `integer` data ranging from -8 up to 7. #' @param which A character string indicating whether the nybble should -#' be set to the "\code{low}" (default) or "\code{high}" position of the +#' be set to the `"low"` (default) or `"high"` position of the #' raw data that is returned. -#' @returns Returns \code{raw} data of the same length as \code{int_dat}. +#' @returns Returns `raw` data of the same length as `int_dat`. #' The returned raw data holds either low or high nybbles (as specified -#' by \code{which}) based on the provided signed \code{integer}s. +#' by `which`) based on the provided signed `integer`s. #' @examples #' ## generate some integers in the right range: #' @@ -533,16 +533,16 @@ signedIntToNybble <- function(int_dat, which = c("low", "high")) #' for vibrato effects for which a sine function was used. As there was no sine #' function that could be called, sine values were stored in a table. #' -#' This function returns the \code{integer} sine values (ranging from 0 up +#' This function returns the `integer` sine values (ranging from 0 up #' to 255) as a function of the table index (ranging from 0 up to 31). #' #' @rdname proTrackerVibrato #' @name proTrackerVibrato -#' @param x \code{integer} representing the table index ranging from 0 +#' @param x `integer` representing the table index ranging from 0 #' up to 31. Values outside this range can be used, but will produce #' results that are not valid in the context of ProTracker. -#' @returns Returns an \code{integer} sine value ranging from 0 up to 255 -#' when a valid table index (\code{x}) is provided. It will otherwise return +#' @returns Returns an `integer` sine value ranging from 0 up to 255 +#' when a valid table index (`x`) is provided. It will otherwise return #' a sine value ranging from -255 up to 255. #' @examples #' ## this will return the table as used in ProTracker diff --git a/R/02PTCell.r b/R/02PTCell.r index 6d36343..19ceb1b 100644 --- a/R/02PTCell.r +++ b/R/02PTCell.r @@ -22,42 +22,42 @@ validity.PTCell <- function(object) #' The PTCell class #' -#' The \code{PTCell} class is the smallest possible element of a \code{\link{PTPattern}} +#' The `PTCell` class is the smallest possible element of a [`PTPattern`] #' table. It holds all information on which note to play, at which frequency, #' with which effect and what kind of triggers or jumps should be applied. #' -#' The \code{PTCell} class consists of a \code{vector} of four \code{raw} values, -#' as specified in the `Slots' section. A cell will tell which \code{\link{PTSample}} +#' The `PTCell` class consists of a `vector` of four `raw` values, +#' as specified in the 'Slots' section. A cell will tell which [`PTSample`] #' is to be played at which frequency (corresponding to a note and octave). If #' no octave or note is specified, nothing will be played, or if a sample was -#' started to play on the same \code{\link{PTTrack}}, this sample will continue -#' playing. The \code{PTCell} can also hold \code{\link{effect}} codes which +#' started to play on the same [`PTTrack`], this sample will continue +#' playing. The `PTCell` can also hold `effect()` codes which #' can be used to add audio effects to the sample being played, change the #' speed/tempo at which patterns are played, or trigger jumps to other positions -#' within a \code{\link{PTPattern}} or to other positions in the -#' \code{\link{patternOrder}} table. +#' within a [`PTPattern`] or to other positions in the +#' [`patternOrder`] table. #' -#' @slot data A \code{vector} of class "\code{raw}" of length 4. The \code{raw} +#' @slot data A `vector` of class `raw` of length 4. The `raw` #' data is stored identical to the way it is stored in a ProTracker module -#' file. The \code{character} representation is easier to understand, and -#' with the \link[=ProTrackR-package]{ProTrackR} package it shouldn't be necessary to manipulate -#' the \code{raw} data directly. +#' file. The `character` representation is easier to understand, and +#' with the [ProTrackR][ProTrackR-package] package it shouldn't be necessary to manipulate +#' the `raw` data directly. #' #' The structure is illustrated with an example. Let's start with a -#' \code{character} representation of a \code{PTCell} as an example: "\code{C-3 1B A08}". +#' `character` representation of a `PTCell` as an example: `"C-3 1B A08"`. #' The left-hand part of this string shows that this cell will play note "C" in -#' octave 3. The middle part shows that \code{\link{PTSample}} number \code{0x1B} = \code{27} +#' octave 3. The middle part shows that [`PTSample`] number `0x1B = 27` #' will be played. The right-hand part of the string shows that effect "A08" #' will be applied (which is a volume slide down). #' -#' The \code{raw} representation of this example would be "\code{10 d6 ba 08}", -#' or when I replace the actual values with symbols: "\code{sp pp se ee}". Where -#' "\code{ss}" represents the sample number, "\code{eee}" represents the \code{\link{effect}} -#' code and "\code{ppp}" represents the period value. The correct note and octave -#' can be derived by looking up the period value in the \code{\link{period_table}} -#' (which is also implemented in the following methods: \code{\link{note}}, -#' \code{\link{octave}} and \code{\link{periodToChar}}). -#' The period value \code{0x0d6} = \code{214} corresponds with note "C" +#' The `raw` representation of this example would be `"10 d6 ba 08"`, +#' or when I replace the actual values with symbols: `"sp pp se ee"`. Where +#' `"ss"` represents the sample number, `"eee"` represents the [`effect()`] +#' code and `"ppp"` represents the period value. The correct note and octave +#' can be derived by looking up the period value in the [`period_table`] +#' (which is also implemented in the following methods: [`note()`], +#' [`octave()`] and [`periodToChar()`]). +#' The period value `0x0d6 = 214` corresponds with note "C" #' in octave 3. #' @name PTCell-class #' @rdname PTCell-class @@ -97,24 +97,24 @@ setClass("PTCell", #' Extract and replace raw data #' -#' Information of \code{\link{PTCell}}, \code{\link{PTTrack}} and -#' \code{\link{PTPattern}} objects are stored as \code{raw} values. This -#' method can be used to extract and replace this raw data. \code{\link{PTModule}} +#' Information of [`PTCell`], [`PTTrack`] and +#' [`PTPattern`] objects are stored as `raw` values. This +#' method can be used to extract and replace this raw data. [`PTModule`] #' objects can also be converted to raw data but not replaced by it. #' -#' A \code{\link{PTCell}} is an element of a \code{\link{PTTrack}} which -#' in turn is an element of a \code{\link{PTPattern}}. A \code{\link{PTPattern}} +#' A [`PTCell`] is an element of a [`PTTrack`] which +#' in turn is an element of a [`PTPattern`]. A [`PTPattern`] #' tells a tracker which sample to play at which frequency on which of the -#' four audio channels and with which effects. A \code{\link{PTCell}} in essence +#' four audio channels and with which effects. A [`PTCell`] in essence #' holds all this information as described at the documentation of -#' the \code{\link{PTCell-class}}. +#' the [`PTCell-class`]. #' -#' Data in these objects are stored in these objects in a \code{raw} form, +#' Data in these objects are stored in these objects in a `raw` form, #' to save working memory and to comply to the ProTracker file specifications #' (see documentation of each of these classes for more details). This method #' can be used to extract and replace raw data. #' -#' The \code{PTModule} object has a more complex structure but can also be converted +#' The `PTModule` object has a more complex structure but can also be converted #' into raw data (the way it would be stored in a ProTracker module file). However, #' this object cannot be replaced by raw data. #' @@ -124,33 +124,33 @@ setClass("PTCell", #' @aliases as.raw,PTCell-method #' @aliases as.raw,PTTrack-method #' @aliases as.raw,PTPattern-method -#' @param x A \code{\link{PTCell}}, \code{\link{PTTrack}} or -#' \code{\link{PTPattern}} object, for which the raw data needs to extracted -#' or replaced. A \code{\link{PTModule}} object is also allowed, but this +#' @param x A [`PTCell`], [`PTTrack`] or +#' [`PTPattern`] object, for which the raw data needs to extracted +#' or replaced. A [`PTModule`] object is also allowed, but this #' object cannot be replaced. -#' @param value \code{raw} data with which the \code{raw} data in object -#' \code{x} needs to be replaced. +#' @param value `raw` data with which the `raw` data in object +#' `x` needs to be replaced. #' -#' If \code{x} is a \code{PTCell} object, \code{value} -#' should be a \code{vector} of four \code{raw} values (conform specifications -#' provided at the documentation of the \code{\link{PTCell-class}}). +#' If `x` is a `PTCell` object, `value` +#' should be a `vector` of four `raw` values (conform specifications +#' provided at the documentation of the [`PTCell-class`]). #' -#' If \code{x} is a \code{PTTrack} object, \code{value} -#' should be a 64 by 4 \code{matrix} holding \code{raw} values (conform specifications -#' provided at the documentation of the \code{\link{PTTrack-class}}). +#' If `x` is a `PTTrack` object, `value` +#' should be a 64 by 4 `matrix` holding `raw` values (conform specifications +#' provided at the documentation of the [`PTTrack-class`]). #' -#' If \code{x} is a \code{PTPattern} object, \code{value} -#' should be a 64 by 16 \code{matrix} holding \code{raw} values (conform specifications -#' provided at the documentation of the \code{\link{PTPattern-class}}). -#' @returns For \code{as.raw}, a length 4 vector, 64 by 4 matrix or a 64 by 16 -#' matrix of \code{raw} data is returned, when x is of class \code{PTCell}, -#' \code{PTTrack} or \code{PTPattern}, respectively. +#' If `x` is a `PTPattern` object, `value` +#' should be a 64 by 16 `matrix` holding `raw` values (conform specifications +#' provided at the documentation of the [`PTPattern-class`]). +#' @returns For `as.raw`, a length 4 vector, 64 by 4 matrix or a 64 by 16 +#' matrix of `raw` data is returned, when x is of class `PTCell`, +#' `PTTrack` or `PTPattern`, respectively. #' -#' If \code{x} is a \code{PTModule} object, the \code{raw} data returned will +#' If `x` is a `PTModule` object, the `raw` data returned will #' have the same format as the ProTracker file format. #' -#' For \code{as.raw<-}, a copy of object \code{x} is returned in which the -#' \code{raw} data is replaced by \code{value}. +#' For `as.raw<-`, a copy of object `x` is returned in which the +#' `raw` data is replaced by `value`. #' #' @examples #' data("mod.intro") @@ -192,25 +192,25 @@ setReplaceMethod("as.raw", c("PTCell", "raw"), function(x, value){ #' Character representation of ProTrackR objects #' -#' Create a \code{character} representation of \code{\link{PTCell}}, -#' \code{\link{PTTrack}} or \code{\link{PTPattern}} objects. +#' Create a `character` representation of [`PTCell`], +#' [`PTTrack`] or [`PTPattern`] objects. #' -#' A \code{\link{PTCell}} is an element of a \code{\link{PTTrack}} which -#' in turn is an element of a \code{\link{PTPattern}}. A \code{\link{PTPattern}} +#' A [`PTCell`] is an element of a [`PTTrack`] which +#' in turn is an element of a [`PTPattern`]. A [`PTPattern`] #' tells a tracker which sample to play at which frequency on which of the -#' four audio channels and with which effects. A \code{\link{PTCell}} in essence +#' four audio channels and with which effects. A [`PTCell`] in essence #' holds all this information as described at the documentation of -#' the \code{\link{PTCell-class}}. +#' the [`PTCell-class`]. #' -#' Data in these objects are stored in these objects in a \code{raw} form, +#' Data in these objects are stored in these objects in a `raw` form, #' to save working memory and to comply to the ProTracker file specifications. #' As the raw data is not easy to interpret, this method is provided to #' make your life (and the interpretation of the objects) easier. #' #' This method generates a character representation of each of the three objects. #' These character representations can be coerced back to their original classes -#' with the following methods: \code{\link{PTCell-method}}, -#' \code{\link{PTTrack-method}} and \code{\link{PTPattern-method}}. +#' with the following methods: [`PTCell-method`], +#' [`PTTrack-method`] and [`PTPattern-method`]. #' #' @docType methods #' @rdname as.character @@ -218,16 +218,16 @@ setReplaceMethod("as.raw", c("PTCell", "raw"), function(x, value){ #' @aliases as.character,PTCell-method #' @aliases as.character,PTTrack-method #' @aliases as.character,PTPattern-method -#' @param x An object of any of the following classes: \code{\link{PTCell}}, -#' \code{\link{PTTrack}} or \code{\link{PTPattern}}. -#' @returns Returns a single character string when \code{x} is of class -#' \code{\link{PTCell}}. +#' @param x An object of any of the following classes: [`PTCell`], +#' [`PTTrack`] or [`PTPattern`]. +#' @returns Returns a single character string when `x` is of class +#' [`PTCell`]. #' -#' Returns a \code{vector} of length 64 of the type \code{character} when \code{x} is of class -#' \code{\link{PTTrack}}. +#' Returns a `vector` of length 64 of the type `character` when `x` is of class +#' [`PTTrack`]. #' -#' Returns a 64 by 4 \code{matrix} of the type \code{character} when \code{x} is of class -#' \code{\link{PTPattern}}. +#' Returns a 64 by 4 `matrix` of the type `character` when `x` is of class +#' [`PTPattern`]. #' @examples #' data("mod.intro") #' @@ -248,20 +248,20 @@ setMethod("as.character", "PTCell", function(x){ #' Print ProTrackR objects #' -#' A method to print \code{\link[=ProTrackR-package]{ProTrackR}} S4 class objects. +#' A method to print [ProTrackR][ProTrackR-package] S4 class objects. #' #' @docType methods #' @rdname print #' @name print #' @aliases print,PTCell-method #' -#' @param x Either a \code{\link{PTModule}}, \code{\link{PTPattern}}, -#' \code{\link{PTTrack}}, \code{\link{PTCell}} or -#' \code{\link{PTSample}} object. +#' @param x Either a [`PTModule`], [`PTPattern`], +#' [`PTTrack`], [`PTCell`] or +#' [`PTSample`] object. #' @param ... further arguments passed to or from other methods -#' @returns Depending on the class of \code{x}, returns either nothing -#' (\code{NULL}) or a \code{character} representation -#' of object \code{x}. +#' @returns Depending on the class of `x`, returns either nothing +#' (`NULL`) or a `character` representation +#' of object `x`. #' #' @examples #' data("mod.intro") @@ -290,11 +290,11 @@ setGeneric("effect<-", function(x, value) standardGeneric("effect<-")) #' Extract or replace effect/trigger codes #' -#' The 3 right-hand symbols of a \code{character} representation of a -#' \code{\link{PTCell}} represent an effect or trigger code. This method +#' The 3 right-hand symbols of a `character` representation of a +#' [`PTCell`] represent an effect or trigger code. This method #' can be used to extract or replace this code. #' -#' When a \code{\link{PTCell}} is represented by a \code{character} string, +#' When a [`PTCell`] is represented by a `character` string, #' the last three symbols represent a hexadecimal effect or trigger code. #' In general the first of the three symbols indicates a type of effect or #' trigger, whereas the latter two generally indicate a magnitude or a @@ -303,22 +303,22 @@ setGeneric("effect<-", function(x, value) standardGeneric("effect<-")) #' Effects can for instance be volume or frequency slides. The codes can #' also affect the module tempo or cause position jumps. #' -#' When replacing this code, all three digit hexadecimal \code{character} +#' When replacing this code, all three digit hexadecimal `character` #' strings are accepted, although not all codes will represent a valid #' effect or trigger. See -#' \url{http://coppershade.org/articles/More!/Topics/Protracker_Effect_Commands/} +#' #' for a valid list of effect codes. #' @rdname effect #' @name effect #' @aliases effect,PTCell-method -#' @param x A \code{PTCell} from which the effect code needs to be extracted. -#' @param value A \code{character} string containing a three hexadecimal digit +#' @param x A `PTCell` from which the effect code needs to be extracted. +#' @param value A `character` string containing a three hexadecimal digit #' effect code. All hexadecimal codes are accepted, not all will produce #' meaningful effects. -#' @returns For \code{effect}, a \code{character} string with the three hexadecimal +#' @returns For `effect`, a `character` string with the three hexadecimal #' digit effect code will be returned. #' -#' For \code{effect<-}, a copy of object \code{x} with effect code \code{value} +#' For `effect<-`, a copy of object `x` with effect code `value` #' will be returned. #' @examples #' data("mod.intro") @@ -363,26 +363,26 @@ setGeneric("sampleNumber<-", function(x, value) standardGeneric("sampleNumber<-" #' Extract or replace a sample number #' -#' Extract or replace a \code{\link{PTSample}} index number from a -#' \code{\link{PTCell}} object. +#' Extract or replace a [`PTSample`] index number from a +#' [`PTCell`] object. #' -#' The \code{\link{PTSample}} index number in a \code{\link{PTCell}} object, -#' indicates which sample from a \code{\link{PTModule}} object needs to be played. +#' The [`PTSample`] index number in a [`PTCell`] object, +#' indicates which sample from a [`PTModule`] object needs to be played. #' This method can be used to extract or replace this index from a -#' \code{\link{PTCell}} object. +#' [`PTCell`] object. #' @rdname sampleNumber #' @name sampleNumber #' @aliases sampleNumber,PTCell-method -#' @param x A \code{PTCell} object from which the \code{\link{PTSample}} index +#' @param x A `PTCell` object from which the [`PTSample`] index #' number needs to be be extracted or replaced. -#' @param value A \code{numeric} replacement value for the index. Valid indices +#' @param value A `numeric` replacement value for the index. Valid indices #' range from 1 up to 31. A value of 0 can also be assigned, but will not play #' any sample. -#' @returns For \code{sampleNumber}, a \code{numeric} value representing the -#' sample index number of object \code{x} is returned. +#' @returns For `sampleNumber`, a `numeric` value representing the +#' sample index number of object `x` is returned. #' -#' For \code{sampleNumber<-}, an copy of object \code{x} is returned in which -#' the sample index number is replaced with \code{value}. +#' For `sampleNumber<-`, an copy of object `x` is returned in which +#' the sample index number is replaced with `value`. #' @examples #' data("mod.intro") #' @@ -422,34 +422,34 @@ setGeneric("octave<-", function(x, value) standardGeneric("octave<-")) #' Extract or replace an octave #' #' Obtain an octave number from a period value or extract or replace a -#' note of a \code{\link{PTCell}} object. +#' note of a [`PTCell`] object. #' #' Period values are used by ProTracker to set a playback sample rate #' and in essence determine the key and octave in which a sound is played. #' This method can be used to obtain the octave number associated with a -#' period value (according to the ProTracker \code{\link{period_table}}, -#' assuming zero \code{\link{fineTune}}). If the period value is not in the -#' \code{\link{period_table}}, the octave number associated with the +#' period value (according to the ProTracker [`period_table`], +#' assuming zero [`fineTune`]). If the period value is not in the +#' [`period_table`], the octave number associated with the #' period closest to this value in the table is returned. #' #' The octave number can also be obtained or replaced for a -#' \code{\link{PTCell}} object. +#' [`PTCell`] object. #' @rdname octave #' @name octave #' @aliases octave,numeric-method -#' @param x Either a (\code{vector} of) numeric value(s), representing a period -#' value. It can also be a \code{\link{PTCell}} object. -#' @param value A \code{numeric} value representing the octave number with which -#' that of object \code{x} needs to be replaced. 0, 1 and 3 are valid octave -#' numbers. Use zero to disable both the note and octave for object \code{x}. +#' @param x Either a (`vector` of) numeric value(s), representing a period +#' value. It can also be a [`PTCell`] object. +#' @param value A `numeric` value representing the octave number with which +#' that of object `x` needs to be replaced. 0, 1 and 3 are valid octave +#' numbers. Use zero to disable both the note and octave for object `x`. #' -#' Note that the octave can only be set for \code{\link{PTCell}}s for which +#' Note that the octave can only be set for [`PTCell`]s for which #' a note is already defined. -#' @returns For \code{octave}, a \code{numeric} value representing the octave number +#' @returns For `octave`, a `numeric` value representing the octave number #' is returned. #' -#' For \code{octave<-}, a copy of \code{PTCell} object \code{x} in which the -#' octave number is replaced by \code{value} is returned. +#' For `octave<-`, a copy of `PTCell` object `x` in which the +#' octave number is replaced by `value` is returned. #' @examples #' data("mod.intro") #' @@ -522,39 +522,39 @@ setGeneric("note<-", function(x, value = c("C-", "C#", "D-", #' Extract or replace a note #' #' Obtain a note from a period value or extract or replace a note of a -#' \code{\link{PTCell}} object. +#' [`PTCell`] object. #' #' Period values are used by ProTracker to set a playback sample rate and in #' essence determine the key in which a sound is played. This method can be used #' to obtain the note (key) associated with a period value (according to the -#' ProTracker \code{\link{period_table}}, assuming zero \code{\link{fineTune}}). -#' If the period value is not in the \code{\link{period_table}}, the note associated +#' ProTracker [`period_table`], assuming zero [`fineTune`]). +#' If the period value is not in the [`period_table`], the note associated #' with the period closest to this value in the table is returned. #' -#' The note can also be obtained or replaced for a \code{\link{PTCell}} object. +#' The note can also be obtained or replaced for a [`PTCell`] object. #' @rdname note #' @name note #' @aliases note,numeric-method -#' @param x Either a (\code{vector} of) numeric value(s), representing a period -#' value. It can also be a \code{\link{PTCell}} object. -#' @param value A \code{character} string representing the chromatic scale note +#' @param x Either a (`vector` of) numeric value(s), representing a period +#' value. It can also be a [`PTCell`] object. +#' @param value A `character` string representing the chromatic scale note #' with wich the current note needs to be replaced. Should have any of the folling values: -#' "\code{C-}", "\code{C#}", "\code{D-}", "\code{D#}", "\code{E-}", "\code{F-}", -#' "\code{F#}", "\code{G-}", "\code{G#}", "\code{A-}", "\code{A#}", "\code{B-}", -#' or "\code{--}". +#' `"C-"`, `"C#"`, `"D-"`, `"D#"`, `"E-"`, `"F-"`, +#' `"F#"`, `"G-"`, `"G#"`, `"A-"`, `"A#"`, `"B-"`, +#' or `"--"`. #' Right-hand dashes can be omitted from these strings. Both upper and lower case are #' accepted. #' -#' If an \code{\link{octave}} is not yet specified for \code{PTCell} \code{x}, +#' If an [`octave`] is not yet specified for `PTCell` `x`, #' it will be set to 1. #' -#' Assigning a value of "\code{--}" will remove both the note and octave from -#' object \code{x}. -#' @returns For \code{note}, a \code{character} string representing the note +#' Assigning a value of `"--"` will remove both the note and octave from +#' object `x`. +#' @returns For `note`, a `character` string representing the note #' is returned. #' -#' For \code{note<-}, a copy of \code{PTCell} object \code{x} in which the -#' note is replaced by \code{value} is returned. +#' For `note<-`, a copy of `PTCell` object `x` in which the +#' note is replaced by `value` is returned. #' @examples #' data("mod.intro") #' @@ -624,22 +624,22 @@ setGeneric("noteUp", function(x, sample.nr = "all") standardGeneric("noteUp")) #' Raise or lower notes and octaves #' -#' Methods to raise or lower notes in \code{\link{PTCell}}, -#' \code{\link{PTTrack}} and \code{\link{PTPattern}} objects. +#' Methods to raise or lower notes in [`PTCell`], +#' [`PTTrack`] and [`PTPattern`] objects. #' #' @rdname noteManipulation #' @name noteUp #' @aliases noteUp,PTCell-method -#' @param x A \code{\link{PTCell}}, \code{\link{PTTrack}} or -#' \code{\link{PTPattern}} object for which the notes need to be lowered +#' @param x A [`PTCell`], [`PTTrack`] or +#' [`PTPattern`] object for which the notes need to be lowered #' or raised. -#' @param sample.nr A single positive \code{integer} value, or a \code{vector} of -#' positive \code{integer}s, listing the indices of samples, for which the notes -#' need to be lowered or raised. A \code{character} string equal to "\code{all}" +#' @param sample.nr A single positive `integer` value, or a `vector` of +#' positive `integer`s, listing the indices of samples, for which the notes +#' need to be lowered or raised. A `character` string equal to `"all`" #' is also allowed (this is in fact the default), in which case notes of all #' sample indices are raised or lowered. -#' @returns Returns an object of the same class as object \code{x}, in which -#' the notes for samples selected with \code{sample.nr} are raised or lowered. +#' @returns Returns an object of the same class as object `x`, in which +#' the notes for samples selected with `sample.nr` are raised or lowered. #' #' In case raised or lowered notes would lead to notes that are out of #' ProTracker's range, the returned notes remain unchanged. diff --git a/R/03PTTrack.r b/R/03PTTrack.r index eb232cc..a1a13b0 100644 --- a/R/03PTTrack.r +++ b/R/03PTTrack.r @@ -27,27 +27,27 @@ validity.PTTrack <- function(object) #' The PTTrack class #' #' The four audio channels of the Commodore Amiga are represented as tracks -#' (the \code{PTTrack} class) in a \code{\link{PTPattern}}. +#' (the `PTTrack` class) in a [`PTPattern`]. #' #' The Commodore Amiga original chipset supported four audio channels. Meaning #' that audio could be played simultaneously and independently on each of these #' channels. Two channels (2 and 3) were hardware-mixed fully to the right stereo #' outputs and the other two (1 and 4) fully to the left stereo outputs. #' -#' This class represents such a single channel, reffered to as a track. A \code{\link{PTPattern}} is +#' This class represents such a single channel, reffered to as a track. A [`PTPattern`] is #' composed of four such channels. As a ProTracker pattern consists of 64 rows, -#' a \code{PTTrack} object is also (implicitly) composed of 64 -#' \code{\link{PTCell}} objects. +#' a `PTTrack` object is also (implicitly) composed of 64 +#' [`PTCell`] objects. #' -#' Use the \code{\link{PTTrack-method}} to construct or coerce objects to a -#' \code{PTTrack-class} object, or to replace such an object. +#' Use the [`PTTrack-method`] to construct or coerce objects to a +#' `PTTrack-class` object, or to replace such an object. #' -#' @slot data A \code{matrix} (64 rows, 4 columns) of class "\code{raw}". -#' Each row implicetely represents a \code{\link{PTCell}} object, where -#' the raw data is formatted as specified at the \code{\link{PTCell-class}} -#' documentation. Use the \code{\link{PTCell-method}} to make an element of -#' a \code{PTTrack} object explictly of class \code{\link{PTCell}}. -#' Row numbers correspond with the row numbers of \code{\link{PTPattern}} +#' @slot data A `matrix` (64 rows, 4 columns) of class `raw`. +#' Each row implicetely represents a [`PTCell`] object, where +#' the raw data is formatted as specified at the [`PTCell-class`] +#' documentation. Use the [`PTCell-method`] to make an element of +#' a `PTTrack` object explictly of class [`PTCell`]. +#' Row numbers correspond with the row numbers of [`PTPattern`] #' objects. #' @name PTTrack-class #' @rdname PTTrack-class diff --git a/R/04PTPattern.r b/R/04PTPattern.r index 241799a..83f3009 100644 --- a/R/04PTPattern.r +++ b/R/04PTPattern.r @@ -28,11 +28,11 @@ validity.PTPattern <- function(object) #' The PTPattern class #' -#' The \code{PTPattern} (or simply pattern) is a table that determines which +#' The `PTPattern` (or simply pattern) is a table that determines which #' samples are played at which notes in which octave, in which order and with #' which effects. #' -#' When a \code{PTPattern} table (or simply pattern) is played, each of the 64 +#' When a `PTPattern` table (or simply pattern) is played, each of the 64 #' rows (see the green mark in the illustration below for an example of a row) #' are played subsequently at a specified speed/tempo. #' @@ -43,25 +43,25 @@ validity.PTPattern <- function(object) #' \if{latex}{\figure{patterntable.pdf}{options: width=6in}} #' #' The table has four columns (see the purple outline in the illustration -#' above as an example of a column), representing the four audio channels (\code{\link{PTTrack}}) +#' above as an example of a column), representing the four audio channels ([`PTTrack`]) #' of the Commodore Amiga. Samples listed in the same row at different #' tracks will be played simultaneously. #' -#' An element at a specific row and track will be referred to as a \code{\link{PTCell}} +#' An element at a specific row and track will be referred to as a [`PTCell`] #' (or simply cell). The cell determines which sample needs to be played at -#' which note and octave and what kind of \code{\link{effect}} or trigger should +#' which note and octave and what kind of [`effect`] or trigger should #' be applied. #' -#' With the \code{\link{PTPattern-method}}, objects can be coerced to a pattern +#' With the [`PTPattern-method`], objects can be coerced to a pattern #' table. This method can also be used to extract or replace patterns in -#' \code{\link{PTModule}} objects. +#' [`PTModule`] objects. #' -#' @slot data A \code{matrix} (64 rows, 16 columns) of class "\code{raw}". -#' Each row contains the \code{raw} concatenated data of 4 \code{\link{PTCell}} objects, -#' representing each of the 4 audio channels/tracks (as each \code{\link{PTCell}} object holds -#' 4 \code{raw} values, each row holds 4 x 4 = 16 \code{raw} -#' values). The \code{raw} data is formatted conform the specifications given -#' in the \code{\link{PTCell}} documentation. +#' @slot data A `matrix` (64 rows, 16 columns) of class `raw`. +#' Each row contains the `raw` concatenated data of 4 [`PTCell`] objects, +#' representing each of the 4 audio channels/tracks (as each [`PTCell`] object holds +#' 4 `raw` values, each row holds 4 x 4 = 16 `raw` +#' values). The `raw` data is formatted conform the specifications given +#' in the [`PTCell`] documentation. #' @name PTPattern-class #' @rdname PTPattern-class #' @aliases PTPattern diff --git a/R/05PTSample.r b/R/05PTSample.r index 5635a82..d37617d 100644 --- a/R/05PTSample.r +++ b/R/05PTSample.r @@ -26,83 +26,83 @@ validity.PTSample <- function(object) #' The PTSample class #' #' This class holds audio fragments with meta-information, to be used in -#' \code{\link{PTModule}} objects. +#' [`PTModule`] objects. #' #' This class holds audio fragments with meta-information (so-called samples), -#' to be used in \code{\link{PTModule}} objects. This class extends -#' the \code{\link[tuneR]{Wave}} class from \code{\link[tuneR]{tuneR}}. It therewith inherits -#' all properties and cool methods available from the \code{\link[tuneR]{tuneR}} package. -#' This allows you, for instance, to generate power spectra (\code{\link[tuneR]{powspec}}) -#' of them. You can also plot the waveform with the \code{\link[tuneR]{plot-Wave}} method. -#' See \code{\link[tuneR]{tuneR}} for all possibilities with \code{\link[tuneR]{Wave}} +#' to be used in [`PTModule`] objects. This class extends +#' the [`tuneR::Wave`] class from [`tuneR::tuneR`]. It therewith inherits +#' all properties and cool methods available from the [`tuneR::tuneR`] package. +#' This allows you, for instance, to generate power spectra ([`tuneR::powspec`]) +#' of them. You can also plot the waveform with the [`plot-Wave`][tuneR::plot_Wave_channel] method. +#' See [`tuneR::tuneR`] for all possibilities with [`tuneR::Wave`] #' objects. -#' If you want you can also explicitly coerce \code{\link{PTSample}} to -#' \code{\link[tuneR]{Wave}} objects like this: \code{as(new("PTSample"), "Wave")}. +#' If you want you can also explicitly coerce [`PTSample`] to +#' [`tuneR::Wave`] objects like this: `as(new("PTSample"), "Wave")`. #' -#' The \code{\link{PTSample}} class has some slots that are additional to the -#' \code{\link[tuneR]{Wave}} class, as ProTracker requires additional information on +#' The [`PTSample`] class has some slots that are additional to the +#' [`tuneR::Wave`] class, as ProTracker requires additional information on #' the sample with respect to its name, fine tune, volume and loop positions. -#' The \code{\link{PTSample}} class restricts the enherited \code{\link[tuneR]{Wave}} +#' The [`PTSample`] class restricts the enherited [`tuneR::Wave`] #' class such that it will only hold 8 bit, mono, pcm waves with a maximum of -#' \code{2*0xffff = 131070} samples, as per ProTracker standards. The length should +#' `2*0xffff = 131070` samples, as per ProTracker standards. The length should #' always be even. #' -#' \code{PTSample}s can be imported and exported using the -#' \code{\link{read.sample}} ans \code{\link{write.sample}} methods respectively. -#' \code{\link[tuneR]{Wave}} objects and \code{raw} data can be coerced to -#' \code{PTSample}s with the \code{\link{PTSample-method}}. -#' -#' @slot name A \code{vector} of length 22 of class "\code{raw}", representing -#' the name of the \code{PTSample}. It is often used to include -#' descriptive information in a \code{\link{PTModule}}. The name -#' of a sample can be extracted or replaced with the \code{\link{name}} method. -#' @slot finetune Single value of class "\code{raw}". The \code{\link{loNybble}} -#' of the \code{raw} value, represents the sample fine tune value ranging from -8 up to +#' `PTSample`s can be imported and exported using the +#' [`read.sample`] and [`write.sample`] methods respectively. +#' [`tuneR::Wave`] objects and `raw` data can be coerced to +#' `PTSample`s with the [`PTSample-method`]. +#' +#' @slot name A `vector` of length 22 of class `raw`, representing +#' the name of the `PTSample`. It is often used to include +#' descriptive information in a [`PTModule`]. The name +#' of a sample can be extracted or replaced with the [`name`] method. +#' @slot finetune Single value of class `raw`. The [`loNybble`] +#' of the `raw` value, represents the sample fine tune value ranging from -8 up to #' 7. This value is used to tweak the playback sample rate, in order to tune it. #' Negative values will lower the sample rate of notes, positive values will #' increase the sample rate of notes. Period values corresponding to specific -#' notes and fine tune values are stored in the \code{\link{period_table}}. -#' The fine tune value can be extracted or replace with the \code{\link{fineTune}} +#' notes and fine tune values are stored in the [`period_table`]. +#' The fine tune value can be extracted or replace with the [`fineTune`] #' method. -#' @slot volume Single value of class "\code{raw}". The raw data corresponds with +#' @slot volume Single value of class `raw`. The raw data corresponds with #' the default playback volume of the sample. It ranges from 0 (silent) up to #' 64 (maximum volume). The volume value can be extracted or replaced with the -#' \code{\link{volume}} method. -#' @slot wloopstart A \code{vector} of length 2 of class "\code{raw}". The \code{raw} +#' [`volume`] method. +#' @slot wloopstart A `vector` of length 2 of class `raw`. The `raw` #' data represent a single unsigned number representing the starting position of -#' a loop in the sample. It should have a value of \code{0} when there is no loop. -#' Its value could range from \code{0} up to \code{0xffff}. To get the actual position +#' a loop in the sample. It should have a value of `0` when there is no loop. +#' Its value could range from `0` up to `0xffff`. To get the actual position #' in bytes the value needs to be multiplied with 2 and can therefore only be #' can only be even. The sum of the loop start position and the loop length should -#' not exceed the \code{\link{sampleLength}}. Its value can be extracted or -#' replaced with the \code{\link{loopStart}} method. -#' @slot wlooplen A \code{vector} of length 2 of class "\code{raw}". The \code{raw} +#' not exceed the [`sampleLength`]. Its value can be extracted or +#' replaced with the [`loopStart`] method. +#' @slot wlooplen A `vector` of length 2 of class `raw`. The `raw` #' data represent a single unsigned number representing the length of #' a loop in the sample. To get the actual length in bytes, this value needs to #' be multiplied by 2 and can therefore only be even. It should have a value of -#' \code{2} when there is no loop. -#' Its value could range from \code{2} up to \code{2*0xffff} (= \code{131070}) and -#' can only be even (it can be \code{0} when the sample is empty). The sum of the +#' `2` when there is no loop. +#' Its value could range from `2` up to `2*0xffff` (= `131070`) and +#' can only be even (it can be `0` when the sample is empty). The sum of the #' loop start position and the loop length should -#' not exceed the \code{\link{sampleLength}}. Its value can be extracted or -#' replaced with the \code{\link{loopLength}} method. -#' @slot left Object of class "\code{numeric}" representing the waveform of the -#' left channel. Should be \code{integer} values ranging from 0 up to 255. -#' It can be extracted or replaced with the \code{\link{waveform}} method. -#' @slot right Object of class "\code{numeric}" representing the right channel. -#' This slot is inherited from the \code{\link[tuneR]{Wave}} class and should be -#' \code{numeric(0)} for all \code{PTSample}s, as they are all mono. -#' @slot stereo Object of class "\code{logical}" whether this is a stereo representation. -#' This slot is inherited from the \code{\link[tuneR]{Wave}} class. As -#' \code{PTSample}s are always mono, this slot should have the value \code{FALSE}. -#' @slot samp.rate Object of class "\code{numeric}" representing the sampling rate. -#' @slot bit Object of class "\code{numeric}" representing the bit-wise quality. -#' This slot is inherited from the \code{\link[tuneR]{Wave}} class. As -#' \code{PTSample}s are always of 8 bit quality, the value of this slot +#' not exceed the [`sampleLength`]. Its value can be extracted or +#' replaced with the [`loopLength`] method. +#' @slot left Object of class `numeric` representing the waveform of the +#' left channel. Should be `integer` values ranging from 0 up to 255. +#' It can be extracted or replaced with the [`waveform`] method. +#' @slot right Object of class `numeric` representing the right channel. +#' This slot is inherited from the [`tuneR::Wave`] class and should be +#' `numeric(0)` for all `PTSample`s, as they are all mono. +#' @slot stereo Object of class `logical` whether this is a stereo representation. +#' This slot is inherited from the [`tuneR::Wave`] class. As +#' `PTSample`s are always mono, this slot should have the value `FALSE`. +#' @slot samp.rate Object of class `numeric` representing the sampling rate. +#' @slot bit Object of class `numeric` representing the bit-wise quality. +#' This slot is inherited from the [`tuneR::Wave`] class. As +#' `PTSample`s are always of 8 bit quality, the value of this slot #' should always be 8. -#' @slot pcm Object of class "\code{logical}" indicating whether wave format is PCM. -#' This slot is inherited from the \code{\link[tuneR]{Wave}} class, for -#' \code{PTSample}s its value should always be \code{TRUE}. +#' @slot pcm Object of class `logical` indicating whether wave format is PCM. +#' This slot is inherited from the [`tuneR::Wave`] class, for +#' `PTSample`s its value should always be `TRUE`. #' #' @name PTSample-class #' @rdname PTSample-class @@ -129,23 +129,23 @@ setClass("PTSample", #' Resample data #' -#' Resample \code{numeric} data to a different rate. +#' Resample `numeric` data to a different rate. #' -#' This function resamples \code{numeric} data (i.e., audio data) from a +#' This function resamples `numeric` data (i.e., audio data) from a #' source sample rate to a target sample rate. At the core it uses -#' the \code{\link[stats]{approx}} function. +#' the [`stats::approx`] function. #' @rdname resample #' @name resample -#' @param x A \code{numeric} \code{vector} that needs to be resampled. -#' @param source.rate The rate at which \code{x} was sampled in Hz (or -#' another unit, as long as it is in the same unit as \code{target.rate}). +#' @param x A `numeric` `vector` that needs to be resampled. +#' @param source.rate The rate at which `x` was sampled in Hz (or +#' another unit, as long as it is in the same unit as `target.rate`). #' @param target.rate The desired target sampling rate in Hz (or -#' another unit, as long as it is in the same unit as \code{source.rate}). -#' @param ... Arguments passed on to \code{\link[stats]{approx}}. +#' another unit, as long as it is in the same unit as `source.rate`). +#' @param ... Arguments passed on to [`stats::approx`]. #' To simulate the Commodore Amiga hardware, it's best to -#' use '\code{method = "constant"} for resampling 8 bit samples. -#' @returns Returns a resampled \code{numeric} \code{vector} of length -#' \code{round(length(x) * target.rate / source.rate)} based on \code{x}. +#' use '`method = "constant"` for resampling 8 bit samples. +#' @returns Returns a resampled `numeric` `vector` of length +#' `round(length(x) * target.rate / source.rate)` based on `x`. #' @examples #' some.data <- 1:100 #' @@ -171,26 +171,26 @@ setGeneric("fineTune<-", def = function(sample, value) standardGeneric("fineTune #' Fine tune a PTSample #' -#' Extract or replace the fine tune value of a \code{\link{PTSample}}. +#' Extract or replace the fine tune value of a [`PTSample`]. #' -#' \code{\link{PTSample}}s can be tuned with their fine tune values. +#' [`PTSample`]s can be tuned with their fine tune values. #' The values range from -8 up to 7 and affect the playback sample rate of -#' specific notes (see \code{\link{period_table}}). This method can be used +#' specific notes (see [`period_table`]). This method can be used #' to extract this value, or to safely replace it. #' #' @docType methods #' @rdname fineTune #' @name fineTune #' @aliases fineTune,PTSample-method -#' @param sample A \code{\link{PTSample}} for which the fine tune value +#' @param sample A [`PTSample`] for which the fine tune value #' needs to be extracted or replace. -#' @param value A \code{numeric} value ranging from -8 up to 7, representing +#' @param value A `numeric` value ranging from -8 up to 7, representing #' the fine tune. -#' @returns For \code{fineTune} the fine tune value, represented by an -#' \code{integer} value ranging from -8 up to 7, is returned. +#' @returns For `fineTune` the fine tune value, represented by an +#' `integer` value ranging from -8 up to 7, is returned. #' -#' For \code{fineTune<-} A \code{\link{PTSample}} \code{sample}, updated -#' with the fine tune \code{value}, is returned. +#' For `fineTune<-` A [`PTSample`] `sample`, updated +#' with the fine tune `value`, is returned. #' @examples #' data("mod.intro") #' @@ -224,25 +224,25 @@ setGeneric("volume<-", function(sample, value) standardGeneric("volume<-")) #' Default playback volume of PTSample #' -#' Extract or replace the default volume of a \code{\link{PTSample}}. +#' Extract or replace the default volume of a [`PTSample`]. #' -#' \code{\link{PTSample}}s have a default playback volume, ranging from -#' \code{0} (silent) up to 64 (maximum volume). This method can be used +#' [`PTSample`]s have a default playback volume, ranging from +#' `0` (silent) up to 64 (maximum volume). This method can be used #' to extract this value, or to safely replace it. #' #' @docType methods #' @rdname volume #' @name volume #' @aliases volume,PTSample-method -#' @param sample A \code{\link{PTSample}} for which the default volume +#' @param sample A [`PTSample`] for which the default volume #' needs to be extracted or replace. -#' @param value A \code{numeric} value ranging from 0 up to 64, representing +#' @param value A `numeric` value ranging from 0 up to 64, representing #' the volume level. -#' @returns For \code{volume} the volume value, represented by an -#' \code{integer} value ranging from 0 up to 64, is returned. +#' @returns For `volume` the volume value, represented by an +#' `integer` value ranging from 0 up to 64, is returned. #' -#' For \code{volume<-} A \code{\link{PTSample}} \code{sample}, updated -#' with the volume \code{value}, is returned. +#' For `volume<-` A [`PTSample`] `sample`, updated +#' with the volume `value`, is returned. #' @examples #' data("mod.intro") #' @@ -278,30 +278,30 @@ setGeneric("loopStart<-", function(sample, value) standardGeneric("loopStart<-") #' The loop start position of a PTSample #' -#' Extract or replace the loop start position of a \code{\link{PTSample}}. +#' Extract or replace the loop start position of a [`PTSample`]. #' -#' \code{\link{PTSample}}s can have loops, marked by a starting position +#' [`PTSample`]s can have loops, marked by a starting position #' and length of the loop (in samples), for more details see the -#' \code{\link{PTSample-class}}. This method can be used to extract +#' [`PTSample-class`]. This method can be used to extract #' the loop starting position or safely replace its value. #' #' @docType methods #' @rdname loopStart #' @name loopStart #' @aliases loopStart,PTSample-method -#' @param sample A \code{\link{PTSample}} for which the loop start position +#' @param sample A [`PTSample`] for which the loop start position #' needs to be extracted or replace. -#' @param value An even \code{numeric} value giving the loop starting position in -#' samples ranging from 0 up to 131070. The sum of the \code{\link{loopStart}} and -#' \code{\link{loopLength}} should not exceed the \code{\link{sampleLength}}. +#' @param value An even `numeric` value giving the loop starting position in +#' samples ranging from 0 up to 131070. The sum of the [`loopStart`] and +#' [`loopLength`] should not exceed the [`sampleLength`]. #' -#' Use a \code{value} of either \code{character} "\code{off}" or \code{logical} -#' "\code{FALSE}", in order to turn off the loop all together. -#' @returns For \code{loopStart} the loop start position (in samples), represented by -#' an even \code{integer} value ranging from 0 up to 131070, is returned. +#' Use a `value` of either `character` `"off"` or `logical` +#' `FALSE`, in order to turn off the loop all together. +#' @returns For `loopStart` the loop start position (in samples), represented by +#' an even `integer` value ranging from 0 up to 131070, is returned. #' -#' For \code{loopStart<-} A \code{\link{PTSample}} \code{sample}, updated -#' with the loop start position `\code{value}', is returned. +#' For `loopStart<-` A [`PTSample`] `sample`, updated +#' with the loop start position ``value`', is returned. #' @examples #' data("mod.intro") #' @@ -352,31 +352,31 @@ setGeneric("loopLength<-", function(sample, value) standardGeneric("loopLength<- #' The loop length of a PTSample #' -#' Extract or replace the loop length of a \code{\link{PTSample}}. +#' Extract or replace the loop length of a [`PTSample`]. #' -#' \code{\link{PTSample}}s can have loops, marked by a starting position +#' [`PTSample`]s can have loops, marked by a starting position #' and length of the loop (in samples), for more details see the -#' \code{\link{PTSample-class}}. This method can be used to extract +#' [`PTSample-class`]. This method can be used to extract #' the loop length or safely replace its value. #' #' @docType methods #' @rdname loopLength #' @name loopLength #' @aliases loopLength,PTSample-method -#' @param sample A \code{\link{PTSample}} for which the loop length +#' @param sample A [`PTSample`] for which the loop length #' needs to be extracted or replace. -#' @param value An even \code{numeric} value giving the loop length in +#' @param value An even `numeric` value giving the loop length in #' samples ranging from 2 up to 131070 (It can be 0 when the sample is -#' empty). The sum of the \code{\link{loopStart}} and -#' \code{\link{loopLength}} should not exceed the \code{\link{sampleLength}}. +#' empty). The sum of the [`loopStart`] and +#' [`loopLength`] should not exceed the [`sampleLength`]. #' -#' Use a \code{value} of either \code{character} "\code{off}" or \code{logical} -#' "\code{FALSE}", in order to turn off the loop all together. -#' @returns For \code{loopLength} the loop length (in samples), represented by -#' an even \code{integer} value ranging from 0 up to 131070, is returned. +#' Use a `value` of either `character` `"off"` or `logical` +#' `FALSE`, in order to turn off the loop all together. +#' @returns For `loopLength` the loop length (in samples), represented by +#' an even `integer` value ranging from 0 up to 131070, is returned. #' -#' For \code{loopLength<-} A \code{\link{PTSample}} \code{sample}, updated -#' with the loop length `\code{value}', is returned. +#' For `loopLength<-` A [`PTSample`] `sample`, updated +#' with the loop length `value`, is returned. #' @examples #' data("mod.intro") #' @@ -453,44 +453,44 @@ setGeneric("playSample", function(x, silence = 0, wait = T, #' Play audio samples #' -#' Method to play \code{\link{PTSample}}s or all such samples from -#' \code{\link{PTModule}} objects as audio. +#' Method to play [`PTSample`]s or all such samples from +#' [`PTModule`] objects as audio. #' -#' This method plays \code{\link{PTSample}}s and such samples from -#' \code{\link{PTModule}} objects, using the \code{\link[audio]{play}} method -#' from the audio package. Default \code{\link{fineTune}} and \code{\link{volume}} -#' as specified for the \code{\link{PTSample}} will be applied when playing +#' This method plays [`PTSample`]s and such samples from +#' [`PTModule`] objects, using the [`audio::play`] method +#' from the audio package. Default [`fineTune`] and [`volume`] +#' as specified for the [`PTSample`] will be applied when playing #' the sample. #' @rdname playSample #' @name playSample #' @aliases playSample,PTSample-method -#' @param x Either a \code{\link{PTSample}} or a \code{\link{PTModule}} object. +#' @param x Either a [`PTSample`] or a [`PTModule`] object. #' In the latter case, all samples in the module will be played in order. -#' @param silence Especially for short samples, the \code{\link[audio]{play}} routine +#' @param silence Especially for short samples, the [`audio::play`] routine #' can be a bit buggy: playing audible noise, ticks or parts from other samples at the end of the sample. #' By adding silence after the sample, this problem is evaded. Use this argument -#' to specify the duration of this silence in seconds. When, \code{x} is a -#' \code{\link{PTModule}} object, the silence will also be inserted in +#' to specify the duration of this silence in seconds. When, `x` is a +#' [`PTModule`] object, the silence will also be inserted in #' between samples. -#' @param wait A \code{logical} value. When set to \code{TRUE} the playing +#' @param wait A `logical` value. When set to `TRUE` the playing #' routine will wait with executing any code until the playing is finished. -#' When set to \code{FALSE}, subsequent R code will be executed while playing. -#' @param note A \code{character} string specifying the note to be used for -#' calculating the playback sample rate (using \code{\link{noteToSampleRate}}). +#' When set to `FALSE`, subsequent R code will be executed while playing. +#' @param note A `character` string specifying the note to be used for +#' calculating the playback sample rate (using [`noteToSampleRate`]). #' It should start with the note (ranging from `A' up to `G') optionally followed #' by a hash sign (`#') if a note is sharp (or a dash (`-') if it's not) and finally #' the octave number (ranging from 1 up to 3). A valid notation would for instance -#' be `F#3'. -#' The \code{\link{fineTune}} as specified for the sample will also be used as -#' an argument for calculating the playback rate. A custom \code{finetune} -#' can also be passed as an argument to \code{\link{noteToSampleRate}}. -#' @param loop A positive \code{numeric} indicating the duration of a looped +#' be 'F#3'. +#' The [`fineTune`] as specified for the sample will also be used as +#' an argument for calculating the playback rate. A custom `finetune` +#' can also be passed as an argument to [`noteToSampleRate`]. +#' @param loop A positive `numeric` indicating the duration of a looped #' sample in seconds. A looped sample will be played at least once, even if -#' the specified duration is less than the sum of \code{\link{loopStart}} -#' position and the \code{\link{loopLength}}. -#' See \code{\link{loopStart}} and \code{\link{loopLength}} for details on how +#' the specified duration is less than the sum of [`loopStart`] +#' position and the [`loopLength`]. +#' See [`loopStart`] and [`loopLength`] for details on how #' to set (or disable) a loop. -#' @param ... Further arguments passed on to \code{\link{noteToSampleRate}}. +#' @param ... Further arguments passed on to [`noteToSampleRate`]. #' Can be used to change the video mode, or finetune argument for the call to that method. #' @returns Returns nothing but plays the sample(s) as audio. #' @examples @@ -560,30 +560,30 @@ setGeneric("read.sample", function(filename, what = c("wav", "mp3", "8svx", "raw #' Read an audio file and coerce to a PTSample object #' -#' Reads audio files from "wav" and "mp3" files, using \code{\link[tuneR]{tuneR}} +#' Reads audio files from "wav" and "mp3" files, using [`tuneR::tuneR`] #' methods. Commodore Amiga native formats "8svx" and "raw" can also be read. #' -#' This method provides a wrapper for the \code{\link[tuneR]{readWave}} and -#' \code{\link[tuneR]{readMP3}} methods from \code{\link[tuneR]{tuneR}}. It also +#' This method provides a wrapper for the [`tuneR::readWave`] and +#' [`tuneR::readMP3`] methods from [`tuneR::tuneR`]. It also #' provides the means to import audio from file formats native to the Commodore -#' Amiga. Simple \href{https://en.wikipedia.org/wiki/8SVX}{8svx} files (also known -#' as "iff" files) can be read. This uses the \code{\link[AmigaFFH]{read.iff}} method -#' from the \code{\link[AmigaFFH]{AmigaFFH}} package. +#' Amiga. Simple [8svx](https://en.wikipedia.org/wiki/8SVX) files (also known +#' as "iff" files) can be read. This uses the [`AmigaFFH::read.iff`] method +#' from the [`AmigaFFH::AmigaFFH`] package. #' It was also common practice to store audio samples as raw data on the #' Commodore Amiga, where each byte simply represented a signed integer value #' of the waveform. #' #' All audio will be coerced to 8 bit mono with a maximum length of -#' \code{2*0xffff} = {131070} bytes (= samples) as per ProTracker standards. +#' `2*0xffff` = `131070` bytes (= samples) as per ProTracker standards. #' @rdname read.sample #' @name read.sample #' @aliases read.sample,character-method -#' @param filename A \code{character} string representing the filename to be read. -#' @param what A \code{character} string indicating what type of file is to be -#' read. Can be one of the following: "\code{wav}" (default), "\code{mp3}", -#' "\code{8svx}" or "\code{raw}". The \code{AmigaFFH} package needs to be +#' @param filename A `character` string representing the filename to be read. +#' @param what A `character` string indicating what type of file is to be +#' read. Can be one of the following: `"wav"` (default), `"mp3"`, +#' `"8svx"` or `"raw"`. The `AmigaFFH` package needs to be #' installed in order to read 8svx files. -#' @returns Returns a \code{PTSample} object based on the file read. +#' @returns Returns a `PTSample` object based on the file read. #' @examples #' \dontrun{ #' data("mod.intro") @@ -597,7 +597,7 @@ setGeneric("read.sample", function(filename, what = c("wav", "mp3", "8svx", "raw #' } #' #' @note As per ProTracker standards, a sample should have an even length -#' (in bytes). If a sample file has an odd length, a \code{raw} \code{0x00} value +#' (in bytes). If a sample file has an odd length, a `raw` `0x00` value #' is added to the end. #' @family sample.operations #' @author Pepijn de Vries @@ -675,25 +675,25 @@ setGeneric("write.sample", function(sample, filename, what = c("wav", "8svx", "r #' Write a PTSample object to an audio file #' -#' Write a \code{PTSample} as a "wav", "8svx" or "raw" audio file. +#' Write a `PTSample` as a "wav", "8svx" or "raw" audio file. #' -#' This method provides a wrapper for the \code{\link[tuneR]{writeWave}} method -#' from \code{\link[tuneR]{tuneR}}. It also provides the means to export audio -#' to file formats native to the Commodore Amiga. \code{PTSample}s can be -#' exported as simple (uncompressed) \href{https://en.wikipedia.org/wiki/8SVX}{8svx} +#' This method provides a wrapper for the [`tuneR::writeWave`] method +#' from [`tuneR::tuneR`]. It also provides the means to export audio +#' to file formats native to the Commodore Amiga. `PTSample`s can be +#' exported as simple (uncompressed) [8svx](https://en.wikipedia.org/wiki/8SVX) #' files also known as "iff" files). In addition they can be exported as raw data, #' where each byte simply represents a signed integer value of the waveform. #' #' @rdname write.sample #' @name write.sample #' @aliases write.sample,PTSample,character-method -#' @param sample A \code{PTSample} object that needs to be exported to an audio +#' @param sample A `PTSample` object that needs to be exported to an audio #' file. -#' @param filename A \code{character} string representing the filename to which +#' @param filename A `character` string representing the filename to which #' the audio needs to be saved. -#' @param what A \code{character} string indicating what type of file is to be -#' exported. Can be one of the following: "\code{wav}" (default), -#' "\code{8svx}" or "\code{raw}". The \code{AmigaFFH} package needs to be +#' @param what A `character` string indicating what type of file is to be +#' exported. Can be one of the following: `"wav"` (default), +#' `"8svx"` or `"raw"`. The `AmigaFFH` package needs to be #' installed in order to write 8svx files. #' @returns Saves the audio to a file, but returns nothing. #' @examples @@ -745,33 +745,33 @@ setGeneric("name<-", function(x, value) standardGeneric("name<-")) #' Obtain or replace the name of a PTModule or PTSample #' -#' The name of both a \code{\link{PTModule}} and -#' \code{\link{PTSample}} are stored as \code{raw} data. -#' This method returns the name as a \code{character} string, or it can -#' be used to assign a new name to a \code{\link{PTModule}} or -#' \code{\link{PTSample}}. -#' -#' The name of a \code{\link{PTModule}} and -#' \code{\link{PTSample}} is stored as a \code{vector} of -#' \code{raw} data with a length of 20 or 22 respectively. This method -#' provides the means for getting the name as a \code{character} string -#' or to safely redefine the name of a \code{\link{PTModule}} or -#' \code{\link{PTSample}} object. To do so, -#' the provided name (\code{value}) is converted to a \code{raw} \code{vector} +#' The name of both a [`PTModule`] and +#' [`PTSample`] are stored as `raw` data. +#' This method returns the name as a `character` string, or it can +#' be used to assign a new name to a [`PTModule`] or +#' [`PTSample`]. +#' +#' The name of a [`PTModule`] and +#' [`PTSample`] is stored as a `vector` of +#' `raw` data with a length of 20 or 22 respectively. This method +#' provides the means for getting the name as a `character` string +#' or to safely redefine the name of a [`PTModule`] or +#' [`PTSample`] object. To do so, +#' the provided name (`value`) is converted to a `raw` `vector` #' of length 20 or 22 respectively. Long names may therefore get clipped. #' #' @docType methods #' @rdname name #' @name name #' @aliases name,PTSample-method -#' @param x A \code{\link{PTModule}} or a \code{\link{PTSample}} +#' @param x A [`PTModule`] or a [`PTSample`] #' object for which to obtain or replace the name. -#' @param value A \code{character} string which should be used to replace the -#' name of \code{\link{PTModule}} or \code{\link{PTSample}} \code{x}. -#' @returns For \code{name}, the name of the \code{\link{PTModule}} or -#' \code{\link{PTSample}} object as a \code{character} string is returned. +#' @param value A `character` string which should be used to replace the +#' name of [`PTModule`] or [`PTSample`] `x`. +#' @returns For `name`, the name of the [`PTModule`] or +#' [`PTSample`] object as a `character` string is returned. #' -#' For \code{name<-}, object \code{x} with an updated name is returned. +#' For `name<-`, object `x` with an updated name is returned. #' @examples #' data("mod.intro") #' @@ -819,17 +819,17 @@ setGeneric("sampleLength", function(sample) standardGeneric("sampleLength")) #' Get the length of a PTSample #' #' Gets the length (in samples = bytes) of an audio fragment stored as a -#' \code{\link{PTSample}}. +#' [`PTSample`]. #' -#' \code{\link{PTSample}}s are 8 bit mono audio fragments. This method +#' [`PTSample`]s are 8 bit mono audio fragments. This method #' returns the length of this fragment expressed as number of samples (which #' also equals the number of bytes). #' @rdname sampleLength #' @name sampleLength #' @aliases sampleLength,PTSample-method -#' @param sample A \code{PTSample} object for which the length needs to be returned. -#' @returns Returns a \code{numeric} value representing the number of samples -#' (bytes) the \code{PTSample} object \code{sample} is composed of. +#' @param sample A `PTSample` object for which the length needs to be returned. +#' @returns Returns a `numeric` value representing the number of samples +#' (bytes) the `PTSample` object `sample` is composed of. #' @examples #' data("mod.intro") #' @@ -848,54 +848,54 @@ setGeneric("waveform<-", function(sample, value) standardGeneric("waveform<-")) #' Extract or replace a PTSample waveform #' -#' Extract or replace the waveform of a \code{\link{PTSample}} object. The -#' waveform is represented by a \code{vector} of numeric values ranging from +#' Extract or replace the waveform of a [`PTSample`] object. The +#' waveform is represented by a `vector` of numeric values ranging from #' 0 up to 255. #' #' Sample waveforms are stored as 8 bit signed short integer values ranging #' from -128 up to +127 in original ProTracker files. However, as the -#' \code{\link{PTSample}} class extends the \code{\link[tuneR]{Wave}} class, +#' [`PTSample`] class extends the [`tuneR::Wave`] class, #' the waveforms are represented by integer values ranging from 0 up to 255 -#' in the \link[=ProTrackR-package]{ProTrackR} package. As per ProTracker specifications, +#' in the [ProTrackR][ProTrackR-package] package. As per ProTracker specifications, #' samples are of 8 bit mono quality and can only have an even length with -#' a maximum of \code{2*0xffff} = \code{131070}. This method can be used to +#' a maximum of `2*0xffff` = `131070`. This method can be used to #' extract a waveform or replace it. #' @rdname waveform #' @name waveform #' @aliases waveform,PTSample-method -#' @param sample A \code{\link{PTSample}} object from which the waveform needs to +#' @param sample A [`PTSample`] object from which the waveform needs to #' be extracted or replaced. -#' @param start.pos A \code{numeric} starting index, giving the starting -#' position for the waveform to be returned. Default value is \code{1}. This +#' @param start.pos A `numeric` starting index, giving the starting +#' position for the waveform to be returned. Default value is `1`. This #' index should be greater than zero. -#' @param stop.pos A \code{numeric} stopping index, giving the stopping +#' @param stop.pos A `numeric` stopping index, giving the stopping #' position for the waveform to be returned. Default value is -#' \code{sampleLength(sample)} This index should be greater than -#' \code{start.pos}. -#' @param loop A \code{logical} value indicating whether the waveform +#' `sampleLength(sample)` This index should be greater than +#' `start.pos`. +#' @param loop A `logical` value indicating whether the waveform #' should be modulated between the specified loop positions -#' (see \code{\link{loopStart}} and \code{\link{loopLength}}), -#' or the waveform should stop at the end of the sample (padded with \code{NA} +#' (see [`loopStart`] and [`loopLength`]), +#' or the waveform should stop at the end of the sample (padded with `NA` #' values beyond the sample length). Will do the first -#' when set to \code{TRUE} and the latter when set to \code{FALSE}. -#' @param value A \code{vector} of numeric values ranging from 0 up to 255, +#' when set to `TRUE` and the latter when set to `FALSE`. +#' @param value A `vector` of numeric values ranging from 0 up to 255, #' representing the waveform that should be used to replace that of object -#' \code{sample}. The length should be even and not exceed \code{2*0xffff} = -#' \code{131070}. \code{\link{loopStart}} and \code{\link{loopLength}} will +#' `sample`. The length should be even and not exceed `2*0xffff` = +#' `131070`. [`loopStart`] and [`loopLength`] will #' be adjusted automatically when they are out of range for the new waveform. #' -#' Use \code{NA} to generate an empty/blank \code{\link{PTSample}} object. -#' @returns For \code{waveform}, the waveform of \code{sample} is returned -#' as a \code{vector} of \code{numeric} values ranging from 0 up to 255. -#' If '\code{loop}' is set to \code{FALSE} -#' and the starting position is beyond the sample length, \code{NA} values -#' are returned. If '\code{loop}' is set to \code{TRUE} and the starting +#' Use `NA` to generate an empty/blank [`PTSample`] object. +#' @returns For `waveform`, the waveform of `sample` is returned +#' as a `vector` of `numeric` values ranging from 0 up to 255. +#' If `loop` is set to `FALSE` +#' and the starting position is beyond the sample length, `NA` values +#' are returned. If `loop` is set to `TRUE` and the starting #' position is beyond the sample loop (if present, see -#' \code{\link{loopState}}), the waveform is modulated between the loop +#' [`loopState`]), the waveform is modulated between the loop #' positions. #' -#' For \code{waveform<-}, a copy of object \code{sample} is returned in which -#' the waveform has been replaced with \code{value}. +#' For `waveform<-`, a copy of object `sample` is returned in which +#' the waveform has been replaced with `value`. #' @examples #' data("mod.intro") #' @@ -993,24 +993,24 @@ setGeneric("loopSample", function(sample, times, n_samples) standardGeneric("loo #' Looped waveform of a sample #' -#' Generate a looped \code{\link{waveform}} of a \code{\link{PTSample}} object. +#' Generate a looped [`waveform`] of a [`PTSample`] object. #' #' For playing routines, it can be useful to generate repeats of a sample loop. -#' This method returns the waveform of a \code{\link{PTSample}} where the -#' loop is repeated `\code{times}' times or has a length of `\code{n_samples}'. +#' This method returns the waveform of a [`PTSample`] where the +#' loop is repeated ``times`' times or has a length of ``n_samples`'. #' @rdname loopSample #' @name loopSample #' @aliases loopSample,PTSample-method -#' @param sample A \code{\link{PTSample}} object that needs to be looped. -#' @param times A positive \code{integer} value indicating the number of +#' @param sample A [`PTSample`] object that needs to be looped. +#' @param times A positive `integer` value indicating the number of #' times a sample loop should be repeated. This argument is ignored if -#' \code{n_samples} is specified. -#' @param n_samples A positive \code{integer} value indicating the desired length +#' `n_samples` is specified. +#' @param n_samples A positive `integer` value indicating the desired length #' of the looped waveform in number of samples. This argument overrules the -#' \code{times} argument. -#' @returns Returns a \code{\link{waveform}} represented by a \code{numeric} -#' \code{vector} of values ranging from 0 up to 255. Has a length of -#' \code{n_samples} when that argument is specified. +#' `times` argument. +#' @returns Returns a [`waveform`] represented by a `numeric` +#' `vector` of values ranging from 0 up to 255. Has a length of +#' `n_samples` when that argument is specified. #' @examples #' data("mod.intro") #' @@ -1043,20 +1043,20 @@ setGeneric("loopState", function(sample) standardGeneric("loopState")) #' Get PTSample loop state #' -#' Determines whether a loop is specified for a \code{\link{PTSample}} object. +#' Determines whether a loop is specified for a [`PTSample`] object. #' -#' The loop state is not explicitly stored in a \code{\link{PTSample}} object. -#' It can be derived from the \code{\link{loopStart}} position and -#' \code{\link{loopLength}}. This method is provided as a convenient method -#' to get the state. Use either \code{\link{loopStart}} or \code{\link{loopLength}} +#' The loop state is not explicitly stored in a [`PTSample`] object. +#' It can be derived from the [`loopStart`] position and +#' [`loopLength`]. This method is provided as a convenient method +#' to get the state. Use either [`loopStart`] or [`loopLength`] #' to change the state. #' @rdname loopState #' @name loopState #' @aliases loopState,PTSample-method -#' @param sample A \code{\link{PTSample}} object for which the loop state needs +#' @param sample A [`PTSample`] object for which the loop state needs #' to be determined. -#' @returns Returns a \code{logical} value indicating whether a loop is (\code{TRUE}) -#' or isn't (\code{FALSE}) specified for the \code{sample}. +#' @returns Returns a `logical` value indicating whether a loop is (`TRUE`) +#' or isn't (`FALSE`) specified for the `sample`. #' @examples #' data("mod.intro") #' diff --git a/R/06PTModule.r b/R/06PTModule.r index 21ac187..b3eb1b9 100644 --- a/R/06PTModule.r +++ b/R/06PTModule.r @@ -46,47 +46,47 @@ validity.PTModule <- function(object) #' This class is designed to hold all relevant information of a ProTracker #' module (MOD) for which ProTracker 2.3a documentation was used. The ProTrackR #' package may be compatible with earlier or later versions, but this was not -#' tested. Use \code{\link{read.module}} and \code{\link{write.module}} to import -#' and export objects of class \code{PTModule}. -#' -#' @slot name A \code{vector} of length 20 of class "\code{raw}", representing -#' the name of the \code{PTModule}. The name -#' of a module can be extracted or replaced with the \code{\link{name}} method. -#' @slot pattern.order A \code{vector} of length 128 of class "\code{raw}". The -#' \code{raw} values represent the indices of \code{PTPattern} tables and indicate -#' in which order these patterns need to be played. Note that the \code{raw} values +#' tested. Use [`read.module`] and [`write.module`] to import +#' and export objects of class `PTModule`. +#' +#' @slot name A `vector` of length 20 of class `raw`, representing +#' the name of the `PTModule`. The name +#' of a module can be extracted or replaced with the [`name`] method. +#' @slot pattern.order A `vector` of length 128 of class `raw`. The +#' `raw` values represent the indices of `PTPattern` tables and indicate +#' in which order these patterns need to be played. Note that the `raw` values #' are conform the indices used in ProTracker, starting at zero. In R, indices of #' objects start at one. Users need to compensate for this discrepancy theirselves. #' #' The pattern order table can be extracted or replaced with the -#' \code{\link{patternOrder}} method. -#' @slot pattern.order.length A single value of class "\code{raw}". Indicates +#' [`patternOrder`] method. +#' @slot pattern.order.length A single value of class `raw`. Indicates #' the length of the visible (and playable) part of the pattern order table. #' -#' Use the \code{\link{patternOrderLength}} method to extract or replace the length +#' Use the [`patternOrderLength`] method to extract or replace the length #' of a pattern order table of a module. -#' @slot tracker.byte A single "\code{raw}" value. Gives an indication of which +#' @slot tracker.byte A single `raw` value. Gives an indication of which #' Tracker was used to produce a module file. In ProTracker modules, this byte -#' is set to 0x7f, which is also used in \code{PTModule} objects. This value +#' is set to 0x7f, which is also used in `PTModule` objects. This value #' should not be changed. -#' @slot tracker.flag A \code{vector} of length 4 of class "\code{raw}", indicates +#' @slot tracker.flag A `vector` of length 4 of class `raw`, indicates #' the version of a module, which basically reflects how many patterns the module #' can hold. For details, and extracting and replacing this flag see the -#' \code{\link{trackerFlag}} method. -#' @slot samples List of length 31 of class "\code{\link{PTSample}}". -#' @slot patterns List of class "\code{\link{PTPattern}}" (the pattern tables). +#' [`trackerFlag`] method. +#' @slot samples List of length 31 of class "[`PTSample`]". +#' @slot patterns List of class "[`PTPattern`]" (the pattern tables). #' The list should have at least 1 element, and can have a maximum of 64 or -#' 100 elements (depending on the state of the \code{\link{trackerFlag}}). +#' 100 elements (depending on the state of the [`trackerFlag`]). #' #' @name PTModule-class #' @rdname PTModule-class #' @aliases PTModule #' @references -#' \url{https://en.wikipedia.org/wiki/MOD_(file_format)} +#' #' -#' \url{https://wiki.multimedia.cx/index.php?title=Protracker_Module} +#' #' -#' \url{http://coppershade.org/articles/More!/Topics/Protracker_File_Format/} +#' #' @examples #' ## create an empty PTModule class object: #' mod.empty <- new("PTModule") @@ -118,25 +118,25 @@ setClass("PTModule", #' Plot a PTModule object #' -#' Plots the waveforms of the (non-empty) \code{\link{PTSample}}s in a -#' \code{\link{PTModule}} object. +#' Plots the waveforms of the (non-empty) [`PTSample`]s in a +#' [`PTModule`] object. #' -#' A plotting routine based on the \code{\link[lattice]{xyplot}} from the +#' A plotting routine based on the [`lattice::xyplot`] from the #' lattice-package. Plots each (non-empty) waveform in a separate panel. Use arguments -#' of the \code{\link[lattice]{xyplot}} function to customise the plot. +#' of the [`lattice::xyplot`] function to customise the plot. #' @docType methods #' @rdname plot #' @name plot #' @aliases plot,PTModule,missing-method -#' @param x A \code{\link{PTModule}} object for which the -#' waveforms of the \code{\link{PTSample}}s need to be plotted. -#' @param y \code{missing}. Argument from the generic plotting method, don't use. -#' @param plot.loop.positions A \code{logical} value indicating whether +#' @param x A [`PTModule`] object for which the +#' waveforms of the [`PTSample`]s need to be plotted. +#' @param y `missing`. Argument from the generic plotting method, don't use. +#' @param plot.loop.positions A `logical` value indicating whether #' loop positions need to be visualised. For looped samples, the starting #' and ending positions are marked by a vertical green and red line, respectively. -#' @param ... Arguments that are passed on to \code{\link[lattice]{xyplot}}. -#' @returns Returns an object of class \code{trellis}. See documentation of -#' \code{\link[lattice]{xyplot}} for more details. +#' @param ... Arguments that are passed on to [`lattice::xyplot`]. +#' @returns Returns an object of class `trellis`. See documentation of +#' [`lattice::xyplot`] for more details. #' #' @examples #' ## get the example PTModule provided with the ProTrackR package @@ -258,7 +258,7 @@ setGeneric("read.module", function(file, ignore.validity = F) standardGeneric("r #' Read a ProTracker module file #' -#' Reads a ProTracker module file and coerces it to a \code{\link{PTModule}} +#' Reads a ProTracker module file and coerces it to a [`PTModule`] #' object. #' #' The routine to read ProTracker modules is based on the referenced version @@ -269,24 +269,24 @@ setGeneric("read.module", function(file, ignore.validity = F) standardGeneric("r #' was one of the more popular versions of ProTracker back in the days). #' #' It should also be able to read most of the .mod files in -#' \href{https://modarchive.org/}{The Mod Archive}. +#' [The Mod Archive](https://modarchive.org/). #' #' @docType methods #' @name read.module #' @rdname read.module #' @aliases read.module,character,logical-method #' @param file either a filename or a file connection, that -#' allows reading binary data (see e.g., \code{\link[base]{file}} or \code{\link[base]{url}}). -#' @param ignore.validity A \code{logical} value indicating whether the -#' validity of the \code{PTModule} should be ignored. When set to -#' \code{FALSE} (default), the validity of the read object is checked; an +#' allows reading binary data (see e.g., [`base::file`] or [`base::url`]). +#' @param ignore.validity A `logical` value indicating whether the +#' validity of the `PTModule` should be ignored. When set to +#' `FALSE` (default), the validity of the read object is checked; an #' error is thrown when the object is not valid. When this argument is set to -#' \code{TRUE}, the validity of the object will not be checked and a potentially -#' invalid object is returned. As the validity check of \code{PTModule} +#' `TRUE`, the validity of the object will not be checked and a potentially +#' invalid object is returned. As the validity check of `PTModule` #' objects is very strict, it can be useful to ignore this check. This way #' you can try to read a broken module file, try to fix it such that it becomes valid and -#' save (with \code{\link{write.module}}) it again. -#' @returns Returns a \code{PTModule} object read from the provided ProTracker file +#' save (with [`write.module`]) it again. +#' @returns Returns a `PTModule` object read from the provided ProTracker file #' #' @examples #' \dontrun{ @@ -307,9 +307,9 @@ setGeneric("read.module", function(file, ignore.validity = F) standardGeneric("r #' ## don't forget to close the file: #' close(con) #' } -#' @references \url{https://wiki.multimedia.cx/index.php?title=Protracker_Module} +#' @references #' -#' \url{http://coppershade.org/articles/More!/Topics/Protracker_File_Format/} +#' #' @family io.operations #' @family module.operations #' @author Pepijn de Vries @@ -432,7 +432,7 @@ setGeneric("write.module", def = function(mod, file){ #' Export an PTModule object as a ProTracker module file #' -#' Export an \code{\link{PTModule}} object as a ProTracker module file, +#' Export an [`PTModule`] object as a ProTracker module file, #' conform ProTracker 2.3A specifications. #' #' The routine to write ProTracker modules is based on the referenced version @@ -445,7 +445,7 @@ setGeneric("write.module", def = function(mod, file){ #' @aliases write.module,PTModule,ANY-method #' @param mod A valid PTModule object to be saved as a ProTracker *.mod file #' @param file either a filename to write to, or a file connection, that -#' allows to write binary data (see \code{\link[base]{file}}). +#' allows to write binary data (see [`base::file`]). #' @returns Writes to a module file but returns nothing. #' #' @examples @@ -463,9 +463,9 @@ setGeneric("write.module", def = function(mod, file){ #' ## don't forget to close the connection after you're done: #' close(con) #' } -#' @references \url{https://wiki.multimedia.cx/index.php?title=Protracker_Module} +#' @references #' -#' \url{http://coppershade.org/articles/More!/Topics/Protracker_File_Format/} +#' #' @family io.operations #' @family module.operations #' @author Pepijn de Vries @@ -573,51 +573,51 @@ setGeneric("patternOrder", function(x, full = FALSE) standardGeneric("patternOrd #' Get the pattern order table #' -#' The pattern order table is a \code{vector} of \code{numeric} indices of -#' \code{\link{PTPattern}} tables, which determines in which order the patterns -#' need to be played. This method returns this \code{vector}. +#' The pattern order table is a `vector` of `numeric` indices of +#' [`PTPattern`] tables, which determines in which order the patterns +#' need to be played. This method returns this `vector`. #' -#' The actual length of the \code{vector} containing the pattern order is 128 -#' as per ProTracker standards. Only part of this \code{vector} is `visible' +#' The actual length of the `vector` containing the pattern order is 128 +#' as per ProTracker standards. Only part of this `vector` is `visible' #' and will be used to determine in which order pattern tables are to be played. #' This method can be used to return either the visible or full (all 128) part #' of the table. It can also be used to assign a new patter order table. #' -#' Note that \code{\link{PTPattern}} indices start at 0, as per ProTracker +#' Note that [`PTPattern`] indices start at 0, as per ProTracker #' standards, whereas R start indices at 1. Hence, add 1 to the indices obtained -#' with \code{patternOrder}, in order to extract the correct -#' \code{\link{PTPattern}} from a \code{\link{PTModule}}. +#' with `patternOrder`, in order to extract the correct +#' [`PTPattern`] from a [`PTModule`]. #' #' The maximum index plus 1 in the full pattern order table should equal -#' the number of pattern tables (see \code{\link{patternLength}}) in the -#' \code{\link{PTModule}}. Is you assign a new pattern order, with a lower -#' maximum, \code{\link{PTPattern}} objects will get lost (see also examples)! +#' the number of pattern tables (see [`patternLength`]) in the +#' [`PTModule`]. Is you assign a new pattern order, with a lower +#' maximum, [`PTPattern`] objects will get lost (see also examples)! #' #' @rdname patternOrder #' @name patternOrder #' @aliases patternOrder,PTModule-method -#' @param x A \code{\link{PTModule}} object for which the pattern order table +#' @param x A [`PTModule`] object for which the pattern order table #' needs to be returned or modified. -#' @param full A \code{logical} value indicating whether the full (\code{TRUE}, -#' default), or only the visible (\code{FALSE}) part of the pattern order table +#' @param full A `logical` value indicating whether the full (`TRUE`, +#' default), or only the visible (`FALSE`) part of the pattern order table #' should be returned. This argument will also affect how new pattern order -#' tables are assigned (see \code{value}). -#' @param value A \code{numeric} \code{vector} (maximum length: 128) holding -#' \code{\link{PTPattern}} indices minus 1 for the new pattern order table. -#' -#' When \code{full = TRUE}, the \code{vector} will be padded with zeros to a -#' length of 128, and the \code{\link{patternOrderLength}} will be set to the -#' length of \code{value}. When \code{full = FALSE}, \code{value} will only -#' repplace the part of the order table up to the length of \code{value}. The -#' remainder of the table is not changed. The \code{\link{patternOrderLength}} +#' tables are assigned (see `value`). +#' @param value A `numeric` `vector` (maximum length: 128) holding +#' [`PTPattern`] indices minus 1 for the new pattern order table. +#' +#' When `full = TRUE`, the `vector` will be padded with zeros to a +#' length of 128, and the [`patternOrderLength`] will be set to the +#' length of `value`. When `full = FALSE`, `value` will only +#' repplace the part of the order table up to the length of `value`. The +#' remainder of the table is not changed. The [`patternOrderLength`] #' is also not modified in this case. -#' @returns For \code{patternOrder}, a \code{vector} of \code{numeric} -#' \code{\link{PTPattern}} indices is returned. +#' @returns For `patternOrder`, a `vector` of `numeric` +#' [`PTPattern`] indices is returned. #' -#' For \code{patternOrder<-}, an updated version of object \code{x} is returned, -#' in which the pattern order table is modified based on \code{value}. -#' @note The maximum number of \code{\link{PTPattern}}s cannot exceed either 64 or -#' 100 (depending on the \code{\link{trackerFlag}}). This means that values in +#' For `patternOrder<-`, an updated version of object `x` is returned, +#' in which the pattern order table is modified based on `value`. +#' @note The maximum number of [`PTPattern`]s cannot exceed either 64 or +#' 100 (depending on the [`trackerFlag`]). This means that values in #' the order table should also not exceed these values minus 1. #' @examples #' data("mod.intro") @@ -722,19 +722,19 @@ setGeneric("patternLength", function(x) standardGeneric("patternLength")) #' Get the number of PTPattern tables in a PTModule #' -#' Get the number of \code{\link{PTPattern}} tables in a \code{\link{PTModule}} +#' Get the number of [`PTPattern`] tables in a [`PTModule`] #' object. #' -#' The number of \code{\link{PTPattern}} tables in a \code{\link{PTModule}} +#' The number of [`PTPattern`] tables in a [`PTModule`] #' object should range from 1 up to either 64 or 100. The maximum depends on the -#' \code{\link{trackerFlag}} of the \code{\link{PTModule}} object. +#' [`trackerFlag`] of the [`PTModule`] object. #' @rdname patternLength #' @name patternLength #' @aliases patternLength,PTModule-method -#' @param x A \code{\link{PTModule}} object for which the number of -#' \code{\link{PTPattern}} tables need to be returned. -#' @returns Returns a \code{numeric} value representing the number of -#' \code{\link{PTPattern}} tables in object \code{x}. +#' @param x A [`PTModule`] object for which the number of +#' [`PTPattern`] tables need to be returned. +#' @returns Returns a `numeric` value representing the number of +#' [`PTPattern`] tables in object `x`. #' @examples #' data("mod.intro") #' @@ -754,13 +754,13 @@ setGeneric("patternOrderLength<-", function(x, value) standardGeneric("patternOr #' Get the length of the pattern order table #' -#' The pattern order table is a \code{vector} of \code{numeric} indices of -#' \code{PTPattern} tables, which determines in which order the patterns +#' The pattern order table is a `vector` of `numeric` indices of +#' `PTPattern` tables, which determines in which order the patterns #' need to be played. This method returns the visible length of this -#' \code{vector}. +#' `vector`. #' -#' The actual length of the \code{vector} containing the pattern order is 128 -#' as per ProTracker standards. Only part of this \code{vector} is `visible' +#' The actual length of the `vector` containing the pattern order is 128 +#' as per ProTracker standards. Only part of this `vector` is `visible' #' and will be used to determine in which order pattern tables are to be played. #' The length returned by this method is the length of this visible part of the #' pattern order table. The length of this visible part can also be set with this @@ -769,17 +769,17 @@ setGeneric("patternOrderLength<-", function(x, value) standardGeneric("patternOr #' @rdname patternOrderLength #' @name patternOrderLength #' @aliases patternOrderLength,PTModule-method -#' @param x A \code{\link{PTModule}} object for which the length of the +#' @param x A [`PTModule`] object for which the length of the #' visible part of the pattern order table is to be returned. -#' @param value A \code{numeric} value which is to be used to set the visible +#' @param value A `numeric` value which is to be used to set the visible #' length of the pattern order table. -#' @returns For \code{patternOrderLength} the visible length of the pattern -#' order table of \code{\link{PTModule}} \code{x} is returned as a \code{numeric} +#' @returns For `patternOrderLength` the visible length of the pattern +#' order table of [`PTModule`] `x` is returned as a `numeric` #' value, ranging from 1 up to 128. #' -#' For \code{patternOrderLength<-} an updated version of object \code{x} is +#' For `patternOrderLength<-` an updated version of object `x` is #' returned, in which the visible length of the pattern order table is set -#' to \code{value}. Note that this does not change the pattern order table +#' to `value`. Note that this does not change the pattern order table #' itself, only which part is `visible'. #' @examples #' data("mod.intro") @@ -823,27 +823,27 @@ setGeneric("trackerFlag<-", function(x, value = c("M.K.", "M!K!")) standardGener #' Tracker flag indicating version compatibility #' #' Method to obtain a tracker flag, which indicates the version compatibility -#' of a ProTracker module (\code{\link{PTModule}} object). +#' of a ProTracker module ([`PTModule`] object). #' -#' ProTrackR supports two tracker flags: "\code{M.K.}" and "\code{M!K!}". M.K. +#' ProTrackR supports two tracker flags: `"M.K."` and `"M!K!`". M.K. #' are presumably the initials of programmers Mahony and Kaktus, unfortunately #' documentation on this matter is ambiguous. In any case, modules with the -#' flag "\code{M.K.}" can hold up to 64 patterns, whereas modules with the flag -#' "\code{M!K!}" can hold up to 100 patterns. Use this method to obtain or -#' replace the tracker flag of a \code{\link{PTModule}}. +#' flag `"M.K."` can hold up to 64 patterns, whereas modules with the flag +#' `"M!K!"` can hold up to 100 patterns. Use this method to obtain or +#' replace the tracker flag of a [`PTModule`]. #' @rdname trackerFlag #' @name trackerFlag #' @aliases trackerFlag,PTModule-method -#' @param x A \code{\link{PTModule}} object for which the flag needs to +#' @param x A [`PTModule`] object for which the flag needs to #' returned or replaced. -#' @param value A \code{character} string representing the tracker flag with which -#' that of object \code{x} needs to be replaced with. Should either be "\code{M.K.}" -#' or "\code{M!K!}". Note that if a current flag "\code{M!K!}" is -#' replaced by "\code{M.K.}", \code{\link{PTPattern}}s may get lost as the +#' @param value A `character` string representing the tracker flag with which +#' that of object `x` needs to be replaced with. Should either be `"M.K."` +#' or `"M!K!"`. Note that if a current flag `"M!K!"` is +#' replaced by `"M.K."`, [`PTPattern`]s may get lost as the #' latter supports less patterns. -#' @returns For \code{trackerFlag}, the tracker flag of object \code{x} is returned. +#' @returns For `trackerFlag`, the tracker flag of object `x` is returned. #' -#' For \code{trackerFlag<-}, a copy of object \code{x} with an updated tracker +#' For `trackerFlag<-`, a copy of object `x` with an updated tracker #' flag is returned. #' @examples #' data("mod.intro") @@ -904,34 +904,34 @@ setGeneric("deletePattern", function(x, index){ #' Remove a PTPattern table from a PTModule object #' -#' This method removes a \code{\link{PTPattern}} from a -#' \code{\link{PTModule}} object and updates the -#' \code{\link{patternOrder}} table accordingly. +#' This method removes a [`PTPattern`] from a +#' [`PTModule`] object and updates the +#' [`patternOrder`] table accordingly. #' -#' This method safely removes a \code{\link{PTPattern}} from a -#' \code{\link{PTModule}} object, guarding the validity of the -#' \code{\link{PTModule}} object. It therefore also updates -#' the \code{\link{patternOrder}} table, by renumbering the indices +#' This method safely removes a [`PTPattern`] from a +#' [`PTModule`] object, guarding the validity of the +#' [`PTModule`] object. It therefore also updates +#' the [`patternOrder`] table, by renumbering the indices #' listed there. The index of the removed object is replaced with a zero -#' in the \code{\link{patternOrder}} table. +#' in the [`patternOrder`] table. #' #' @note As per ProTracker specification, the pattern indices -#' stored in the \code{\link{PTModule}} and obtained with -#' \code{\link{patternOrder}} start at 0. Whereas R starts indexing at 1. +#' stored in the [`PTModule`] and obtained with +#' [`patternOrder`] start at 0. Whereas R starts indexing at 1. #' Beware of this discrepancy. #' @rdname deletePattern #' @name deletePattern #' @aliases deletePattern,PTModule,numeric-method -#' @param x A \code{\link{PTModule}} from which a -#' \code{\link{PTPattern}} needs to be removed. -#' @param index A \code{numeric} index of the \code{\link{PTPattern}} +#' @param x A [`PTModule`] from which a +#' [`PTPattern`] needs to be removed. +#' @param index A `numeric` index of the [`PTPattern`] #' table that needs to be removed. The index should be between 1 and -#' \code{\link{patternLength}}. It's not possible to delete multiple -#' patterns simultaneously with this method. A \code{\link{PTModule}} +#' [`patternLength`]. It's not possible to delete multiple +#' patterns simultaneously with this method. A [`PTModule`] #' should always hold at least 1 pattern table, therefore, the last -#' \code{\link{PTPattern}} table cannot be deleted. -#' @returns Returns a \code{\link{PTModule}} from which the selected -#' \code{\link{PTPattern}} is deleted. +#' [`PTPattern`] table cannot be deleted. +#' @returns Returns a [`PTModule`] from which the selected +#' [`PTPattern`] is deleted. #' @examples #' data("mod.intro") #' print(mod.intro) @@ -965,36 +965,36 @@ setGeneric("appendPattern", function(x, pattern){ #' Append a PTPattern to a PTModule #' -#' Appends a specified \code{\link{PTPattern}} to a -#' \code{\link{PTModule}}. +#' Appends a specified [`PTPattern`] to a +#' [`PTModule`]. #' -#' Depending on the \code{\link{trackerFlag}}, a ProTracker module can hold +#' Depending on the [`trackerFlag`], a ProTracker module can hold #' either 64 or 100 pattern tables. As long as the number of pattern tables #' is below this maximum, new pattern tables can be added to the module with #' this function. #' -#' The \code{\link{patternOrder}} table should hold the maximum index of the +#' The [`patternOrder`] table should hold the maximum index of the #' available pattern tables in a module, otherwise, the module is not valid. #' As the maximum index increases, by appending a pattern table, the -#' \code{\link{patternOrder}} table should be updated. The -#' \code{\link{appendPattern}} method does this automatically, by replacing the first +#' [`patternOrder`] table should be updated. The +#' [`appendPattern`] method does this automatically, by replacing the first #' non-unique index in the order table, outside the current order table's length, #' with the new maximum index. If this is not possible, the highest element #' in the order table is set to hold the maximum index. #' #' @note As per ProTracker specification, the pattern indices -#' stored in the \code{\link{PTModule}} and obtained with -#' \code{\link{patternOrder}} start at 0. Whereas R starts indexing at 1. +#' stored in the [`PTModule`] and obtained with +#' [`patternOrder`] start at 0. Whereas R starts indexing at 1. #' Beware of this discrepancy. #' @rdname appendPattern #' @name appendPattern #' @aliases appendPattern,PTModule,PTPattern-method -#' @param x A \code{\link{PTModule}} object to which a -#' \code{\link{PTPattern}} is to be appended. -#' @param pattern A \code{\link{PTPattern}} object which is -#' to be appended to the \code{\link{PTModule}} \code{x}. -#' @returns Returns a \code{\link{PTModule}}, to which the -#' \code{\link{PTPattern}} is appended. +#' @param x A [`PTModule`] object to which a +#' [`PTPattern`] is to be appended. +#' @param pattern A [`PTPattern`] object which is +#' to be appended to the [`PTModule`] `x`. +#' @returns Returns a [`PTModule`], to which the +#' [`PTPattern`] is appended. #' @examples #' data("mod.intro") #' @@ -1036,22 +1036,22 @@ setGeneric("moduleSize", function(x) standardGeneric("moduleSize")) #' Get module file size #' -#' Get the file size in bytes of a \code{\link{PTModule}} object, when it is to be saved -#' as an original module file with \code{\link{write.module}}. +#' Get the file size in bytes of a [`PTModule`] object, when it is to be saved +#' as an original module file with [`write.module`]. #' #' The ProTracker module has a 1084 byte sized header containing all (meta) #' information on the patterns, their order and the audio samples. Each pattern #' holds exactly 1 Kb of information and the length of the audio samples corresponds #' with the size in bytes, as they are of 8 bit quality in mono. This function -#' calculates the file size of the \code{\link{PTModule}} object when it is to -#' be saved with \code{\link{write.module}}. +#' calculates the file size of the [`PTModule`] object when it is to +#' be saved with [`write.module`]. #' @rdname moduleSize #' @name moduleSize #' @aliases moduleSize,PTModule-method -#' @param x A \code{\link{PTModule}} object for which the file size is +#' @param x A [`PTModule`] object for which the file size is #' to be calculated. #' @returns Returns potential uncompressed module file size in bytes represented -#' by a number of class \code{object_size}. +#' by a number of class `object_size`. #' @examples #' ## Calculate the file size for the example module 'mod.intro': #' @@ -1089,19 +1089,19 @@ setGeneric("clearSong", function(mod) standardGeneric("clearSong")) #' Clear all pattern info from module #' -#' Remove all patterns (\code{\link{PTPattern}}) and \code{\link{patternOrder}} -#' info from a \code{\link{PTModule}} object. +#' Remove all patterns ([`PTPattern`]) and [`patternOrder`] +#' info from a [`PTModule`] object. #' #' Conform the original ProTracker, this method removes all patterns -#' (\code{\link{PTPattern}}) and \code{\link{patternOrder}} -#' info from a module. You keep the audio \code{\link{PTSample}}s. +#' ([`PTPattern`]) and [`patternOrder`] +#' info from a module. You keep the audio [`PTSample`]s. #' #' @rdname clearSong #' @name clearSong #' @aliases clearSong,PTModule-method -#' @param mod A \code{\link{PTModule}} object from which all pattern (order) +#' @param mod A [`PTModule`] object from which all pattern (order) #' info needs to be removed. -#' @returns Returns a copy of object \code{mod} in which all pattern (order) +#' @returns Returns a copy of object `mod` in which all pattern (order) #' info is removed. #' @examples #' data(mod.intro) @@ -1122,18 +1122,18 @@ setGeneric("clearSamples", function(mod) standardGeneric("clearSamples")) #' Clear all samples from module #' -#' Remove all \code{\link{PTSample}}s from a \code{\link{PTModule}} object. +#' Remove all [`PTSample`]s from a [`PTModule`] object. #' #' Conform the original ProTracker, this method removes all patterns -#' \code{\link{PTSample}}s from a module. You keep all patterns -#' (\code{\link{PTPattern}}) and \code{\link{patternOrder}} info. +#' [`PTSample`]s from a module. You keep all patterns +#' ([`PTPattern`]) and [`patternOrder`] info. #' #' @rdname clearSamples #' @name clearSamples #' @aliases clearSamples,PTModule-method -#' @param mod A \code{\link{PTModule}} object from which all samples needs +#' @param mod A [`PTModule`] object from which all samples needs #' to be removed. -#' @returns Returns a copy of object \code{mod} in which all samples are removed. +#' @returns Returns a copy of object `mod` in which all samples are removed. #' @examples #' data(mod.intro) #' @@ -1153,11 +1153,11 @@ setGeneric("fix.PTModule", function(mod, verbose) standardGeneric("fix.PTModule" #' Attempt to fix PTModule to ProTracker specs #' -#' Try to fix non-valid \code{\link{PTModule}} objects in order to meet with +#' Try to fix non-valid [`PTModule`] objects in order to meet with #' ProTracker specs such that they pass validity tests. #' -#' Almost any file can be read as a \code{\link{PTModule}} object (using -#' \code{\link{read.module}}) when validity is ignored and no unexpected end +#' Almost any file can be read as a [`PTModule`] object (using +#' [`read.module`]) when validity is ignored and no unexpected end #' of file is reached. This package's object validity are very strickly testing #' for compliance with ProTracker specifications. As many modules could have #' been created with other trackers (which often will play just as well in @@ -1169,11 +1169,11 @@ setGeneric("fix.PTModule", function(mod, verbose) standardGeneric("fix.PTModule" #' @rdname fix.PTModule #' @name fix.PTModule #' @aliases fix.PTModule,PTModule,logical-method -#' @param mod A \code{\link{PTModule}} object which needs fixing. -#' @param verbose With the default value of \code{TRUE}, the method -#' prints a progress report to the \code{\link{sink}}. When set -#' to \code{FALSE}, the progress report is suppressed. -#' @returns Returns a copy of object \code{mod} in which all non-conformaties are +#' @param mod A [`PTModule`] object which needs fixing. +#' @param verbose With the default value of `TRUE`, the method +#' prints a progress report to the [`sink`]. When set +#' to `FALSE`, the progress report is suppressed. +#' @returns Returns a copy of object `mod` in which all non-conformaties are #' attempted to be fixed. (Attempted) fixes are listed printed #' in the progress report. #' @note In the current version, pattern data itself is not checked for @@ -1304,26 +1304,26 @@ setGeneric("rawToPTModule", function(x, ignore.validity = F) standardGeneric("ra #' Convert a vector of raw data into a PTModule object #' -#' This method treats a vector of \code{raw} data as if it where a -#' file, and converts it into a \code{\link{PTModule-class}} object. +#' This method treats a vector of `raw` data as if it where a +#' file, and converts it into a [`PTModule-class`] object. #' -#' Data is read from a vector of \code{raw} data as if it where a file -#' and converted into a \code{\link{PTModule-class}} object. This +#' Data is read from a vector of `raw` data as if it where a file +#' and converted into a [`PTModule-class`] object. This #' method can be useful for module files stored on virtual Amiga Disk Files -#' (adf), which can be read as raw data, using the \code{AmigaFFH} +#' (adf), which can be read as raw data, using the `AmigaFFH` #' package. #' -#' Use \code{\link[ProTrackR]{as.raw}} to achieve the inverse. +#' Use [`ProTrackR::as.raw`] to achieve the inverse. #' #' @rdname rawToPTModule #' @name rawToPTModule #' @aliases rawToPTModule,raw-method -#' @param x A vector of \code{raw} data, conform ProTracker file specs. -#' @param ignore.validity A \code{logical} value. When set as \code{TRUE} -#' this method will attempt to decode the raw data (\code{x}), even when it is invalid. -#' When set to \code{FALSE} (default) validity is checked and an error is +#' @param x A vector of `raw` data, conform ProTracker file specs. +#' @param ignore.validity A `logical` value. When set as `TRUE` +#' this method will attempt to decode the raw data (`x`), even when it is invalid. +#' When set to `FALSE` (default) validity is checked and an error is #' thrown when invalidity occurs. -#' @returns returns a \code{\link{PTModule-class}} object. +#' @returns returns a [`PTModule-class`] object. #' @examples #' \dontrun{ #' ## convert the example mod into raw data diff --git a/R/07PTBlock.r b/R/07PTBlock.r index 8638960..f71fc75 100644 --- a/R/07PTBlock.r +++ b/R/07PTBlock.r @@ -10,40 +10,40 @@ setGeneric("PTBlock", function(pattern, row, track) standardGeneric("PTBlock")) #' Select and copy a range of PTCells into a PTBlock #' -#' Select and copy a range of \code{\link{PTCell}}s from a -#' \code{\link{PTPattern}} into a \code{PTBlock}. This +#' Select and copy a range of [`PTCell`]s from a +#' [`PTPattern`] into a `PTBlock`. This #' allows a more flexible approach to select and modify -#' \code{\link{PTCell}}s and paste the modified cells back into -#' a \code{\link{PTPattern}}. +#' [`PTCell`]s and paste the modified cells back into +#' a [`PTPattern`]. #' -#' Most objects in this \link[=ProTrackR-package]{ProTrackR} package are very strict in the operations +#' Most objects in this [ProTrackR][ProTrackR-package] package are very strict in the operations #' that are allowed, in order to guarantee validity and compatibility with #' the original ProTracker. This makes those objects not very flexible. #' -#' This \code{\link{PTBlock}} is not a formal S4 object, in fact you -#' can hardly call it an object at all. It is just a \code{matrix}, where each -#' element holds a \code{list} with a single \code{\link{PTCell}}. +#' This [`PTBlock`] is not a formal S4 object, in fact you +#' can hardly call it an object at all. It is just a `matrix`, where each +#' element holds a `list` with a single [`PTCell`]. #' -#' This \code{matrix} is very flexible and makes it easier to select and modify +#' This `matrix` is very flexible and makes it easier to select and modify #' the cells. This flexibility comes at a cost as validity is only checked -#' at the level of the \code{\link{PTCell}}s. The \code{PTBlock} -#' can be pasted back into a \code{\link{PTPattern}} with the -#' \code{\link{pasteBlock}} method. At which point validity will be checked again. If your modifications +#' at the level of the [`PTCell`]s. The `PTBlock` +#' can be pasted back into a [`PTPattern`] with the +#' [`pasteBlock`] method. At which point validity will be checked again. If your modifications #' resulted in violation of ProTracker standards, you should not be able to #' paste the block into a pattern. #' #' @rdname PTBlock #' @name PTBlock #' @aliases PTBlock,PTPattern,numeric,numeric-method -#' @param pattern A \code{\link{PTPattern}} object from which the -#' \code{PTBlock} needs to be selected. -#' @param row A \code{numeric} index or indices of rows that needs to be -#' copied from the \code{pattern} into the PTBlock. -#' @param track A \code{numeric} index or indices of tracks that needs to be -#' copied from the \code{pattern} into the PTBlock. -#' @returns Returns a \code{matrix} from the selected \code{row}s and \code{track}s -#' from the \code{pattern}. Each element in the \code{matrix} is a \code{list} holding -#' a single \code{\link{PTCell}}. +#' @param pattern A [`PTPattern`] object from which the +#' `PTBlock` needs to be selected. +#' @param row A `numeric` index or indices of rows that needs to be +#' copied from the `pattern` into the PTBlock. +#' @param track A `numeric` index or indices of tracks that needs to be +#' copied from the `pattern` into the PTBlock. +#' @returns Returns a `matrix` from the selected `row`s and `track`s +#' from the `pattern`. Each element in the `matrix` is a `list` holding +#' a single [`PTCell`]. #' @examples #' data("mod.intro") #' @@ -77,35 +77,35 @@ setGeneric("pasteBlock", function(pattern, block, row.start, track.start) standa #' Paste a block of PTCell data into a PTPattern #' -#' Paste a block of \code{\link{PTCell}} data into a \code{\link{PTPattern}} at +#' Paste a block of [`PTCell`] data into a [`PTPattern`] at #' a specified location. #' -#' A \code{\link{PTBlock}} is not a formal S4 class. It is a \code{matrix} where -#' each element holds a \code{list} of a single \code{\link{PTCell}} object. As -#' explained at the \code{\link{PTBlock}} method documentation, this allows for -#' a flexible approach of manipulating \code{\link{PTCell}} objects. The -#' \code{pasteBlock} method allows you to paste a \code{\link{PTBlock}} back into -#' a \code{\link{PTPattern}}. -#' -#' The \code{\link{PTBlock}} will be pasted at the specified location and will -#' span the number of tracks and rows that are included in the \code{\link{PTBlock}}. -#' The \code{\link{PTCell}}s in the \code{pattern} will be replaced by those -#' of the \code{block}. Elements of the \code{bock} that are out of the range -#' of the \code{pattern} are not included in the \code{pattern}. +#' A [`PTBlock`] is not a formal S4 class. It is a `matrix` where +#' each element holds a `list` of a single [`PTCell`] object. As +#' explained at the [`PTBlock`] method documentation, this allows for +#' a flexible approach of manipulating [`PTCell`] objects. The +#' `pasteBlock` method allows you to paste a [`PTBlock`] back into +#' a [`PTPattern`]. +#' +#' The [`PTBlock`] will be pasted at the specified location and will +#' span the number of tracks and rows that are included in the [`PTBlock`]. +#' The [`PTCell`]s in the `pattern` will be replaced by those +#' of the `block`. Elements of the `bock` that are out of the range +#' of the `pattern` are not included in the `pattern`. #' @rdname pasteBlock #' @name pasteBlock #' @aliases pasteBlock,PTPattern,matrix,numeric,numeric-method -#' @param pattern A \code{\link{PTPattern}} object into which the \code{block} +#' @param pattern A [`PTPattern`] object into which the `block` #' needs to be pasted. -#' @param block A \code{\link{PTBlock}} holding the \code{\link{PTCell}} data -#' that needs to be pasted into the \code{pattern}. -#' @param row.start A positive \code{integer} value (ranging from 1 up to 64) -#' indicating the starting position (row) in the \code{pattern} to paste the -#' \code{block} into. -#' @param track.start A positive \code{integer} value (ranging from 1 up to 4) -#' indicating the starting position (track) in the \code{pattern} to paste the -#' \code{block} into. -#' @returns Returns a copy of \code{pattern} into which \code{block} is pasted. +#' @param block A [`PTBlock`] holding the [`PTCell`] data +#' that needs to be pasted into the `pattern`. +#' @param row.start A positive `integer` value (ranging from 1 up to 64) +#' indicating the starting position (row) in the `pattern` to paste the +#' `block` into. +#' @param track.start A positive `integer` value (ranging from 1 up to 4) +#' indicating the starting position (track) in the `pattern` to paste the +#' `block` into. +#' @returns Returns a copy of `pattern` into which `block` is pasted. #' @examples #' data("mod.intro") #' diff --git a/R/08coercion.r b/R/08coercion.r index bf288f1..04c5a6e 100644 --- a/R/08coercion.r +++ b/R/08coercion.r @@ -21,60 +21,60 @@ setGeneric("PTCell<-", function(x, row, track, pattern, value) standardGeneric(" #' Coerce to or replace PTCell #' -#' This method will coerce a set of objects to a \code{PTCell} object. It can also -#' be used to select specific cells from \code{PTModule}, -#' \code{PTPattern} and \code{PTTrack} objects and replace -#' the selected \code{PTCell}. +#' This method will coerce a set of objects to a `PTCell` object. It can also +#' be used to select specific cells from `PTModule`, +#' `PTPattern` and `PTTrack` objects and replace +#' the selected `PTCell`. #' -#' Method to coerce \code{x} to class \code{\link{PTCell}}. +#' Method to coerce `x` to class [`PTCell`]. #' -#' When \code{x} is \code{raw} data, it should consist of a \code{vector} of -#' 4 elements, formatted as specified in the \link{PTCell-class}. +#' When `x` is `raw` data, it should consist of a `vector` of +#' 4 elements, formatted as specified in the [`PTCell-class`]. #' -#' When \code{x} is a \code{character} string, it should be formatted as follows: -#' "\code{NNO SS EEE}", where \code{NN} is the note (for instance +#' When `x` is a `character` string, it should be formatted as follows: +#' "`NNO SS EEE`", where `NN` is the note (for instance #' "C-" or "A#", where the dash has no particular meaning and may be omitted, #' the hash sign indicates a sharp note). Use a dash if the cell holds no note. -#' \code{O} is the octave (with a value of 0, or a dash, if a note -#' is missing, otherwise any of 1, 2 or 3). \code{SS} is the sample index -#' number, formatted as two hexadecimal digits (for example `1A'). \code{EEE} is -#' a three hexadecimal digit \code{\link{effect}} or trigger code (for more details see the -#' \code{\link{PTCell-class}}). The method is not case sensitive, so +#' `O` is the octave (with a value of 0, or a dash, if a note +#' is missing, otherwise any of 1, 2 or 3). `SS` is the sample index +#' number, formatted as two hexadecimal digits (for example `1A`). `EEE` is +#' a three hexadecimal digit [`effect`] or trigger code (for more details see the +#' [`PTCell-class`]). The method is not case sensitive, so #' you can use both upper and lower case. White spaces are ignored, you can use -#' as many as you would like. A correct \code{character} input for \code{x} -#' would be for example: "\code{A#2 01 A0F}". An `blank' \code{character} -#' representation would look like this: "\code{--- 00 000}". +#' as many as you would like. A correct `character` input for `x` +#' would be for example: `"A#2 01 A0F"`. A `blank` `character` +#' representation would look like this: `"--- 00 000"`. #' -#' When \code{x} is of class \code{\link{PTTrack}}, \code{\link{PTPattern}}, or -#' \code{\link{PTModule}}, the \code{PTCell} at the specified indices (\code{row}, -#' \code{track} and \code{pattern}) is returned, or can be replaced. +#' When `x` is of class [`PTTrack`], [`PTPattern`], or +#' [`PTModule`], the `PTCell` at the specified indices (`row`, +#' `track` and `pattern`) is returned, or can be replaced. #' #' @docType methods #' @name PTCell-method #' @rdname PTCell-method #' @aliases PTCell,raw,missing,missing,missing-method -#' @param x Object (any of \code{raw} data, a \code{character} string, a \code{PTTrack}, -#' a \code{PTPattern} or a \code{PTModule}) -#' to coerce to a \code{\link{PTCell}}. See details below for the -#' required format of \code{x}. -#' @param row When \code{x} is a \code{PTTrack}, a \code{PTPattern}, -#' or a \code{PTModule}, provide an index [1,64] of the row that needs -#' to be coerced to a \code{PTCell}. -#' @param track When \code{x} is a \code{PTPattern}, -#' or a \code{PTModule}, provide an index [1,4] of the track that needs -#' to be coerced to a \code{PTCell}. -#' @param pattern When \code{x} is a \code{PTModule}, provide an index -#' of the pattern that needs to be coerced to a \code{PTCell}. Note that +#' @param x Object (any of `raw` data, a `character` string, a `PTTrack`, +#' a `PTPattern` or a `PTModule`) +#' to coerce to a [`PTCell`]. See details below for the +#' required format of `x`. +#' @param row When `x` is a `PTTrack`, a `PTPattern`, +#' or a `PTModule`, provide an index \[1,64\] of the row that needs +#' to be coerced to a `PTCell`. +#' @param track When `x` is a `PTPattern`, +#' or a `PTModule`, provide an index \[1,4\] of the track that needs +#' to be coerced to a `PTCell`. +#' @param pattern When `x` is a `PTModule`, provide an index +#' of the pattern that needs to be coerced to a `PTCell`. Note that #' ProTracker uses indices for patterns that start at zero, whereas R uses indices -#' that start at one. Hence add one to an index obtained from a \code{PTModule} -#' object (e.g., \code{x$pattern.order}) -#' @param value An object of \code{\link{PTCell}} with which the \code{\link{PTCell}} -#' object at the specified indices in object \code{x} needs to be replaced. -#' @returns When \code{PTCell} is used, a \code{PTCell} object -#' based on \code{x} is returned. -#' -#' When \code{PTCell<-} is used, object \code{x} is returned in which -#' the selected \code{PTCell} is replaced with \code{value}. +#' that start at one. Hence add one to an index obtained from a `PTModule` +#' object (e.g., `x$pattern.order`) +#' @param value An object of [`PTCell`] with which the [`PTCell`] +#' object at the specified indices in object `x` needs to be replaced. +#' @returns When `PTCell` is used, a `PTCell` object +#' based on `x` is returned. +#' +#' When `PTCell<-` is used, object `x` is returned in which +#' the selected `PTCell` is replaced with `value`. #' @examples #' ## This will create an empty PTCell (equivalent #' ## to new("PTCell"): @@ -188,49 +188,49 @@ setGeneric("PTTrack<-", function(x, track, pattern, value) standardGeneric("PTTr #' Coerce to or replace PTTrack #' -#' This method will coerce a set of objects to a \code{PTTrack} object. It can also -#' be used to select specific tracks from \code{PTModule} and -#' \code{PTPattern} objects and replace the selected \code{PTTrack}. +#' This method will coerce a set of objects to a `PTTrack` object. It can also +#' be used to select specific tracks from `PTModule` and +#' `PTPattern` objects and replace the selected `PTTrack`. #' -#' Method to coerce \code{x} to class \code{\link{PTTrack}}. +#' Method to coerce `x` to class [`PTTrack`]. #' -#' When \code{x} is a 64 by 4 \code{matrix} of \code{raw} data, each row -#' implicitly represents a \code{\link{PTCell}} object and should -#' be formatted accordingly. See \code{\link{PTCell-class}} documentation for +#' When `x` is a 64 by 4 `matrix` of `raw` data, each row +#' implicitly represents a [`PTCell`] object and should +#' be formatted accordingly. See [`PTCell-class`] documentation for #' more details. #' -#' When \code{x} is a 64 element \code{vector} of \code{character} representation -#' of \code{\link{PTCell}} objects, the \code{character} representation must be -#' conform the specifications as documented at the \code{\link{PTCell-class}}. +#' When `x` is a 64 element `vector` of `character` representation +#' of [`PTCell`] objects, the `character` representation must be +#' conform the specifications as documented at the [`PTCell-class`]. #' -#' When \code{x} is of class \code{\link{PTPattern}}, or -#' \code{\link{PTModule}}, the \code{PTTrack} at the specified indices -#' (\code{track} and \code{pattern}) is returned, or can be replaced. +#' When `x` is of class [`PTPattern`], or +#' [`PTModule`], the `PTTrack` at the specified indices +#' (`track` and `pattern`) is returned, or can be replaced. #' #' @docType methods #' @name PTTrack-method #' @rdname PTTrack-method #' @aliases PTTrack,raw,missing,missing-method -#' @param x Object (any of \code{raw} data, a 64 by 4 \code{matrix} of \code{raw} -#' data, a vector of \code{character} strings, -#' a \code{PTPattern} or a \code{PTModule}) -#' to coerce to a \code{\link{PTTrack}}. See details below for the -#' required format of \code{x} -#' @param track When \code{x} is a \code{PTPattern}, -#' or a \code{PTModule}, provide an index [1,4] of the track that needs -#' to be coerced to a \code{PTTrack}. -#' @param pattern When \code{x} is a \code{PTModule}, provide an index -#' of the pattern that needs to be coerced to a \code{PTTrack}. Note that +#' @param x Object (any of `raw` data, a 64 by 4 `matrix` of `raw` +#' data, a vector of `character` strings, +#' a `PTPattern` or a `PTModule`) +#' to coerce to a [`PTTrack`]. See details below for the +#' required format of `x` +#' @param track When `x` is a `PTPattern`, +#' or a `PTModule`, provide an index \[1,4\] of the track that needs +#' to be coerced to a `PTTrack`. +#' @param pattern When `x` is a `PTModule`, provide an index +#' of the pattern that needs to be coerced to a `PTTrack`. Note that #' ProTracker uses indices for patterns that start at zero, whereas R uses indices -#' that start at one. Hence add one to an index obtained from a \code{PTModule} -#' object (e.g., \code{x$pattern.order}) -#' @param value An object of \code{\link{PTTrack}} with which the \code{\link{PTTrack}} -#' object at the specified indices in object \code{x} needs to be replaced. -#' @returns When \code{PTTrack} is used, a \code{PTTrack} object -#' based on \code{x} is returned. -#' -#' When \code{PTTrack<-} is used, object \code{x} is returned in which -#' the selected \code{PTTrack} is replaced with \code{value}. +#' that start at one. Hence add one to an index obtained from a `PTModule` +#' object (e.g., `x$pattern.order`) +#' @param value An object of [`PTTrack`] with which the [`PTTrack`] +#' object at the specified indices in object `x` needs to be replaced. +#' @returns When `PTTrack` is used, a `PTTrack` object +#' based on `x` is returned. +#' +#' When `PTTrack<-` is used, object `x` is returned in which +#' the selected `PTTrack` is replaced with `value`. #' @examples #' ## This will create an 'empty' PTTrack with all nul #' ## values, which is equivalent to new("PTTrack"): @@ -315,46 +315,46 @@ setGeneric("PTPattern<-", function(x, pattern, value) standardGeneric("PTPattern #' Coerce to or replace PTPattern #' -#' This method will coerce a set of objects to a \code{PTPattern} object. It can also -#' be used to select specific patterns from \code{PTModule} objects and replace -#' the selected \code{PTPattern}. +#' This method will coerce a set of objects to a `PTPattern` object. It can also +#' be used to select specific patterns from `PTModule` objects and replace +#' the selected `PTPattern`. #' -#' Method to coerce \code{x} to class \code{\link{PTPattern}}. +#' Method to coerce `x` to class [`PTPattern`]. #' -#' When \code{x} is a 64 by 16 \code{matrix} of \code{raw} data, each row -#' implicitly represents the \code{\link{PTCell}} objects of each of the -#' four tracks. Each \code{\link{PTCell}} consists of four \code{raw} +#' When `x` is a 64 by 16 `matrix` of `raw` data, each row +#' implicitly represents the [`PTCell`] objects of each of the +#' four tracks. Each [`PTCell`] consists of four `raw` #' values. The values in each row are formatted accordingly, where the values of the -#' cells of each track are concatenated. See \code{\link{PTCell-class}} documentation for -#' more details on the \code{raw} format of a \code{\link{PTCell}} object. +#' cells of each track are concatenated. See [`PTCell-class`] documentation for +#' more details on the `raw` format of a [`PTCell`] object. #' -#' When \code{x} is a 64 by 16 \code{matrix} of \code{character} representations -#' of \code{\link{PTCell}} objects, the \code{character} representation must be -#' conform the specifications as documented at the \code{\link{PTCell-class}}. +#' When `x` is a 64 by 16 `matrix` of `character` representations +#' of [`PTCell`] objects, the `character` representation must be +#' conform the specifications as documented at the [`PTCell-class`]. #' -#' When \code{x} is of class \code{\link{PTModule}}, the \code{PTPattern} at the -#' specified index (\code{pattern}) is returned, or can be replaced. +#' When `x` is of class [`PTModule`], the `PTPattern` at the +#' specified index (`pattern`) is returned, or can be replaced. #' #' @docType methods #' @name PTPattern-method #' @rdname PTPattern-method #' @aliases PTPattern,raw,missing-method -#' @param x Object (any of \code{raw} data, a 64 by 16 \code{matrix} of \code{raw} data, a 64 by 4 \code{matrix} of \code{character} strings, -#' or a \code{PTModule}) -#' to coerce to a \code{\link{PTPattern}}. See details below for the -#' required format of \code{x}. -#' @param pattern When \code{x} is a \code{PTModule}, provide an index -#' of the pattern that needs to be coerced to a \code{PTPattern}. Note that +#' @param x Object (any of `raw` data, a 64 by 16 `matrix` of `raw` data, a 64 by 4 `matrix` of `character` strings, +#' or a `PTModule`) +#' to coerce to a [`PTPattern`]. See details below for the +#' required format of `x`. +#' @param pattern When `x` is a `PTModule`, provide an index +#' of the pattern that needs to be coerced to a `PTPattern`. Note that #' ProTracker uses indices for patterns that start at zero, whereas R uses indices -#' that start at one. Hence add one to an index obtained from a \code{PTModule} -#' object (e.g., \code{x$pattern.order}). -#' @param value An object of \code{\link{PTPattern}} with which the \code{\link{PTPattern}} -#' object at the specified \code{index} in object \code{x} needs to be replaced. -#' @returns When \code{PTPattern} is used, a \code{PTPattern} object -#' based on \code{x} is returned. -#' -#' When \code{PTPattern<-} is used, object \code{x} is returned in which -#' the selected \code{PTPattern} is replaced with \code{value}. +#' that start at one. Hence add one to an index obtained from a `PTModule` +#' object (e.g., `x$pattern.order`). +#' @param value An object of [`PTPattern`] with which the [`PTPattern`] +#' object at the specified `index` in object `x` needs to be replaced. +#' @returns When `PTPattern` is used, a `PTPattern` object +#' based on `x` is returned. +#' +#' When `PTPattern<-` is used, object `x` is returned in which +#' the selected `PTPattern` is replaced with `value`. #' @examples #' ## This will create an 'empty' PTPattern with #' ## all 0x00 values, which is equivalent to @@ -422,45 +422,45 @@ setGeneric("PTSample<-", function(x, index, value) standardGeneric("PTSample<-") #' Coerce to or replace PTSample #' -#' This method will coerce a set of objects to a \code{PTSample} object. It can also -#' be used to select specific samples from \code{PTModule} objects and replace -#' the selected \code{PTSample}. +#' This method will coerce a set of objects to a `PTSample` object. It can also +#' be used to select specific samples from `PTModule` objects and replace +#' the selected `PTSample`. #' -#' Method to coerce \code{x} to class \code{\link{PTSample}}. +#' Method to coerce `x` to class [`PTSample`]. #' -#' When \code{x} is a \code{\link[tuneR]{Wave}} object, this method will not +#' When `x` is a [`tuneR::Wave`] object, this method will not #' resample it. However, the sample rate will be adjusted and samples exeeding -#' the maximum length of \code{2*0xffff} = \code{131070} will be clipped to this -#' maximum length. When \code{x} is a stereo sample, it will be converted to +#' the maximum length of `2*0xffff` = `131070` will be clipped to this +#' maximum length. When `x` is a stereo sample, it will be converted to #' mono, by averaging the left and right channel. #' -#' When \code{x} is a \code{vector} of \code{raw} data, it will be truncated -#' if the maximum length of \code{2*0xffff} = \code{131070} is exceeded. -#' The raw will be converted with \code{\link{rawToSignedInt}} in order -#' to represent an 8 bit mono \code{\link{waveform}}. +#' When `x` is a `vector` of `raw` data, it will be truncated +#' if the maximum length of `2*0xffff` = `131070` is exceeded. +#' The raw will be converted with [`rawToSignedInt`] in order +#' to represent an 8 bit mono [`waveform`]. #' #' As samples must have an even length (as per ProTracker specifications), #' a 0x00 value is appended if the length is odd. #' -#' When \code{x} is of class \code{\link{PTModule}}, the \code{PTSample} at the -#' specified \code{index} is returned, or will be replaced. +#' When `x` is of class [`PTModule`], the `PTSample` at the +#' specified `index` is returned, or will be replaced. #' @docType methods #' @rdname PTSample-method #' @name PTSample-method #' @aliases PTSample,Wave,missing-method -#' @param x Object (any of class \code{\link[tuneR]{Wave}}, a \code{vector} -#' of \code{raw} data, or of class \code{\link{PTModule}}) that needs to -#' be coerced to a \code{\link{PTSample}} object. In the latter case, the +#' @param x Object (any of class [`tuneR::Wave`], a `vector` +#' of `raw` data, or of class [`PTModule`]) that needs to +#' be coerced to a [`PTSample`] object. In the latter case, the #' object can also be replaced. -#' @param index A positive \code{integer} index of the sample in \code{\link{PTModule}} -#' \code{x} that needs to be returned or replaced. -#' @param value An object of \code{\link{PTSample}} with which the \code{\link{PTSample}} -#' object at the specified \code{index} in object \code{x} needs to be replaced. -#' @returns When \code{PTSample} is used, a \code{PTSample} object -#' based on \code{x} is returned. -#' -#' When \code{PTSample<-} is used, object \code{x} is returned in which -#' the selected \code{PTSample} is replaced with \code{value}. +#' @param index A positive `integer` index of the sample in [`PTModule`] +#' `x` that needs to be returned or replaced. +#' @param value An object of [`PTSample`] with which the [`PTSample`] +#' object at the specified `index` in object `x` needs to be replaced. +#' @returns When `PTSample` is used, a `PTSample` object +#' based on `x` is returned. +#' +#' When `PTSample<-` is used, object `x` is returned in which +#' the selected `PTSample` is replaced with `value`. #' @examples #' ## Create a raw data sine wave: #' raw_sine <- signedIntToRaw(round(sin(2*pi*(0:275)/276)*127)) diff --git a/R/09playing_routines.r b/R/09playing_routines.r index a548965..af1734b 100644 --- a/R/09playing_routines.r +++ b/R/09playing_routines.r @@ -21,27 +21,27 @@ setGeneric("playMod", function(mod, wait = T, ...) standardGeneric("playMod")) #' Play PTModule objects #' -#' Converts \code{\link{PTModule}} objects into audio -#' \code{\link[tuneR]{Wave}}s, and plays them. +#' Converts [`PTModule`] objects into audio +#' [`tuneR::Wave`]s, and plays them. #' #' Unfortunately, it was not feasible to create a routine that can directly -#' interpret \code{\link{PTModule}} objects and play them simultaneously. +#' interpret [`PTModule`] objects and play them simultaneously. #' Instead, the audio first needs to be rendered after which it can be played. -#' This method therefore first calls \code{\link{modToWave}} and then -#' \code{\link{playWave}}. Rendering may take some time and requires some +#' This method therefore first calls [`modToWave`] and then +#' [`playWave`]. Rendering may take some time and requires some #' balance between speed, quality and accuracy. See the documentation of the -#' \code{\link{modToWave}} method for the control you have on these aspects. +#' [`modToWave`] method for the control you have on these aspects. #' @rdname playMod #' @name playMod #' @aliases playMod,PTModule-method -#' @param mod A \code{\link{PTModule}} object to be played. -#' @param wait A \code{logical} value. When set to \code{TRUE} the playing +#' @param mod A [`PTModule`] object to be played. +#' @param wait A `logical` value. When set to `TRUE` the playing #' routine will wait with executing any code until the playing is -#' finished. When set to \code{FALSE}, subsequent R code will be +#' finished. When set to `FALSE`, subsequent R code will be #' executed while playing. -#' @param ... Arguments that are passed on to \code{\link{modToWave}}. -#' @returns A \code{\link[tuneR]{Wave}} object, generated from the -#' \code{mod} object, is returned. +#' @param ... Arguments that are passed on to [`modToWave`]. +#' @returns A [`tuneR::Wave`] object, generated from the +#' `mod` object, is returned. #' @examples #' \dontrun{ #' data("mod.intro") @@ -64,27 +64,27 @@ setGeneric("playWave", function(wave, wait = T) standardGeneric("playWave")) #' Play Wave objects #' -#' Use the command line \code{\link[audio]{play}} function from the -#' \code{audio} package to play \code{\link[tuneR]{Wave}} objects. +#' Use the command line [`audio::play`] function from the +#' `audio` package to play [`tuneR::Wave`] objects. #' -#' As the \code{\link{tuneR}} package play-function relies on external +#' As the [`tuneR`] package play-function relies on external #' players, this method is provided as a convenient approach to play -#' samples in the R console, using the \code{audio} package. Wave +#' samples in the R console, using the `audio` package. Wave #' objects are played at the rate as specified in the object. Of course -#' you can also play the \code{Wave} objects with the \code{tuneR} implementation -#' of \code{\link{tuneR}{play}}, by calling \code{tuneR::play(wave)}. +#' you can also play the `Wave` objects with the `tuneR` implementation +#' of [`tuneR::play`], by calling `tuneR::play(wave)`. #' @rdname playWave #' @name playWave #' @aliases playWave,Wave-method -#' @param wave An object of class \code{\link[tuneR]{Wave}} or -#' \code{\link[tuneR]{WaveMC}}. Note that the playing routine implemented +#' @param wave An object of class [`tuneR::Wave`] or +#' [`tuneR::WaveMC`]. Note that the playing routine implemented #' here can only play stereo waves. Multi-channel waves are therefore #' converted to stereo before playing. -#' @param wait A \code{logical} value. When set to \code{TRUE} the playing +#' @param wait A `logical` value. When set to `TRUE` the playing #' routine will wait with executing any code until the playing is -#' finished. When set to \code{FALSE}, subsequent R code will be +#' finished. When set to `FALSE`, subsequent R code will be #' executed while playing. -#' @returns Returns an \code{\link[audio]{$.audioInstance}}. +#' @returns Returns an [`audio::$.audioInstance`]. #' @examples #' \dontrun{ #' data(mod.intro) @@ -149,29 +149,29 @@ setGeneric("modToWave", #' Convert a PTModule object into an audio Wave object #' -#' Converts a \code{\link{PTModule}} object into a \code{\link[tuneR]{Wave}} +#' Converts a [`PTModule`] object into a [`tuneR::Wave`] #' object, which can be played, further analysed, modified and saved. #' -#' Before the \code{\link{PTModule}} object can be converted into a -#' \code{\link[tuneR]{Wave}} object, the rows of the -#' \code{\link{PTPattern}} objects in the module need to be put +#' Before the [`PTModule`] object can be converted into a +#' [`tuneR::Wave`] object, the rows of the +#' [`PTPattern`] objects in the module need to be put #' in the right order. This method does that by calling -#' \code{\link{playingtable}}. +#' [`playingtable`]. #' #' Once the rows of the pattern tables are in the right order, all selected -#' \code{\link{PTTrack}} objects of the module are looped by this function +#' [`PTTrack`] objects of the module are looped by this function #' and the routines described below are applied to each track. #' #' On the Commodore Amiga the chip responsible for audio output (Paula), #' the audio playback of samples can be controlled by the user in two ways: -#' the playback rate of the sample can be changed by specifying `period' -#' values (see e.g. \code{\link{periodToSampleRate}}) and specifying a +#' the playback rate of the sample can be changed by specifying 'period' +#' values (see e.g. [`periodToSampleRate`]) and specifying a #' volume which is linearly scaled between 0 (silent) and 64 (maximum). #' #' So, for each track, the correct period and volume values are determined #' based on the note, effect command and sample information in the module. #' -#' Then, the \code{\link{PTSample}} objects are resampled, using the +#' Then, the [`PTSample`] objects are resampled, using the #' period values and volume values as determined in the previous step. #' #' Next audio filters are applied to mimic original Commodore Amiga @@ -186,8 +186,8 @@ setGeneric("modToWave", #' On modern machines, the time required for conversion should generally #' be less than the playback time of the module. #' -#' You can save the resulting \code{\link[tuneR]{Wave}} object by calling -#' \code{\link[tuneR]{writeWave}}. +#' You can save the resulting [`tuneR::Wave`] object by calling +#' [`tuneR::writeWave`]. #' @note As audio can be mixed with this package at frequencies much greater than the #' Commodore Amiga's audio output rate, some aliasing of the sound could occur. #' This results in high frequency audio, that would not be produced on an Amiga. @@ -197,48 +197,48 @@ setGeneric("modToWave", #' @rdname modToWave #' @name modToWave #' @aliases modToWave,PTModule-method -#' @param mod An object of class \code{\link{PTModule}} +#' @param mod An object of class [`PTModule`] #' @param video The video mode of a Commodore Amiga affects timing routines and #' the playback sample rate. This mode can be specified with this argument and -#' is represented by a \code{character} string that can have either the value -#' `\href{https://en.wikipedia.org/wiki/PAL}{PAL}' -#' or `\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. PAL is used by default. -#' @param target.rate A positive \code{integer} sample rate for the target \code{Wave}. +#' is represented by a `character` string that can have either the value +#' '[PAL](https://en.wikipedia.org/wiki/PAL)' +#' or '[NTSC](https://en.wikipedia.org/wiki/NTSC)'. PAL is used by default. +#' @param target.rate A positive `integer` sample rate for the target `Wave`. #' Should be at least 2000. #' Default value is 44100 Hz, which is conform CD quality. 22050 Hz will also #' produce a decent sound quality and saves you some working memory. -#' @param target.bit Number of bits for the target \code{Wave}. Should be a \code{numeric} +#' @param target.bit Number of bits for the target `Wave`. Should be a `numeric` #' value of either 8, 16, 24 or 32. Default is 16, which is conform CD quality #' (the quality doesn't really improve at higher bit values, as the original #' samples are of 8 bit quality). -#' @param stereo.separation A \code{numeric} value between 0 and 1. +#' @param stereo.separation A `numeric` value between 0 and 1. #' When set to 1 (default), stereo channels (Amiga channels 1 and 4 on left, #' and channels 2 and 3 on right) are completely separated. When set to #' less than 1, stereo channels are mixed, where the number gives the #' fraction of separation of the channels. When set to 0, both channels -#' are completely mixed and a mono \code{Wave} is returned. -#' @param low.pass.filter A \code{logical} value indicating whether low pass +#' are completely mixed and a mono `Wave` is returned. +#' @param low.pass.filter A `logical` value indicating whether low pass #' filters should be applied when generating wave data. The Commodore Amiga #' had hardware audio filters. One (low pass 6 db/Oct tuned at #' 4.9 kHz) that filters all audio and one (low pass 12 db/Oct tuned at #' approximately 3.3 kHz) that can be turned on and off at will with effect -#' command E00/E01 (see also \link[=ProTrackR-package]{ProTrackR} documentation, +#' command E00/E01 (see also [ProTrackR][ProTrackR-package] documentation, #' section on effect commands). These filters are only applied when the -#' \code{low.pass.filter} argument is set to \code{TRUE} and the -#' \code{target.rate} is set to values > 4.9 kHz. If you don't want to simulate +#' `low.pass.filter` argument is set to `TRUE` and the +#' `target.rate` is set to values > 4.9 kHz. If you don't want to simulate #' this typical Amiga sound, turn the filters off to save processing time. -#' @param tracks Either \code{logical} or \code{numeric} values indicating -#' which of the 4 \code{\link{PTTrack}}s are to be converted. By default +#' @param tracks Either `logical` or `numeric` values indicating +#' which of the 4 [`PTTrack`]s are to be converted. By default #' all 4 tracks are selected. #' @param mix A logical value indicating whether the 4 Amiga channels should -#' be mixed to the 2 (stereo) output channels. When set to \code{TRUE} (default) a stereo -#' \code{\link[tuneR]{Wave}} object is returned. When set to \code{FALSE} a -#' multi-channel \code{\link[tuneR]{WaveMC}} object is returned. The -#' \code{stereo.separation} argument is ignored in the latter case. -#' @param ... Additional arguments that are passed to \code{\link{playingtable}}. -#' @returns A \code{\link[tuneR]{Wave}} object, generated from the -#' \code{mod} object is returned. A \code{\link[tuneR]{WaveMC}} object is returned when -#' the \code{mix} argument is set to \code{FALSE}. +#' be mixed to the 2 (stereo) output channels. When set to `TRUE` (default) a stereo +#' [`tuneR::Wave`] object is returned. When set to `FALSE` a +#' multi-channel [`tuneR::WaveMC`] object is returned. The +#' `stereo.separation` argument is ignored in the latter case. +#' @param ... Additional arguments that are passed to [`playingtable`]. +#' @returns A [`tuneR::Wave`] object, generated from the +#' `mod` object is returned. A [`tuneR::WaveMC`] object is returned when +#' the `mix` argument is set to `FALSE`. #' @examples #' \dontrun{ #' data(mod.intro) @@ -329,74 +329,74 @@ setGeneric("playingtable", #' Generate a table for playing a PTModule object #' -#' This method generates a table (\code{data.frame}) in which information +#' This method generates a table (`data.frame`) in which information #' from the pattern tables are put in the right order and in a comprehensive #' format. #' -#' This method generates a table (\code{data.frame}) in which information -#' from the pattern tables (\code{\link{PTPattern}}) are put in the right +#' This method generates a table (`data.frame`) in which information +#' from the pattern tables ([`PTPattern`]) are put in the right #' order, taking into account pattern breaks, position jumps and pattern -#' loops (see also \link[=ProTrackR-package]{ProTrackR} documentation, +#' loops (see also [ProTrackR][ProTrackR-package] documentation, #' section on effect commands). The information is put in -#' a comprehensive format in a \code{data.frame}, with the following columns: +#' a comprehensive format in a `data.frame`, with the following columns: #' \describe{ #' \item{row}{Row number index of the original -#' \code{\link{PTPattern}} object.} -#' \item{filter}{A \code{logical} value indicating whether the +#' [`PTPattern`] object.} +#' \item{filter}{A `logical` value indicating whether the #' Amiga hardware audio filter was either turned on or off using -#' effect command E00/E01 (see also \link[=ProTrackR-package]{ProTrackR} documentation, +#' effect command E00/E01 (see also [ProTrackR][ProTrackR-package] documentation, #' section on effect commands).} -#' \item{speed}{Number of `ticks' per row as set with the Fxy +#' \item{speed}{Number of 'ticks' per row as set with the Fxy #' effect commands in the module.} #' \item{tempo}{The tempo as specified by the Fxy commands in the module.} #' \item{delay}{The delay that should be applied to the row as #' specified with the EEx effect command in the module.} -#' \item{effect.track1..4}{The effect code (\code{raw}) as specified in each of the +#' \item{effect.track1..4}{The effect code (`raw`) as specified in each of the #' 4 tracks in the module.} -#' \item{effect.mag.track1..4}{The effect magnitude (\code{raw}) as specified +#' \item{effect.mag.track1..4}{The effect magnitude (`raw`) as specified #' for each of the 4 tracks in the module.} -#' \item{sample.nr.track1..4}{The sample index number (\code{numeric}) as specified for +#' \item{sample.nr.track1..4}{The sample index number (`numeric`) as specified for #' each of the 4 tracks in the module.} -#' \item{note.track1..4}{The note (\code{factor}) as specified for each of +#' \item{note.track1..4}{The note (`factor`) as specified for each of #' the four tracks in the module.} -#' \item{position}{The positions index number (\code{numeric}) from the -#' \code{\link{patternOrder}} table in the module.} +#' \item{position}{The positions index number (`numeric`) from the +#' [`patternOrder`] table in the module.} #' \item{duration}{Playback duration of the corresponding row in seconds.} #' \item{cum_duration}{Cumulative playback duration of the corresponding row in seconds.} #' } #' @rdname playingtable #' @name playingtable #' @aliases playingtable,PTModule-method -#' @param mod An object of class \code{\link{PTModule}}. -#' @param starting.position A \code{numeric} starting position index. -#' Determines where in the \code{\link{patternOrder}} table of the module to +#' @param mod An object of class [`PTModule`]. +#' @param starting.position A `numeric` starting position index. +#' Determines where in the [`patternOrder`] table of the module to #' start generating the playingtable. -#' @param max.duration A \code{numeric} value indicating the maximum +#' @param max.duration A `numeric` value indicating the maximum #' length in seconds of the pattern information returned. By default set #' to 120 seconds (2 minutes). As some modules can be very long, #' or contain infinite loops or position jumps, the maximum duration #' is required to break out of the routine for generating the table. #' @param speed Default speed to use when it is not specified in the -#' pattern data. See \link[=ProTrackR-package]{ProTrackR} documentation for more info on +#' pattern data. See [ProTrackR][ProTrackR-package] documentation for more info on #' `speed' and `tempo'. #' @param tempo Default tempo to use when it is not specified in the -#' pattern data. See \link[=ProTrackR-package]{ProTrackR} documentation for more info on +#' pattern data. See [ProTrackR][ProTrackR-package] documentation for more info on #' `speed' and `tempo'. #' @param video The video mode of a Commodore Amiga affects timing routines. #' This mode can be specified with this argument and -#' is represented by a \code{character} string that can have either the value -#' `\href{https://en.wikipedia.org/wiki/PAL}{PAL}' -#' or `\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. PAL is used by default. -#' @param play.once A \code{logical} value. When set to \code{TRUE}, +#' is represented by a `character` string that can have either the value +#' '[PAL](https://en.wikipedia.org/wiki/PAL)' +#' or '[NTSC](https://en.wikipedia.org/wiki/NTSC)'. PAL is used by default. +#' @param play.once A `logical` value. When set to `TRUE`, #' the routine will stop adding data to the table when the starting -#' position (\code{starting.position}) is reach once again. Warning: +#' position (`starting.position`) is reach once again. Warning: #' may not work correctly when the last pattern contains a pattern -#' break. Will be overruled when the \code{maximum.duration} is reached +#' break. Will be overruled when the `maximum.duration` is reached #' before the end of the song. -#' @param verbose A \code{logical} value. Suppresses a progress report -#' from being printed to the \code{\link[base]{sink}} when set to \code{FALSE}. -#' The default value is \code{TRUE}. -#' @returns Returns a \code{data.frame} with pattern rows put in the right +#' @param verbose A `logical` value. Suppresses a progress report +#' from being printed to the [`base::sink`] when set to `FALSE`. +#' The default value is `TRUE`. +#' @returns Returns a `data.frame` with pattern rows put in the right #' order. Information contained in the returned table is described in the #' 'Details' section #' @examples diff --git a/R/10ModArchiveHelpers.r b/R/10ModArchiveHelpers.r index fc9f34f..0946635 100644 --- a/R/10ModArchiveHelpers.r +++ b/R/10ModArchiveHelpers.r @@ -200,28 +200,28 @@ htmlcodes <- rbind(htmlcodes, data.frame( #' ModArchive helper functions #' -#' \url{https://ModArchive.org} is on of the largest online archive of module files. These functions +#' is on of the largest online archive of module files. These functions #' will assist in accessing this archive. #' -#' The \code{modArchive.info} function will retrieve info on a specific module from the -#' ModArchive. The \code{modArchive.search.mod}, \code{modArchive.search.genre} and -#' \code{modArchive.search.hash} functions can be used to find specific modules -#' in the archive. Use \code{modArchive.random.pick} to get module info on a random +#' The `modArchive.info` function will retrieve info on a specific module from the +#' ModArchive. The `modArchive.search.mod`, `modArchive.search.genre` and +#' `modArchive.search.hash` functions can be used to find specific modules +#' in the archive. Use `modArchive.random.pick` to get module info on a random #' module in the archive. #' -#' Use the \code{modArchive.view.by} +#' Use the `modArchive.view.by` #' function to browse the archive by specific aspects. #' Note that the ModArchive also contains file formats other than ProTracker's MOD format. #' This package can only handle the MOD format. #' -#' The \code{modArchive.download} function will download a module from the archive. +#' The `modArchive.download` function will download a module from the archive. #' -#' Use \code{modArchive.search.artist} to find artist details in the archive. +#' Use `modArchive.search.artist` to find artist details in the archive. #' -#' Use \code{modArchive.request.count} to determine how many request you have +#' Use `modArchive.request.count` to determine how many request you have #' made in the current month with the specified key (see `ModArchive API key' #' section for details). -#' Use \code{modArchive.max.requests} to determine how many request you are +#' Use `modArchive.max.requests` to determine how many request you are #' allowed to make each month with the provided key (see `ModArchive API key' #' section for details). #' @@ -244,27 +244,27 @@ htmlcodes <- rbind(htmlcodes, data.frame( #' ModArchive helper functions described here. #' #' So how do you get your personal API key? First, you need to register at the -#' \href{https://modarchive.org/forums/}{ModArchive Forums}. Then follow the -#' instructions provided in this \href{https://modarchive.org/forums/index.php?topic=1950.0}{topic} -#' on the forum. For more info, see also the \href{https://modarchive.org/?xml-api}{API -#' page} on ModArchive. +#' [ModArchive Forums](https://modarchive.org/forums/). Then follow the +#' instructions provided in this [topic](https://modarchive.org/forums/index.php?topic=1950.0) +#' on the forum. For more info, see also the [API page](https://modarchive.org/?xml-api) +#' on ModArchive. #' #' If you want to search for module files without an API key, one could make use of -#' to the \link{modLand} collection instead. -#' @param mod.id An \code{integer} code used as module identifier in the ModArchive database. -#' A \code{mod.id} can be obtained by performing a search with \code{modArchive.search.mod}. +#' to the [modLand] collection instead. +#' @param mod.id An `integer` code used as module identifier in the ModArchive database. +#' A `mod.id` can be obtained by performing a search with `modArchive.search.mod`. #' When downloading a module, make sure that the identifier represents a MOD file, as #' other types will result in an error. -#' @param search.text A \code{character} string to be used as terms to search +#' @param search.text A `character` string to be used as terms to search #' in the ModArchive. -#' @param search.where A \code{character} string indicating where in the module files -#' to search for the \code{search.text}. See usage section for the available options. +#' @param search.where A `character` string indicating where in the module files +#' to search for the `search.text`. See usage section for the available options. #' @param format.filter File format filter to be used in a search in the ModArchive. #' See the usage section for all possible options. Default is "unset" (meaning that #' it will search for any file format). Note that only the `MOD' format #' is supported by this package. #' @param size.filter File size filter to be used in a search in the ModArchive. -#' Needs to be a \code{character} string representation of a file size +#' Needs to be a `character` string representation of a file size #' category as specified on ModArchive.org. #' See the usage section for all possible options. Default is "unset" (meaning that #' it will search for any file size). Note that the maximum file size of a @@ -272,56 +272,54 @@ htmlcodes <- rbind(htmlcodes, data.frame( #' category is irrelevant for `MOD' files. Also note that the category names are #' inconsistant, these are the literal catagories used by ModArchive #' @param genre.filter Genre filter to be used in some of the overviews from the ModArchive. -#' Needs to be a \code{character} string representation of a genre +#' Needs to be a `character` string representation of a genre #' as specified on ModArchive.org. #' See the usage section for all possible options. -#' This argument is deprecated in the function \code{modArchive.search} since ProTrackR +#' This argument is deprecated in the function `modArchive.search` since ProTrackR #' version 0.3.4, other functions will still accept this argument. #' @param search.artist A character string representing the (guessed) artist name #' or id number that you ar looking for in the archive. #' @param search.hash The MD5 hash code of the specific module you are looking -#' for. See \url{https://modarchive.org/?xml-api-usage-level3} for details. -#' @param view.query A query to be used in combination with the \code{view.by} -#' argument. Use the queries in combination with \code{view.by} as follows: -#' \itemize{ -#' \item{\code{view_by_list}: Use a single capital starting letter to browse -#' modules by name} -#' \item{\code{view_by_rating_comments}: Provide a (user) rating by which you -#' wish to browse the modules} -#' \item{\code{view_by_rating_reviews}: Provide a (reviewer) rating by which you -#' wish to browse the modules} -#' \item{\code{view_modules_by_artistid}: Provide an artist id number -#' for whom you wish to browse his/her modules} -#' \item{\code{view_modules_by_guessed_artist}: Provide an artist guessed -#' name for whom you wish to browser his/her modules} -#' } +#' for. See for details. +#' @param view.query A query to be used in combination with the `view.by` +#' argument. Use the queries in combination with `view.by` as follows: +#' * `view_by_list`: Use a single capital starting letter to browse +#' modules by name +#' * `view_by_rating_comments`: Provide a (user) rating by which you +#' wish to browse the modules +#' * `view_by_rating_reviews`: Provide a (reviewer) rating by which you +#' wish to browse the modules +#' * `view_modules_by_artistid`: Provide an artist id number +#' for whom you wish to browse his/her modules +#' * `view_modules_by_guessed_artist`: Provide an artist guessed +#' name for whom you wish to browser his/her modules #' @param api.key Most ModArchive functions require a personal secret API key. This key can #' be obtained from the ModArchive forum. See `ModArchive API Key' section below for instructions #' on how to obtain such a key. #' @param page Many of the ModArchive returns paginated tables. When this argument #' is omitted, the first page is returned. Use an integer value to return a specific #' page. The total number of pages of a search or view is returned as an attribute -#' to the returned \code{\link[base]{data.frame}}. -#' @param view.by Indicate how the \code{modArchive.view.by} function should sort +#' to the returned [base::data.frame]. +#' @param view.by Indicate how the `modArchive.view.by` function should sort #' the overview tables of modules. See `usage' section for the possible options. -#' @param ... arguments that are passed on to \code{\link{read.module}}. -#' @returns \code{modArchive.info}, \code{modArchive.search.genre}, -#' \code{modArchive.search.hash}, \code{modArchive.random.pick} and -#' \code{modArchive.view.by} will return a \code{\link{data.frame}} +#' @param ... arguments that are passed on to [`read.module`]. +#' @returns `modArchive.info`, `modArchive.search.genre`, +#' `modArchive.search.hash`, `modArchive.random.pick` and +#' `modArchive.view.by` will return a [data.frame] #' containing information on modules in the ModArchive. Note that this #' data.frame is formatted differently since ProTrackR 0.3.4, which #' may cause backward compatibility issues. #' -#' \code{modArchive.download} will download a module and return it as a -#' \code{\link{PTModule}} object. +#' `modArchive.download` will download a module and return it as a +#' [`PTModule`] object. #' -#' \code{modArchive.search.artist} will return a \code{\link{data.frame}} +#' `modArchive.search.artist` will return a [`data.frame`] #' containing information on artists on the ModArchive. #' -#' \code{modArchive.request.count} returns the number of ModArchive API request +#' `modArchive.request.count` returns the number of ModArchive API request #' that are left for this month, for the provided key. #' -#' \code{modArchive.max.requests} returns the maximum monthly requests for the +#' `modArchive.max.requests` returns the maximum monthly requests for the #' provided key. #' @name modArchive #' @aliases modArchive.info diff --git a/R/11MODPlugHelpers.r b/R/11MODPlugHelpers.r index 1624377..cbfa79d 100644 --- a/R/11MODPlugHelpers.r +++ b/R/11MODPlugHelpers.r @@ -1,24 +1,24 @@ #' Convert MODPlug pattern into a PTPattern object #' #' Convert pattern data from text or clipboard, originating from the modern -#' MODPlug tracker and convert it into a \code{PTPattern} or \code{PTBlock} +#' MODPlug tracker and convert it into a `PTPattern` or `PTBlock` #' object. #' -#' The Open MODPlug Tracker (\url{https://openmpt.org}) is a modern +#' The Open MODPlug Tracker () is a modern #' music tracker that is for free. It too can handle ProTracker modules. #' This function assists in moving pattern data from Open MPT to R. #' #' Simply select and copy the pattern data to the system's clipboard -#' and use this function to import it to R as a \code{\link{PTPattern}} or -#' \code{\link{PTBlock}} object. +#' and use this function to import it to R as a [`PTPattern`] or +#' [`PTBlock`] object. #' -#' @param text A \code{vector} of \code{character}s, representing MOD pattern data -#' obtained from OpenMPT. If set to \code{NULL} (default), the text will be read +#' @param text A `vector` of `character`s, representing MOD pattern data +#' obtained from OpenMPT. If set to `NULL` (default), the text will be read #' from the system's clipboard. -#' @param what A \code{character} string that indicates what type of object +#' @param what A `character` string that indicates what type of object #' should be returned. Can be "PTPattern" or "PTBlock". -#' @returns Depending on the value of the argument \code{what}, it will -#' return either a \code{\link{PTPattern}} or \code{\link{PTBlock}} object. +#' @returns Depending on the value of the argument `what`, it will +#' return either a [`PTPattern`] or [`PTBlock`] object. #' #' @name MODPlugToPTPattern #' @rdname MODPlugToPTPattern @@ -156,24 +156,24 @@ MODPlugToPTPattern <- function(text = NULL, what = c("PTPattern", "PTBlock")) { #' Convert PTPattern data into a MODPlug pattern #' -#' Use a \code{\link{PTPattern}} or \code{\link{PTBlock}} to create +#' Use a [`PTPattern`] or [`PTBlock`] to create #' a pattern table with a MODPlug flavour. #' -#' The Open MODPlug Tracker (\url{https://openmpt.org}) is a modern +#' The Open MODPlug Tracker () is a modern #' music tracker that is for free. It too can handle ProTracker modules. #' This function assists in moving pattern data from R to Open MPT. #' -#' @param x Either a \code{\link{PTPattern}} object or a -#' \code{\link{PTBlock}} object from which an Open +#' @param x Either a [`PTPattern`] object or a +#' [`PTBlock`] object from which an Open #' MODPlug Tracker pattern should be created. -#' @param to.clipboard A \code{logical} value, indicating whether the -#' result should be copied to the system's clipboard (\code{TRUE}) or -#' should be returned as a \code{vector} of \code{character}s -#' (\code{FALSE}). -#' @returns Returns an invisible \code{NULL} when -#' argument \code{to.clipboard} is set to \code{TRUE}. +#' @param to.clipboard A `logical` value, indicating whether the +#' result should be copied to the system's clipboard (`TRUE`) or +#' should be returned as a `vector` of `character`s +#' (`FALSE`). +#' @returns Returns an invisible `NULL` when +#' argument `to.clipboard` is set to `TRUE`. #' Returns an Open MODPlug Tracker flavoured pattern table as -#' a \code{vector} of \code{character}s when it is set to \code{FALSE}. +#' a `vector` of `character`s when it is set to `FALSE`. #' #' @name PTPatternToMODPlug #' @rdname PTPatternToMODPlug diff --git a/R/12ModLandHelpers.r b/R/12ModLandHelpers.r index 955e544..5541ba6 100644 --- a/R/12ModLandHelpers.r +++ b/R/12ModLandHelpers.r @@ -1,51 +1,51 @@ #' ModLand helper functions #' -#' \url{https://modland.com} is on of the largest online archive of module files. These functions +#' is on of the largest online archive of module files. These functions #' will assist in accessing this archive. #' -#' Like the \url{https://modarchive.org}, modland provides access to a large collection of module files. -#' Compared to the \link{modArchive}, modLand provides limited searching features. However, it +#' Like the , modland provides access to a large collection of module files. +#' Compared to the [modArchive], modLand provides limited searching features. However, it #' does not require an API key. #' #' The functions documented here are provided as a convenience and depend #' on third party services. Note that continuity of these services cannot #' be guaranteed. #' -#' Use \code{modLand.search.mod} to search through the modLand collection. +#' Use `modLand.search.mod` to search through the modLand collection. #' -#' Use \code{modLand.download.mod} to download a specific mod file as an S4 object. -#' @param search.text A single length \code{character} vector, containing +#' Use `modLand.download.mod` to download a specific mod file as an S4 object. +#' @param search.text A single length `character` vector, containing #' search text. Provided search pattern is searched in all fields (mod format, #' author and title). Prefixes can be added to keywords for inclusive or exclusive -#' searches. For details see \url{https://www.exotica.org.uk/wiki/Modland#Searching}. +#' searches. For details see . #' Note that modLand contains a wide range of tracker files, only mod-files -#' are supported by the \code{ProTrackR} package. It is therefore advisable to add the +#' are supported by the `ProTrackR` package. It is therefore advisable to add the #' keyword `mod' to the search string. -#' @param format A single length \code{character} vector, indicating the -#' tracker file format. `\code{Protracker}' is the option that is most likely to work in this package. -#' @param author A single length \code{character} vector, indicating the -#' module author name. Can be obtained from a \code{modLand.search.mod}. -#' @param title A single length \code{character} vector, indicating the -#' module title. Can be obtained from a \code{modLand.search.mod}. -#' @param mirror A single length \code{character} vector. Should contain one of the +#' @param format A single length `character` vector, indicating the +#' tracker file format. ``Protracker`' is the option that is most likely to work in this package. +#' @param author A single length `character` vector, indicating the +#' module author name. Can be obtained from a `modLand.search.mod`. +#' @param title A single length `character` vector, indicating the +#' module title. Can be obtained from a `modLand.search.mod`. +#' @param mirror A single length `character` vector. Should contain one of the #' mirrors listed in the `usage' section. Select a mirror site from which #' the module file needs to be downloaded. -#' @param ... Argument that are passed on to \code{\link{read.module}}. -#' @returns \code{modLand.search.mod} returns a \code{data.frame}. -#' The \code{data.frame} contains a search result in each row. +#' @param ... Argument that are passed on to [`read.module`]. +#' @returns `modLand.search.mod` returns a `data.frame`. +#' The `data.frame` contains a search result in each row. #' The data.frame contains a number of columns, each containing -#' \code{character} strings. The column `title' contains the mod file name; +#' `character` strings. The column `title' contains the mod file name; #' The column named `author' contains the author name; the column named -#' `format' contains the tracker file format (only `\code{Protracker}' +#' `format' contains the tracker file format (only ``Protracker`' #' is supported by this package); The collumn `collect' contains #' modLand collections in which the mod is included; the column named #' `url' contains a download link for the `ogg'-file generated on the #' modLand server from the mod file. Note that ogg-files are not supported -#' by the ProTrackR package. Use \code{modLand.download.mod} to download +#' by the ProTrackR package. Use `modLand.download.mod` to download #' the mod file. #' -#' \code{modLand.download.mod} attempts to download the specified mod -#' file and return it as a \code{\link{PTModule}} object. It will throw +#' `modLand.download.mod` attempts to download the specified mod +#' file and return it as a [`PTModule`] object. It will throw #' errors when the mod file is not available or when there are network #' problems... #' @name modLand diff --git a/R/ProTrackR-package.r b/R/ProTrackR-package.r index 0b7a343..d805010 100644 --- a/R/ProTrackR-package.r +++ b/R/ProTrackR-package.r @@ -17,32 +17,25 @@ #' music tracker) will promote the ease of use of this package. However, #' the provided documentation and exernal links should help you, #' when you're starting from scratch. A good place to start reading -#' this manual would be the documentation of the \code{\link{PTModule-class}}, +#' this manual would be the documentation of the [`PTModule-class`], #' which describes the structure of a ProTracker module and how it is #' implemented in this package. You should also have a look at the documentation -#' of the \code{\link{PTPattern}}, \code{\link{PTTrack}}, \code{\link{PTCell}} and -#' \code{\link{PTSample}} classes, which are all elements of the -#' \code{\link{PTModule}}. +#' of the [`PTPattern`], [`PTTrack`], [`PTCell`] and +#' [`PTSample`] classes, which are all elements of the +#' [`PTModule`]. #' @section Current issues and future developments: -#' This package is far from perfect, but it is in such a state that it can -#' be useful to others, and have therefore published it. There's much room -#' for improvement and I intend to work on that. -#' However, as I'm working on this project in my spare time, developments -#' may not move forwards as fast as I'd like them to, or may eventually even -#' come to a halt. Keeping this disclaimer in mind, there are some minor -#' revisions I will try to work on the coming time. +#' For the development state of this package, please check the +#' [README section on GitHub](https::pepijn.devries.github.com/ProTrackR/). #' #' Currently, not all effect commands are implemented, although most common #' ones are. I will work on implementing the remaining effect commands (see #' also section below). ProTracker also has specific interpretations that -#' are currently not all implemented correctly. I will also try to fix this -#' in future versions. +#' are currently not all implemented correctly. #' #' Sample switching (that is when a module switches from one sample number #' to another, without specifying a new note) is also something that is implemented #' differently by varying module players. This package currently does not implement -#' such switches conform ProTracker specs. This will also be addressed in -#' future versions. +#' such switches conform ProTracker specs. #' #' Period values, which dictate at which fequency samples should be played, are #' censored both by Amiga hardware and software coded limits in the original @@ -50,8 +43,8 @@ #' attempt to implement these bounds in the current version of the #' package after consulting with Olav #' S\ifelse{latex}{\out{{\o}}}{\ifelse{html}{\out{ø}}{o}}rensen (who created -#' a ProTracker clone for modern machines: \url{https://16-bits.org/pt.php}). -#' I'm really greatful for his input and doing some checks on an actual +#' a ProTracker clone for modern machines: ). +#' I'm really grateful for his input and doing some checks on an actual #' Amiga. #' #' I also realise that the documentation of this package may be a bit cryptic @@ -62,16 +55,16 @@ #' As explained before, effect commands are composed of a three hexadecimal digits. #' The first digit indicates the type of effect, trigger or jump that should be applied, #' the latter two digits indicate the magnitude of the effect. An exception are -#' commands starting with the digit `E', for which the first two digits specify +#' commands starting with the digit 'E', for which the first two digits specify #' the type of effect and only the last digit represents the magnitude. Below #' all available effect commands (or codes if you will) are listed with the -#' magnitudes labelled `x' or `xy'. The overview shows which commands are used +#' magnitudes labelled 'x' or 'xy'. The overview shows which commands are used #' for which kind of effect and whether it is implemented (between brackets) in #' the playing routines of this package. -#' +#' #' But first a few words on speed and tempo in ProTracker. Both are two sides of #' the same coin, both affect the overall speed with which patterns are played. -#' Speed is defined as the number of `ticks' per pattern row and tempo sets +#' Speed is defined as the number of 'ticks' per pattern row and tempo sets #' the duration of each tick. #' So by increasing the speed value, or decreasing the tempo, the overall playing #' speed of the pattern table is reduced. At the default tempo of 125, the duration @@ -80,91 +73,86 @@ #' #' On the Commodore Amiga the chip responsible for audio output (Paula), #' the audio playback of samples can be controlled by the user in two ways: -#' the playback rate of the sample can be changed by specifying `period' -#' values (see e.g. \code{\link{periodToSampleRate}}) and specifying a +#' the playback rate of the sample can be changed by specifying 'period' +#' values (see e.g. [`periodToSampleRate`]) and specifying a #' volume which is linearly scaled between 0 (silent) and 64 (maximum). #' Period and volumes can only be changed at the start of each tick. This is #' why the effects will be affected by the speed setting, but not the tempo. -#' +#' #' And now, without further ado, the overview of effect commands: -#' \tabular{llll}{ -#' Code \tab Effect \tab Description \tab Status\cr -#' 0xy \tab Arpeggio \tab This effect alternates the pitch each tick to simulate a chord. xy needs to be greater then 00. First the specified note is played, then the pitch is increased with x semitones, then with y semitones. \tab Partly implemented\cr -#' 1xy \tab Porta up \tab Decrease the period value with xy every tick but the first. \tab Implemented\cr -#' 2xy \tab Porta down \tab Increase the period value with xy every tick but the first. \tab Implemented\cr -#' 3xy \tab Porta to note \tab Change the period value with xy every tick but the first, untill the specified target note is reached. \tab Implemented\cr -#' 4xy \tab Vibrato \tab Oscillate the pitch with magnitude x. Where y relates to the oscillation frequency. \tab Implemented\cr -#' 5xy \tab Porta to note + Volume slide \tab A combination of effects 3xy and Axy. \tab Implemented\cr -#' 6xy \tab Vibrato + Volume slide \tab A combination of effects 4xy and Axy. \tab Implemented\cr -#' 7xy \tab Tremolo \tab Oscillate the volume with magnitude x. Where y relates to the oscillation frequency. \tab Implemented\cr -#' 8xy \tab Not implemented \tab This effect command is not implemented in ProTracker, nor will it be in this package. \tab Not implemented\cr -#' 9xy \tab Set sample offset \tab This effect causes the note to start playing at an offset (of 256 times xy samples) into the sample, -#' instead of just from the start. \tab Implemented\cr -#' Axy \tab Volume slide \tab Change the volume every but the first tick: increase with x, decrease with y. \tab Implemented\cr -#' Bxy \tab Position jump \tab Jump to position xy of the \code{\link{patternOrder}} table. \tab Implemented\cr -#' Cxy \tab Set volume \tab Set the volume with xy. \tab Implemented\cr -#' Dxy \tab Pattern break \tab Break to row xy in the next pattern. Note: xy is (even though it is a hexadecimal) interpreted as a decimal. \tab Implemented\cr -#' E0x \tab Turn filter on/off \tab If x is even, the (emulated) hardware filter is turned on (for all tracks). It is turned off if x is odd. \tab Implemented\cr -#' E1x \tab Porta up (fine) \tab The period value is decreased with x, at the first tick. \tab Implemented\cr -#' E2x \tab Porta down (fine) \tab The period value is increased with x, at the first tick. \tab Implemented\cr -#' E3x \tab Glissando Control \tab This effect causes a change in the effect 3xy (porta to note). It toggles -#' whether to do a smooth slide or whether to slide in jumps of semitones. When x is 0 it uses a smooth slide, non-zero values will result in jumps. \tab Not yet implemented\cr -#' E4x \tab Vibrato Waveform \tab This effect sets the waveform for the vibrato command to follow. With x modulo 4 equals 0, a sine wave is used, with 1 ramp down, with 2 or 3 a square wave. Values greater than 4 causes the ossicating waveform not to retrigger it when a new note is played. \tab Implemented\cr -#' E5x \tab Set finetune \tab Set the finetune with x, where x is interpreted as a signed nybble. \tab Partly implemented\cr -#' E6x \tab Pattern loop \tab Set pattern loop start with E60, and loop x times when x is non-zero. \tab Implemented\cr -#' E7x \tab Tremolo waveform \tab Same as E4x, but this controls the wave form for the tremolo effect (7xy) rather then the vibrato effect. \tab Implemented\cr -#' E8x \tab Not implemented \tab According to official documentation this command is not implemented in ProTracker, but it is. Applies a filter on a looped sample, therewith destroying the original sample data. \tab Not implemented\cr -#' E9x \tab Retrigger note \tab Retrigger the note every x-th tick. \tab Implemented\cr -#' EAx \tab Volume slide up (fine) \tab Increase the volume with x at the first tick. \tab Implemented\cr -#' EBx \tab Volume slide down (fine) \tab Decrease the volume with x at the first tick. \tab Implemented\cr -#' ECx \tab Cut note \tab Cut the volume of the note to zero after x ticks. \tab Implemented\cr -#' EDx \tab Delay note \tab The note is triggered with a delay of x ticks. \tab Implemented\cr -#' EEx \tab Pattern delay \tab The duration of the row in ticks is multiplied by (x + 1). \tab Implemented\cr -#' EFx \tab Not implemented \tab According to official documentation this command is not implemented in ProTracker, but it is. It flips sample data in a looped sample, therewith destroying the original sample data. \tab Not implemented\cr -#' Fxy \tab Set speed or tempo \tab When xy is smaller then 32, it sets the speed in ticks per row. When xy is greater then 31, it will set the tempo, wich is inversely related to the duration of each tick. Speed and tempo can be defined in combination. \tab Implemented -#' } +#' | Code | Effect | Description | Status | +#' | ---- | ------ | ----------- | ------ | +#' | 0xy | Arpeggio | This effect alternates the pitch each tick to simulate a chord. xy needs to be greater then 00. First the specified note is played, then the pitch is increased with x semitones, then with y semitones. | Partly implemented | +#' | 1xy | Porta up | Decrease the period value with xy every tick but the first. | Implemented | +#' | 2xy | Porta down | Increase the period value with xy every tick but the first. | Implemented | +#' | 3xy | Porta to note | Change the period value with xy every tick but the first, untill the specified target note is reached. | Implemented | +#' | 4xy | Vibrato | Oscillate the pitch with magnitude x. Where y relates to the oscillation frequency. | Implemented | +#' | 5xy | Porta to note + Volume slide | A combination of effects 3xy and Axy. | Implemented | +#' | 6xy | Vibrato + Volume slide | A combination of effects 4xy and Axy. | Implemented | +#' | 7xy | Tremolo | Oscillate the volume with magnitude x. Where y relates to the oscillation frequency. | Implemented | +#' | 8xy | Not implemented | This effect command is not implemented in ProTracker, nor will it be in this package. | Not implemented | +#' | 9xy | Set sample offset | This effect causes the note to start playing at an offset (of 256 times xy samples) into the sample, instead of just from the start. | Implemented | +#' | Axy | Volume slide | Change the volume every but the first tick: increase with x, decrease with y. | Implemented | +#' | Bxy | Position jump | Jump to position xy of the [`patternOrder`] table. | Implemented | +#' | Cxy | Set volume | Set the volume with xy. | Implemented | +#' | Dxy | Pattern break | Break to row xy in the next pattern. Note: xy is (even though it is a hexadecimal) interpreted as a decimal. | Implemented | +#' | E0x | Turn filter on/off | If x is even, the (emulated) hardware filter is turned on (for all tracks). It is turned off if x is odd. | Implemented | +#' | E1x | Porta up (fine) | The period value is decreased with x, at the first tick. | Implemented | +#' | E2x | Porta down (fine) | The period value is increased with x, at the first tick. | Implemented | +#' | E3x | Glissando Control | This effect causes a change in the effect 3xy (porta to note). It toggles whether to do a smooth slide or whether to slide in jumps of semitones. When x is 0 it uses a smooth slide, non-zero values will result in jumps. | Not yet implemented | +#' | E4x | Vibrato Waveform | This effect sets the waveform for the vibrato command to follow. With x modulo 4 equals 0, a sine wave is used, with 1 ramp down, with 2 or 3 a square wave. Values greater than 4 causes the ossicating waveform not to retrigger it when a new note is played. | Implemented | +#' | E5x | Set finetune | Set the finetune with x, where x is interpreted as a signed nybble. | Partly implemented | +#' | E6x | Pattern loop | Set pattern loop start with E60, and loop x times when x is non-zero. | Implemented | +#' | E7x | Tremolo waveform | Same as E4x, but this controls the wave form for the tremolo effect (7xy) rather then the vibrato effect. | Implemented | +#' | E8x | Not implemented | According to official documentation this command is not implemented in ProTracker, but it is. Applies a filter on a looped sample, therewith destroying the original sample data. | Not implemented | +#' | E9x | Retrigger note | Retrigger the note every x-th tick. | Implemented | +#' | EAx | Volume slide up (fine) | Increase the volume with x at the first tick. | Implemented | +#' | EBx | Volume slide down (fine) | Decrease the volume with x at the first tick. | Implemented | +#' | ECx | Cut note | Cut the volume of the note to zero after x ticks. | Implemented | +#' | EDx | Delay note | The note is triggered with a delay of x ticks. | Implemented | +#' | EEx | Pattern delay | The duration of the row in ticks is multiplied by (x + 1). | Implemented | +#' | EFx | Not implemented | According to official documentation this command is not implemented in ProTracker, but it is. It flips sample data in a looped sample, therewith destroying the original sample data. | Not implemented | +#' | Fxy | Set speed or tempo | When xy is smaller then 32, it sets the speed in ticks per row. When xy is greater then 31, it will set the tempo, wich is inversely related to the duration of each tick. Speed and tempo can be defined in combination. | Implemented | #' @section Test cases: #' The interpretation of the effect commands can be tedious. They often vary #' between module players. Even ProTracker can have a quirky (and unexpected) ways #' of handling the effect commands. This package aims at staying as close to -#' ProTracker `standards' as possible. +#' ProTracker 'standards' as possible. #' #' The current version already implements most effect commands and common quirks #' when it comes to their interpretation. My subjective estimate is that it will -#' correctly play roughly 95\% of the ProTracker modules on \href{https://modarchive.org}{ModArchive}. Some -#' Less common unexpected behaviour is documented by the team behind \href{https://wiki.openmpt.org/Main_Page}{OpenMPT}, for which they developed +#' correctly play roughly 95% of the ProTracker modules on [ModArchive](https://modarchive.org). Some +#' Less common unexpected behaviour is documented by the team behind [OpenMPT](https://wiki.openmpt.org/Main_Page), for which they developed #' several test cases. The table below shows which test cases this package passes -#' and which it does not. It is the intention to pass more of the tests in future -#' versions. -#' \tabular{ll}{ -#' Test module \tab Status\cr -#' \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#AmigaLimitsFinetune.mod}{AmigaLimitsFinetune.mod} \tab Fail\cr -#' \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#ArpWraparound.mod}{ArpWraparound.mod} \tab Fail\cr -#' \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#DelayBreak.mod}{DelayBreak.mod} \tab Pass\cr -#' \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#finetune.mod}{finetune.mod} \tab Fail\cr -#' \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PatLoop-Break.mod}{PatLoop-Break.mod} \tab Pass\cr -#' \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PatternJump.mod}{PatternJump.mod} \tab Pass\cr -#' \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PortaSmpChange.mod}{PortaSmpChange.mod} \tab Fail\cr -#' \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PortaTarget.mod}{PortaTarget.mod} \tab Pass\cr -#' \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PTInstrSwap.mod}{PTInstrSwap.mod} \tab Fail\cr -#' \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#ptoffset.mod}{ptoffset.mod} \tab Pass\cr -#' \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PTSwapEmpty.mod}{PTSwapEmpty.mod} \tab Fail\cr -#' \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#VibratoReset.mod}{VibratoReset.mod} \tab Pass -#' } +#' and which it does not. +#' | Test module | Status | +#' | ----------- | ------ | +#' | [AmigaLimitsFinetune.mod](https://wiki.openmpt.org/Development:_Test_Cases/MOD#AmigaLimitsFinetune.mod) | Fail | +#' | [ArpWraparound.mod](https://wiki.openmpt.org/Development:_Test_Cases/MOD#ArpWraparound.mod) | Fail | +#' | [DelayBreak.mod](https://wiki.openmpt.org/Development:_Test_Cases/MOD#DelayBreak.mod) | Pass | +#' | [finetune.mod](https://wiki.openmpt.org/Development:_Test_Cases/MOD#finetune.mod) | Fail | +#' | [PatLoop-Break.mod](https://wiki.openmpt.org/Development:_Test_Cases/MOD#PatLoop-Break.mod) | Pass | +#' | [PatternJump.mod](https://wiki.openmpt.org/Development:_Test_Cases/MOD#PatternJump.mod) | Pass | +#' | [PortaSmpChange.mod](https://wiki.openmpt.org/Development:_Test_Cases/MOD#PortaSmpChange.mod) | Fail | +#' | [PortaTarget.mod](https://wiki.openmpt.org/Development:_Test_Cases/MOD#PortaTarget.mod) | Pass | +#' | [PTInstrSwap.mod](https://wiki.openmpt.org/Development:_Test_Cases/MOD#PTInstrSwap.mod) | Fail | +#' | [ptoffset.mod](https://wiki.openmpt.org/Development:_Test_Cases/MOD#ptoffset.mod) | Pass | +#' | [PTSwapEmpty.mod](https://wiki.openmpt.org/Development:_Test_Cases/MOD#PTSwapEmpty.mod) | Fail | +#' | [VibratoReset.mod](https://wiki.openmpt.org/Development:_Test_Cases/MOD#VibratoReset.mod) | Pass | #' #' @aliases EffectCommands #' @references #' Some basic information on ProTracker: -#' \url{https://en.wikipedia.org/wiki/Protracker} +#' #' #' Some basic information on music trackers in general: -#' \url{https://en.wikipedia.org/wiki/Music_tracker} +#' #' #' A tutorial on ProTracker on YouTube: -#' \url{https://www.youtube.com/playlist?list=PLVoRT-Mqwas9gvmCRtOusCQSKNQNf6lTc} +#' #' #' Some informal but extensive technical documentation on ProTracker: -#' \url{ftp://ftp.modland.com/pub/documents/format_documentation/Protracker\%20effects\%20(FireLight)\%20(.mod).txt} +#' #' @importFrom audio play wait #' @importFrom graphics plot #' @importFrom lattice xyplot diff --git a/R/data.r b/R/data.r index 37307eb..a1bef43 100644 --- a/R/data.r +++ b/R/data.r @@ -11,14 +11,14 @@ #' #' @docType data #' @name period_table -#' @format a \code{data.frame} with fourteen columns: -#' \itemize{ -#' \item{The column named `octave': \code{integer} value [1,3]} -#' \item{The column named `finetune': \code{integer} value [-8, 7] used to tune a sample} -#' \item{The columns named `C-' to `B-': represent the twelve (semi)tones. -#' The values in these columns are the period values for the corresponding -#' tone, octave and finetune.} -#' } +#' @format a `data.frame` with fourteen columns: +#' +#' * The column named 'octave': `integer` value \[1,3\] +#' * The column named 'finetune': `integer` value \[-8, 7\] used to tune a sample +#' * The columns named 'C-' to `B-': represent the twelve (semi)tones. +#' The values in these columns are the period values for the corresponding +#' tone, octave and finetune. +#' #' @family period.operations #' @examples #' data("period_table") @@ -32,18 +32,18 @@ NULL #' Paula was one of the custom chips on the original Commodore Amiga. This chip #' was dedicated (amongst other tasks) to controlling audio playback. The #' chip's output rate depended on the video mode used: -#' either `\href{https://en.wikipedia.org/wiki/PAL}{PAL}' -#' or `\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. This table provides the +#' either '[PAL](https://en.wikipedia.org/wiki/PAL)' +#' or '[NTSC](https://en.wikipedia.org/wiki/NTSC)'. This table provides the #' output rate for both video modes that can be used in calculating sample rates. #' #' @docType data #' @name paula_clock -#' @format a \code{data.frame} with two columns: -#' \itemize{ -#' \item{`frequency' A \code{numeric} value representing Paula's output rate in Hz.} -#' \item{`video' A \code{character} string representing the two video modes.} -#' } -#' @references \url{https://en.wikipedia.org/wiki/Original_Chip_Set#Paula} +#' @format a `data.frame` with two columns: +#' +#' * 'frequency' A `numeric` value representing Paula's output rate in Hz. +#' * 'video' A `character` string representing the two video modes. +#' +#' @references #' @examples #' data("paula_clock") NULL @@ -53,31 +53,31 @@ NULL #' Small list of numbers used by an obscure audio effect in ProTracker #' #' This dataset is included for completeness sake. It is not yet used by any -#' class, method or function in the \code{\link[=ProTrackR-package]{ProTrackR}} package. It may +#' class, method or function in the [ProTrackR][ProTrackR-package] package. It may #' very well be obsolete for recent ProTracker versions. #' @docType data #' @name funk_table -#' @format A \code{numeric} \code{vector} of length 16 holding values to be +#' @format A `numeric` `vector` of length 16 holding values to be #' used in ProTracker funk repeat effects. -#' @references \url{https://fossies.org/linux/uade/amigasrc/players/tracker/eagleplayers/mod32_protracker/PTK_versions.txt} +#' @references #' @examples data("funk_table") NULL #' Example of a PTModule object #' -#' A \code{\link{PTModule}} object included in the package as example. +#' A [`PTModule`] object included in the package as example. #' #' This PTModule object is based on an original ProTracker module file #' I've composed in the late nineteen nineties. It is used as example for many -#' of the \code{\link[=ProTrackR-package]{ProTrackR}} methods and you can use it to test your own +#' of the [ProTrackR][ProTrackR-package] methods and you can use it to test your own #' code. It can also be exported back to the original ProTracker module file -#' by using \code{\link{write.module}}. +#' by using [`write.module`]. #' @docType data #' @name mod.intro -#' @format A \code{\link{PTModule}} object containing 4 -#' \code{\link{PTSample}} objects (and 27 empty \code{PTSample} -#' objects, adding up to the 31 samples a \code{PTModule} should hold) and 4 -#' \code{\link{PTPattern}} objects. +#' @format A [`PTModule`] object containing 4 +#' [`PTSample`] objects (and 27 empty `PTSample` +#' objects, adding up to the 31 samples a `PTModule` should hold) and 4 +#' [`PTPattern`] objects. #' @examples #' data("mod.intro") #' print(mod.intro) diff --git a/README.Rmd b/README.Rmd new file mode 100644 index 0000000..45d873a --- /dev/null +++ b/README.Rmd @@ -0,0 +1,92 @@ +--- +output: github_document +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + fig.path = "man/figures/README-", + out.width = "100%" +) +library(ProTrackR) |> + suppressMessages() +data("mod.intro") +``` + +# ProTrackR + +ProTracker 2.3a + +[ProTracker](https://en.wikipedia.org/wiki/Protracker) is music sequencer software +from the 1990s on the [Commodore Amiga](https://en.wikipedia.org/wiki/Amiga) +(see screenshot of version 2.3a on the right). +This R package is designed to read, process and play ProTracker module audio files. + +## Installation + +> Get CRAN version +```{r eval=FALSE} +install.packages("ProTrackR") +``` +> Get development version on github +``` r +install.packages("ProTrackR", repos = c('https://pepijn-devries.r-universe.dev', 'https://cloud.r-project.org')) +``` + +## Usage + +The package comes bundled with a tiny chiptune, which can easily be played like so: + +```{r play_intro, eval=FALSE} +library(ProTrackR) |> + suppressMessages() +data("mod.intro") + +playMod(mod.intro, verbose = FALSE) +``` + +There are plethora of module files available on-line as well. Below you can see how +you can download such a file. It also show how you can select an audio sample +(number 25) from the module and calculate its power spectrum: + +```{r power_cyberride} +elekfunk <- read.module("https://api.modarchive.org/downloads.php?moduleid=41529#elektric_funk.mod") + +spec <- elekfunk |> + PTSample(25) |> + waveform() |> + tuneR::powspec(wintime = 0.1, steptime = 0.001) + +image(log10(spec), col = hcl.colors(100, palette = "Inferno")) +``` + +While we are at it, why not play it: + +```{r play_cyberride, eval=FALSE} +playMod(elekfunk, verbose = FALSE) +``` + +## Developmental status + +It has been a decade since the initial release of this package. Since it's release +a lot has changed in R and in my skill set. I still have plans for this package, +but this requires drastic changes. Therefore, I will only apply minimal maintenance +to this package. Meanwhile I will work on a complete overhaul which will be released +in due time as a new package. This new package will: + + * have the same or similar features as the current package. + * will implement modern R features and try to adhere to + [tidyverse](https::/www.tidyverse.org) principles. + * implement rendering procedures in C++ giving the package a speed boost. + +But until then, please enjoy the current package as is. + +## Further reading + +For some further reading and inspiration please have a look at the following blog +articles: + + * [Chiptunes in R (1)](https://r-coders-anonymous.blogspot.com/2015/09/protrackr-chiptunes-in-r-part-one.html) + * [Chiptunes in R (2)](https://r-coders-anonymous.blogspot.com/2015/11/protrackr-chiptunes-in-r-part-two.html) + * [Chiptunes in R (3)](https://r-coders-anonymous.blogspot.com/2016/11/protrackr-chiptunes-in-r-part-three.html) diff --git a/README.md b/README.md new file mode 100644 index 0000000..dd312f8 --- /dev/null +++ b/README.md @@ -0,0 +1,90 @@ + +# ProTrackR + +ProTracker 2.3a + +[ProTracker](https://en.wikipedia.org/wiki/Protracker) is music +sequencer software from the 1990s on the [Commodore +Amiga](https://en.wikipedia.org/wiki/Amiga) (see screenshot of version +2.3a on the right). This R package is designed to read, process and play +ProTracker module audio files. + +## Installation + +> Get CRAN version + +``` r +install.packages("ProTrackR") +``` + +> Get development version on github + +``` r +install.packages("ProTrackR", repos = c('https://pepijn-devries.r-universe.dev', 'https://cloud.r-project.org')) +``` + +## Usage + +The package comes bundled with a tiny chiptune, which can easily be +played like so: + +``` r +library(ProTrackR) |> + suppressMessages() +data("mod.intro") + +playMod(mod.intro, verbose = FALSE) +``` + +There are plethora of module files available on-line as well. Below you +can see how you can download such a file. It also show how you can +select an audio sample (number 25) from the module and calculate its +power spectrum: + +``` r +elekfunk <- read.module("https://api.modarchive.org/downloads.php?moduleid=41529#elektric_funk.mod") + +spec <- elekfunk |> + PTSample(25) |> + waveform() |> + tuneR::powspec(wintime = 0.1, steptime = 0.001) + +image(log10(spec), col = hcl.colors(100, palette = "Inferno")) +``` + + + +While we are at it, why not play it: + +``` r +playMod(elekfunk, verbose = FALSE) +``` + +## Developmental status + +It has been a decade since the initial release of this package. Since +it’s release a lot has changed in R and in my skill set. I still have +plans for this package, but this requires drastic changes. Therefore, I +will only apply minimal maintenance to this package. Meanwhile I will +work on a complete overhaul which will be released in due time as a new +package. This new package will: + +- have the same or similar features as the current package. +- will implement modern R features and try to adhere to + [tidyverse](https::/www.tidyverse.org) principles. +- implement rendering procedures in C++ giving the package a speed + boost. + +But until then, please enjoy the current package as is. + +## Further reading + +For some further reading and inspiration please have a look at the +following blog articles: + +- [Chiptunes in R + (1)](https://r-coders-anonymous.blogspot.com/2015/09/protrackr-chiptunes-in-r-part-one.html) +- [Chiptunes in R + (2)](https://r-coders-anonymous.blogspot.com/2015/11/protrackr-chiptunes-in-r-part-two.html) +- [Chiptunes in R + (3)](https://r-coders-anonymous.blogspot.com/2016/11/protrackr-chiptunes-in-r-part-three.html) diff --git a/_pkgdown.yml b/_pkgdown.yml new file mode 100644 index 0000000..9215f4d --- /dev/null +++ b/_pkgdown.yml @@ -0,0 +1,11 @@ +url: https://pepijn-devries.github.io/ProTrackR/ +template: + bootstrap: 5 +navbar: + components: + articles: + text: Articles + menu: + - text: Package documentation + href: reference/ProTrackR-package.html + diff --git a/man/PTCell-class.Rd b/man/PTCell-class.Rd index ed2c37a..b7ee20d 100644 --- a/man/PTCell-class.Rd +++ b/man/PTCell-class.Rd @@ -12,11 +12,11 @@ with which effect and what kind of triggers or jumps should be applied. } \details{ The \code{PTCell} class consists of a \code{vector} of four \code{raw} values, -as specified in the `Slots' section. A cell will tell which \code{\link{PTSample}} +as specified in the 'Slots' section. A cell will tell which \code{\link{PTSample}} is to be played at which frequency (corresponding to a note and octave). If no octave or note is specified, nothing will be played, or if a sample was started to play on the same \code{\link{PTTrack}}, this sample will continue -playing. The \code{PTCell} can also hold \code{\link{effect}} codes which +playing. The \code{PTCell} can also hold \code{effect()} codes which can be used to add audio effects to the sample being played, change the speed/tempo at which patterns are played, or trigger jumps to other positions within a \code{\link{PTPattern}} or to other positions in the @@ -25,27 +25,27 @@ within a \code{\link{PTPattern}} or to other positions in the \section{Slots}{ \describe{ -\item{\code{data}}{A \code{vector} of class "\code{raw}" of length 4. The \code{raw} +\item{\code{data}}{A \code{vector} of class \code{raw} of length 4. The \code{raw} data is stored identical to the way it is stored in a ProTracker module file. The \code{character} representation is easier to understand, and with the \link[=ProTrackR-package]{ProTrackR} package it shouldn't be necessary to manipulate the \code{raw} data directly. The structure is illustrated with an example. Let's start with a -\code{character} representation of a \code{PTCell} as an example: "\code{C-3 1B A08}". +\code{character} representation of a \code{PTCell} as an example: \code{"C-3 1B A08"}. The left-hand part of this string shows that this cell will play note "C" in -octave 3. The middle part shows that \code{\link{PTSample}} number \code{0x1B} = \code{27} +octave 3. The middle part shows that \code{\link{PTSample}} number \code{0x1B = 27} will be played. The right-hand part of the string shows that effect "A08" will be applied (which is a volume slide down). -The \code{raw} representation of this example would be "\code{10 d6 ba 08}", -or when I replace the actual values with symbols: "\code{sp pp se ee}". Where -"\code{ss}" represents the sample number, "\code{eee}" represents the \code{\link{effect}} -code and "\code{ppp}" represents the period value. The correct note and octave +The \code{raw} representation of this example would be \code{"10 d6 ba 08"}, +or when I replace the actual values with symbols: \code{"sp pp se ee"}. Where +\code{"ss"} represents the sample number, \code{"eee"} represents the \code{\link[=effect]{effect()}} +code and \code{"ppp"} represents the period value. The correct note and octave can be derived by looking up the period value in the \code{\link{period_table}} -(which is also implemented in the following methods: \code{\link{note}}, -\code{\link{octave}} and \code{\link{periodToChar}}). -The period value \code{0x0d6} = \code{214} corresponds with note "C" +(which is also implemented in the following methods: \code{\link[=note]{note()}}, +\code{\link[=octave]{octave()}} and \code{\link[=periodToChar]{periodToChar()}}). +The period value \code{0x0d6 = 214} corresponds with note "C" in octave 3.} }} diff --git a/man/PTCell-method.Rd b/man/PTCell-method.Rd index 2bee22d..51ca285 100644 --- a/man/PTCell-method.Rd +++ b/man/PTCell-method.Rd @@ -58,7 +58,7 @@ object at the specified indices in object \code{x} needs to be replaced.} When \code{PTCell} is used, a \code{PTCell} object based on \code{x} is returned. -When \code{PTCell<-} is used, object \code{x} is returned in which +When \verb{PTCell<-} is used, object \code{x} is returned in which the selected \code{PTCell} is replaced with \code{value}. } \description{ @@ -71,21 +71,21 @@ the selected \code{PTCell}. Method to coerce \code{x} to class \code{\link{PTCell}}. When \code{x} is \code{raw} data, it should consist of a \code{vector} of -4 elements, formatted as specified in the \link{PTCell-class}. +4 elements, formatted as specified in the \code{\linkS4class{PTCell}}. When \code{x} is a \code{character} string, it should be formatted as follows: -"\code{NNO SS EEE}", where \code{NN} is the note (for instance +"\verb{NNO SS EEE}", where \code{NN} is the note (for instance "C-" or "A#", where the dash has no particular meaning and may be omitted, the hash sign indicates a sharp note). Use a dash if the cell holds no note. \code{O} is the octave (with a value of 0, or a dash, if a note is missing, otherwise any of 1, 2 or 3). \code{SS} is the sample index -number, formatted as two hexadecimal digits (for example `1A'). \code{EEE} is +number, formatted as two hexadecimal digits (for example \verb{1A}). \code{EEE} is a three hexadecimal digit \code{\link{effect}} or trigger code (for more details see the -\code{\link{PTCell-class}}). The method is not case sensitive, so +\code{\linkS4class{PTCell}}). The method is not case sensitive, so you can use both upper and lower case. White spaces are ignored, you can use as many as you would like. A correct \code{character} input for \code{x} -would be for example: "\code{A#2 01 A0F}". An `blank' \code{character} -representation would look like this: "\code{--- 00 000}". +would be for example: \code{"A#2 01 A0F"}. A \code{blank} \code{character} +representation would look like this: \code{"--- 00 000"}. When \code{x} is of class \code{\link{PTTrack}}, \code{\link{PTPattern}}, or \code{\link{PTModule}}, the \code{PTCell} at the specified indices (\code{row}, diff --git a/man/PTModule-class.Rd b/man/PTModule-class.Rd index 4851367..254a289 100644 --- a/man/PTModule-class.Rd +++ b/man/PTModule-class.Rd @@ -29,11 +29,11 @@ and export objects of class \code{PTModule}. \section{Slots}{ \describe{ -\item{\code{name}}{A \code{vector} of length 20 of class "\code{raw}", representing +\item{\code{name}}{A \code{vector} of length 20 of class \code{raw}, representing the name of the \code{PTModule}. The name of a module can be extracted or replaced with the \code{\link{name}} method.} -\item{\code{pattern.order}}{A \code{vector} of length 128 of class "\code{raw}". The +\item{\code{pattern.order}}{A \code{vector} of length 128 of class \code{raw}. The \code{raw} values represent the indices of \code{PTPattern} tables and indicate in which order these patterns need to be played. Note that the \code{raw} values are conform the indices used in ProTracker, starting at zero. In R, indices of @@ -42,18 +42,18 @@ objects start at one. Users need to compensate for this discrepancy theirselves. The pattern order table can be extracted or replaced with the \code{\link{patternOrder}} method.} -\item{\code{pattern.order.length}}{A single value of class "\code{raw}". Indicates +\item{\code{pattern.order.length}}{A single value of class \code{raw}. Indicates the length of the visible (and playable) part of the pattern order table. Use the \code{\link{patternOrderLength}} method to extract or replace the length of a pattern order table of a module.} -\item{\code{tracker.byte}}{A single "\code{raw}" value. Gives an indication of which +\item{\code{tracker.byte}}{A single \code{raw} value. Gives an indication of which Tracker was used to produce a module file. In ProTracker modules, this byte is set to 0x7f, which is also used in \code{PTModule} objects. This value should not be changed.} -\item{\code{tracker.flag}}{A \code{vector} of length 4 of class "\code{raw}", indicates +\item{\code{tracker.flag}}{A \code{vector} of length 4 of class \code{raw}, indicates the version of a module, which basically reflects how many patterns the module can hold. For details, and extracting and replacing this flag see the \code{\link{trackerFlag}} method.} diff --git a/man/PTPattern-class.Rd b/man/PTPattern-class.Rd index b7db161..e8b39b9 100644 --- a/man/PTPattern-class.Rd +++ b/man/PTPattern-class.Rd @@ -38,7 +38,7 @@ table. This method can also be used to extract or replace patterns in \section{Slots}{ \describe{ -\item{\code{data}}{A \code{matrix} (64 rows, 16 columns) of class "\code{raw}". +\item{\code{data}}{A \code{matrix} (64 rows, 16 columns) of class \code{raw}. Each row contains the \code{raw} concatenated data of 4 \code{\link{PTCell}} objects, representing each of the 4 audio channels/tracks (as each \code{\link{PTCell}} object holds 4 \code{raw} values, each row holds 4 x 4 = 16 \code{raw} diff --git a/man/PTPattern-method.Rd b/man/PTPattern-method.Rd index 1dd8f24..f7c2bcf 100644 --- a/man/PTPattern-method.Rd +++ b/man/PTPattern-method.Rd @@ -37,7 +37,7 @@ object at the specified \code{index} in object \code{x} needs to be replaced.} When \code{PTPattern} is used, a \code{PTPattern} object based on \code{x} is returned. -When \code{PTPattern<-} is used, object \code{x} is returned in which +When \verb{PTPattern<-} is used, object \code{x} is returned in which the selected \code{PTPattern} is replaced with \code{value}. } \description{ @@ -52,12 +52,12 @@ When \code{x} is a 64 by 16 \code{matrix} of \code{raw} data, each row implicitly represents the \code{\link{PTCell}} objects of each of the four tracks. Each \code{\link{PTCell}} consists of four \code{raw} values. The values in each row are formatted accordingly, where the values of the -cells of each track are concatenated. See \code{\link{PTCell-class}} documentation for +cells of each track are concatenated. See \code{\linkS4class{PTCell}} documentation for more details on the \code{raw} format of a \code{\link{PTCell}} object. When \code{x} is a 64 by 16 \code{matrix} of \code{character} representations of \code{\link{PTCell}} objects, the \code{character} representation must be -conform the specifications as documented at the \code{\link{PTCell-class}}. +conform the specifications as documented at the \code{\linkS4class{PTCell}}. When \code{x} is of class \code{\link{PTModule}}, the \code{PTPattern} at the specified index (\code{pattern}) is returned, or can be replaced. diff --git a/man/PTSample-class.Rd b/man/PTSample-class.Rd index 9cc38cd..3077d7c 100644 --- a/man/PTSample-class.Rd +++ b/man/PTSample-class.Rd @@ -12,37 +12,37 @@ This class holds audio fragments with meta-information, to be used in \details{ This class holds audio fragments with meta-information (so-called samples), to be used in \code{\link{PTModule}} objects. This class extends -the \code{\link[tuneR]{Wave}} class from \code{\link[tuneR]{tuneR}}. It therewith inherits -all properties and cool methods available from the \code{\link[tuneR]{tuneR}} package. -This allows you, for instance, to generate power spectra (\code{\link[tuneR]{powspec}}) -of them. You can also plot the waveform with the \code{\link[tuneR]{plot-Wave}} method. -See \code{\link[tuneR]{tuneR}} for all possibilities with \code{\link[tuneR]{Wave}} +the \code{\link[tuneR:Wave]{tuneR::Wave}} class from \code{\link[tuneR:tuneR]{tuneR::tuneR}}. It therewith inherits +all properties and cool methods available from the \code{\link[tuneR:tuneR]{tuneR::tuneR}} package. +This allows you, for instance, to generate power spectra (\code{\link[tuneR:powspec]{tuneR::powspec}}) +of them. You can also plot the waveform with the \code{\link[tuneR:plot-Wave]{plot-Wave}} method. +See \code{\link[tuneR:tuneR]{tuneR::tuneR}} for all possibilities with \code{\link[tuneR:Wave]{tuneR::Wave}} objects. If you want you can also explicitly coerce \code{\link{PTSample}} to -\code{\link[tuneR]{Wave}} objects like this: \code{as(new("PTSample"), "Wave")}. +\code{\link[tuneR:Wave]{tuneR::Wave}} objects like this: \code{as(new("PTSample"), "Wave")}. The \code{\link{PTSample}} class has some slots that are additional to the -\code{\link[tuneR]{Wave}} class, as ProTracker requires additional information on +\code{\link[tuneR:Wave]{tuneR::Wave}} class, as ProTracker requires additional information on the sample with respect to its name, fine tune, volume and loop positions. -The \code{\link{PTSample}} class restricts the enherited \code{\link[tuneR]{Wave}} +The \code{\link{PTSample}} class restricts the enherited \code{\link[tuneR:Wave]{tuneR::Wave}} class such that it will only hold 8 bit, mono, pcm waves with a maximum of \code{2*0xffff = 131070} samples, as per ProTracker standards. The length should always be even. \code{PTSample}s can be imported and exported using the -\code{\link{read.sample}} ans \code{\link{write.sample}} methods respectively. -\code{\link[tuneR]{Wave}} objects and \code{raw} data can be coerced to +\code{\link{read.sample}} and \code{\link{write.sample}} methods respectively. +\code{\link[tuneR:Wave]{tuneR::Wave}} objects and \code{raw} data can be coerced to \code{PTSample}s with the \code{\link{PTSample-method}}. } \section{Slots}{ \describe{ -\item{\code{name}}{A \code{vector} of length 22 of class "\code{raw}", representing +\item{\code{name}}{A \code{vector} of length 22 of class \code{raw}, representing the name of the \code{PTSample}. It is often used to include descriptive information in a \code{\link{PTModule}}. The name of a sample can be extracted or replaced with the \code{\link{name}} method.} -\item{\code{finetune}}{Single value of class "\code{raw}". The \code{\link{loNybble}} +\item{\code{finetune}}{Single value of class \code{raw}. The \code{\link{loNybble}} of the \code{raw} value, represents the sample fine tune value ranging from -8 up to 7. This value is used to tweak the playback sample rate, in order to tune it. Negative values will lower the sample rate of notes, positive values will @@ -51,12 +51,12 @@ notes and fine tune values are stored in the \code{\link{period_table}}. The fine tune value can be extracted or replace with the \code{\link{fineTune}} method.} -\item{\code{volume}}{Single value of class "\code{raw}". The raw data corresponds with +\item{\code{volume}}{Single value of class \code{raw}. The raw data corresponds with the default playback volume of the sample. It ranges from 0 (silent) up to 64 (maximum volume). The volume value can be extracted or replaced with the \code{\link{volume}} method.} -\item{\code{wloopstart}}{A \code{vector} of length 2 of class "\code{raw}". The \code{raw} +\item{\code{wloopstart}}{A \code{vector} of length 2 of class \code{raw}. The \code{raw} data represent a single unsigned number representing the starting position of a loop in the sample. It should have a value of \code{0} when there is no loop. Its value could range from \code{0} up to \code{0xffff}. To get the actual position @@ -65,7 +65,7 @@ can only be even. The sum of the loop start position and the loop length should not exceed the \code{\link{sampleLength}}. Its value can be extracted or replaced with the \code{\link{loopStart}} method.} -\item{\code{wlooplen}}{A \code{vector} of length 2 of class "\code{raw}". The \code{raw} +\item{\code{wlooplen}}{A \code{vector} of length 2 of class \code{raw}. The \code{raw} data represent a single unsigned number representing the length of a loop in the sample. To get the actual length in bytes, this value needs to be multiplied by 2 and can therefore only be even. It should have a value of @@ -76,27 +76,27 @@ loop start position and the loop length should not exceed the \code{\link{sampleLength}}. Its value can be extracted or replaced with the \code{\link{loopLength}} method.} -\item{\code{left}}{Object of class "\code{numeric}" representing the waveform of the +\item{\code{left}}{Object of class \code{numeric} representing the waveform of the left channel. Should be \code{integer} values ranging from 0 up to 255. It can be extracted or replaced with the \code{\link{waveform}} method.} -\item{\code{right}}{Object of class "\code{numeric}" representing the right channel. -This slot is inherited from the \code{\link[tuneR]{Wave}} class and should be +\item{\code{right}}{Object of class \code{numeric} representing the right channel. +This slot is inherited from the \code{\link[tuneR:Wave]{tuneR::Wave}} class and should be \code{numeric(0)} for all \code{PTSample}s, as they are all mono.} -\item{\code{stereo}}{Object of class "\code{logical}" whether this is a stereo representation. -This slot is inherited from the \code{\link[tuneR]{Wave}} class. As +\item{\code{stereo}}{Object of class \code{logical} whether this is a stereo representation. +This slot is inherited from the \code{\link[tuneR:Wave]{tuneR::Wave}} class. As \code{PTSample}s are always mono, this slot should have the value \code{FALSE}.} -\item{\code{samp.rate}}{Object of class "\code{numeric}" representing the sampling rate.} +\item{\code{samp.rate}}{Object of class \code{numeric} representing the sampling rate.} -\item{\code{bit}}{Object of class "\code{numeric}" representing the bit-wise quality. -This slot is inherited from the \code{\link[tuneR]{Wave}} class. As +\item{\code{bit}}{Object of class \code{numeric} representing the bit-wise quality. +This slot is inherited from the \code{\link[tuneR:Wave]{tuneR::Wave}} class. As \code{PTSample}s are always of 8 bit quality, the value of this slot should always be 8.} -\item{\code{pcm}}{Object of class "\code{logical}" indicating whether wave format is PCM. -This slot is inherited from the \code{\link[tuneR]{Wave}} class, for +\item{\code{pcm}}{Object of class \code{logical} indicating whether wave format is PCM. +This slot is inherited from the \code{\link[tuneR:Wave]{tuneR::Wave}} class, for \code{PTSample}s its value should always be \code{TRUE}.} }} diff --git a/man/PTSample-method.Rd b/man/PTSample-method.Rd index 00ea5a7..f0b7c77 100644 --- a/man/PTSample-method.Rd +++ b/man/PTSample-method.Rd @@ -19,7 +19,7 @@ \S4method{PTSample}{PTModule,numeric,PTSample}(x, index) <- value } \arguments{ -\item{x}{Object (any of class \code{\link[tuneR]{Wave}}, a \code{vector} +\item{x}{Object (any of class \code{\link[tuneR:Wave]{tuneR::Wave}}, a \code{vector} of \code{raw} data, or of class \code{\link{PTModule}}) that needs to be coerced to a \code{\link{PTSample}} object. In the latter case, the object can also be replaced.} @@ -34,7 +34,7 @@ object at the specified \code{index} in object \code{x} needs to be replaced.} When \code{PTSample} is used, a \code{PTSample} object based on \code{x} is returned. -When \code{PTSample<-} is used, object \code{x} is returned in which +When \verb{PTSample<-} is used, object \code{x} is returned in which the selected \code{PTSample} is replaced with \code{value}. } \description{ @@ -45,7 +45,7 @@ the selected \code{PTSample}. \details{ Method to coerce \code{x} to class \code{\link{PTSample}}. -When \code{x} is a \code{\link[tuneR]{Wave}} object, this method will not +When \code{x} is a \code{\link[tuneR:Wave]{tuneR::Wave}} object, this method will not resample it. However, the sample rate will be adjusted and samples exeeding the maximum length of \code{2*0xffff} = \code{131070} will be clipped to this maximum length. When \code{x} is a stereo sample, it will be converted to diff --git a/man/PTTrack-class.Rd b/man/PTTrack-class.Rd index 95f1e86..3397fb3 100644 --- a/man/PTTrack-class.Rd +++ b/man/PTTrack-class.Rd @@ -26,9 +26,9 @@ Use the \code{\link{PTTrack-method}} to construct or coerce objects to a \section{Slots}{ \describe{ -\item{\code{data}}{A \code{matrix} (64 rows, 4 columns) of class "\code{raw}". +\item{\code{data}}{A \code{matrix} (64 rows, 4 columns) of class \code{raw}. Each row implicetely represents a \code{\link{PTCell}} object, where -the raw data is formatted as specified at the \code{\link{PTCell-class}} +the raw data is formatted as specified at the \code{\linkS4class{PTCell}} documentation. Use the \code{\link{PTCell-method}} to make an element of a \code{PTTrack} object explictly of class \code{\link{PTCell}}. Row numbers correspond with the row numbers of \code{\link{PTPattern}} diff --git a/man/PTTrack-method.Rd b/man/PTTrack-method.Rd index 141096f..c2500c6 100644 --- a/man/PTTrack-method.Rd +++ b/man/PTTrack-method.Rd @@ -53,7 +53,7 @@ object at the specified indices in object \code{x} needs to be replaced.} When \code{PTTrack} is used, a \code{PTTrack} object based on \code{x} is returned. -When \code{PTTrack<-} is used, object \code{x} is returned in which +When \verb{PTTrack<-} is used, object \code{x} is returned in which the selected \code{PTTrack} is replaced with \code{value}. } \description{ @@ -66,12 +66,12 @@ Method to coerce \code{x} to class \code{\link{PTTrack}}. When \code{x} is a 64 by 4 \code{matrix} of \code{raw} data, each row implicitly represents a \code{\link{PTCell}} object and should -be formatted accordingly. See \code{\link{PTCell-class}} documentation for +be formatted accordingly. See \code{\linkS4class{PTCell}} documentation for more details. When \code{x} is a 64 element \code{vector} of \code{character} representation of \code{\link{PTCell}} objects, the \code{character} representation must be -conform the specifications as documented at the \code{\link{PTCell-class}}. +conform the specifications as documented at the \code{\linkS4class{PTCell}}. When \code{x} is of class \code{\link{PTPattern}}, or \code{\link{PTModule}}, the \code{PTTrack} at the specified indices diff --git a/man/ProTrackR-package.Rd b/man/ProTrackR-package.Rd index a4bd3e8..b8e566b 100644 --- a/man/ProTrackR-package.Rd +++ b/man/ProTrackR-package.Rd @@ -25,7 +25,7 @@ Some experience with ProTracker (or any other music tracker) will promote the ease of use of this package. However, the provided documentation and exernal links should help you, when you're starting from scratch. A good place to start reading -this manual would be the documentation of the \code{\link{PTModule-class}}, +this manual would be the documentation of the \code{\linkS4class{PTModule}}, which describes the structure of a ProTracker module and how it is implemented in this package. You should also have a look at the documentation of the \code{\link{PTPattern}}, \code{\link{PTTrack}}, \code{\link{PTCell}} and @@ -34,25 +34,18 @@ of the \code{\link{PTPattern}}, \code{\link{PTTrack}}, \code{\link{PTCell}} and } \section{Current issues and future developments}{ -This package is far from perfect, but it is in such a state that it can -be useful to others, and have therefore published it. There's much room -for improvement and I intend to work on that. -However, as I'm working on this project in my spare time, developments -may not move forwards as fast as I'd like them to, or may eventually even -come to a halt. Keeping this disclaimer in mind, there are some minor -revisions I will try to work on the coming time. +For the development state of this package, please check the +\href{https::pepijn.devries.github.com/ProTrackR/}{README section on GitHub}. Currently, not all effect commands are implemented, although most common ones are. I will work on implementing the remaining effect commands (see also section below). ProTracker also has specific interpretations that -are currently not all implemented correctly. I will also try to fix this -in future versions. +are currently not all implemented correctly. Sample switching (that is when a module switches from one sample number to another, without specifying a new note) is also something that is implemented differently by varying module players. This package currently does not implement -such switches conform ProTracker specs. This will also be addressed in -future versions. +such switches conform ProTracker specs. Period values, which dictate at which fequency samples should be played, are censored both by Amiga hardware and software coded limits in the original @@ -61,7 +54,7 @@ attempt to implement these bounds in the current version of the package after consulting with Olav S\ifelse{latex}{\out{{\o}}}{\ifelse{html}{\out{ø}}{o}}rensen (who created a ProTracker clone for modern machines: \url{https://16-bits.org/pt.php}). -I'm really greatful for his input and doing some checks on an actual +I'm really grateful for his input and doing some checks on an actual Amiga. I also realise that the documentation of this package may be a bit cryptic @@ -75,16 +68,16 @@ feedback such that I can improve the quality of this package. As explained before, effect commands are composed of a three hexadecimal digits. The first digit indicates the type of effect, trigger or jump that should be applied, the latter two digits indicate the magnitude of the effect. An exception are -commands starting with the digit `E', for which the first two digits specify +commands starting with the digit 'E', for which the first two digits specify the type of effect and only the last digit represents the magnitude. Below all available effect commands (or codes if you will) are listed with the -magnitudes labelled `x' or `xy'. The overview shows which commands are used +magnitudes labelled 'x' or 'xy'. The overview shows which commands are used for which kind of effect and whether it is implemented (between brackets) in the playing routines of this package. But first a few words on speed and tempo in ProTracker. Both are two sides of the same coin, both affect the overall speed with which patterns are played. -Speed is defined as the number of `ticks' per pattern row and tempo sets +Speed is defined as the number of 'ticks' per pattern row and tempo sets the duration of each tick. So by increasing the speed value, or decreasing the tempo, the overall playing speed of the pattern table is reduced. At the default tempo of 125, the duration @@ -93,48 +86,45 @@ and 1/60 seconds NTSC video systems). They can be set with the Fxy command. On the Commodore Amiga the chip responsible for audio output (Paula), the audio playback of samples can be controlled by the user in two ways: -the playback rate of the sample can be changed by specifying `period' +the playback rate of the sample can be changed by specifying 'period' values (see e.g. \code{\link{periodToSampleRate}}) and specifying a volume which is linearly scaled between 0 (silent) and 64 (maximum). Period and volumes can only be changed at the start of each tick. This is why the effects will be affected by the speed setting, but not the tempo. -And now, without further ado, the overview of effect commands: -\tabular{llll}{ - Code \tab Effect \tab Description \tab Status\cr - 0xy \tab Arpeggio \tab This effect alternates the pitch each tick to simulate a chord. xy needs to be greater then 00. First the specified note is played, then the pitch is increased with x semitones, then with y semitones. \tab Partly implemented\cr - 1xy \tab Porta up \tab Decrease the period value with xy every tick but the first. \tab Implemented\cr - 2xy \tab Porta down \tab Increase the period value with xy every tick but the first. \tab Implemented\cr - 3xy \tab Porta to note \tab Change the period value with xy every tick but the first, untill the specified target note is reached. \tab Implemented\cr - 4xy \tab Vibrato \tab Oscillate the pitch with magnitude x. Where y relates to the oscillation frequency. \tab Implemented\cr - 5xy \tab Porta to note + Volume slide \tab A combination of effects 3xy and Axy. \tab Implemented\cr - 6xy \tab Vibrato + Volume slide \tab A combination of effects 4xy and Axy. \tab Implemented\cr - 7xy \tab Tremolo \tab Oscillate the volume with magnitude x. Where y relates to the oscillation frequency. \tab Implemented\cr - 8xy \tab Not implemented \tab This effect command is not implemented in ProTracker, nor will it be in this package. \tab Not implemented\cr - 9xy \tab Set sample offset \tab This effect causes the note to start playing at an offset (of 256 times xy samples) into the sample, - instead of just from the start. \tab Implemented\cr - Axy \tab Volume slide \tab Change the volume every but the first tick: increase with x, decrease with y. \tab Implemented\cr - Bxy \tab Position jump \tab Jump to position xy of the \code{\link{patternOrder}} table. \tab Implemented\cr - Cxy \tab Set volume \tab Set the volume with xy. \tab Implemented\cr - Dxy \tab Pattern break \tab Break to row xy in the next pattern. Note: xy is (even though it is a hexadecimal) interpreted as a decimal. \tab Implemented\cr - E0x \tab Turn filter on/off \tab If x is even, the (emulated) hardware filter is turned on (for all tracks). It is turned off if x is odd. \tab Implemented\cr - E1x \tab Porta up (fine) \tab The period value is decreased with x, at the first tick. \tab Implemented\cr - E2x \tab Porta down (fine) \tab The period value is increased with x, at the first tick. \tab Implemented\cr - E3x \tab Glissando Control \tab This effect causes a change in the effect 3xy (porta to note). It toggles - whether to do a smooth slide or whether to slide in jumps of semitones. When x is 0 it uses a smooth slide, non-zero values will result in jumps. \tab Not yet implemented\cr - E4x \tab Vibrato Waveform \tab This effect sets the waveform for the vibrato command to follow. With x modulo 4 equals 0, a sine wave is used, with 1 ramp down, with 2 or 3 a square wave. Values greater than 4 causes the ossicating waveform not to retrigger it when a new note is played. \tab Implemented\cr - E5x \tab Set finetune \tab Set the finetune with x, where x is interpreted as a signed nybble. \tab Partly implemented\cr - E6x \tab Pattern loop \tab Set pattern loop start with E60, and loop x times when x is non-zero. \tab Implemented\cr - E7x \tab Tremolo waveform \tab Same as E4x, but this controls the wave form for the tremolo effect (7xy) rather then the vibrato effect. \tab Implemented\cr - E8x \tab Not implemented \tab According to official documentation this command is not implemented in ProTracker, but it is. Applies a filter on a looped sample, therewith destroying the original sample data. \tab Not implemented\cr - E9x \tab Retrigger note \tab Retrigger the note every x-th tick. \tab Implemented\cr - EAx \tab Volume slide up (fine) \tab Increase the volume with x at the first tick. \tab Implemented\cr - EBx \tab Volume slide down (fine) \tab Decrease the volume with x at the first tick. \tab Implemented\cr - ECx \tab Cut note \tab Cut the volume of the note to zero after x ticks. \tab Implemented\cr - EDx \tab Delay note \tab The note is triggered with a delay of x ticks. \tab Implemented\cr - EEx \tab Pattern delay \tab The duration of the row in ticks is multiplied by (x + 1). \tab Implemented\cr - EFx \tab Not implemented \tab According to official documentation this command is not implemented in ProTracker, but it is. It flips sample data in a looped sample, therewith destroying the original sample data. \tab Not implemented\cr - Fxy \tab Set speed or tempo \tab When xy is smaller then 32, it sets the speed in ticks per row. When xy is greater then 31, it will set the tempo, wich is inversely related to the duration of each tick. Speed and tempo can be defined in combination. \tab Implemented +And now, without further ado, the overview of effect commands:\tabular{llll}{ + Code \tab Effect \tab Description \tab Status \cr + 0xy \tab Arpeggio \tab This effect alternates the pitch each tick to simulate a chord. xy needs to be greater then 00. First the specified note is played, then the pitch is increased with x semitones, then with y semitones. \tab Partly implemented \cr + 1xy \tab Porta up \tab Decrease the period value with xy every tick but the first. \tab Implemented \cr + 2xy \tab Porta down \tab Increase the period value with xy every tick but the first. \tab Implemented \cr + 3xy \tab Porta to note \tab Change the period value with xy every tick but the first, untill the specified target note is reached. \tab Implemented \cr + 4xy \tab Vibrato \tab Oscillate the pitch with magnitude x. Where y relates to the oscillation frequency. \tab Implemented \cr + 5xy \tab Porta to note + Volume slide \tab A combination of effects 3xy and Axy. \tab Implemented \cr + 6xy \tab Vibrato + Volume slide \tab A combination of effects 4xy and Axy. \tab Implemented \cr + 7xy \tab Tremolo \tab Oscillate the volume with magnitude x. Where y relates to the oscillation frequency. \tab Implemented \cr + 8xy \tab Not implemented \tab This effect command is not implemented in ProTracker, nor will it be in this package. \tab Not implemented \cr + 9xy \tab Set sample offset \tab This effect causes the note to start playing at an offset (of 256 times xy samples) into the sample, instead of just from the start. \tab Implemented \cr + Axy \tab Volume slide \tab Change the volume every but the first tick: increase with x, decrease with y. \tab Implemented \cr + Bxy \tab Position jump \tab Jump to position xy of the \code{\link{patternOrder}} table. \tab Implemented \cr + Cxy \tab Set volume \tab Set the volume with xy. \tab Implemented \cr + Dxy \tab Pattern break \tab Break to row xy in the next pattern. Note: xy is (even though it is a hexadecimal) interpreted as a decimal. \tab Implemented \cr + E0x \tab Turn filter on/off \tab If x is even, the (emulated) hardware filter is turned on (for all tracks). It is turned off if x is odd. \tab Implemented \cr + E1x \tab Porta up (fine) \tab The period value is decreased with x, at the first tick. \tab Implemented \cr + E2x \tab Porta down (fine) \tab The period value is increased with x, at the first tick. \tab Implemented \cr + E3x \tab Glissando Control \tab This effect causes a change in the effect 3xy (porta to note). It toggles whether to do a smooth slide or whether to slide in jumps of semitones. When x is 0 it uses a smooth slide, non-zero values will result in jumps. \tab Not yet implemented \cr + E4x \tab Vibrato Waveform \tab This effect sets the waveform for the vibrato command to follow. With x modulo 4 equals 0, a sine wave is used, with 1 ramp down, with 2 or 3 a square wave. Values greater than 4 causes the ossicating waveform not to retrigger it when a new note is played. \tab Implemented \cr + E5x \tab Set finetune \tab Set the finetune with x, where x is interpreted as a signed nybble. \tab Partly implemented \cr + E6x \tab Pattern loop \tab Set pattern loop start with E60, and loop x times when x is non-zero. \tab Implemented \cr + E7x \tab Tremolo waveform \tab Same as E4x, but this controls the wave form for the tremolo effect (7xy) rather then the vibrato effect. \tab Implemented \cr + E8x \tab Not implemented \tab According to official documentation this command is not implemented in ProTracker, but it is. Applies a filter on a looped sample, therewith destroying the original sample data. \tab Not implemented \cr + E9x \tab Retrigger note \tab Retrigger the note every x-th tick. \tab Implemented \cr + EAx \tab Volume slide up (fine) \tab Increase the volume with x at the first tick. \tab Implemented \cr + EBx \tab Volume slide down (fine) \tab Decrease the volume with x at the first tick. \tab Implemented \cr + ECx \tab Cut note \tab Cut the volume of the note to zero after x ticks. \tab Implemented \cr + EDx \tab Delay note \tab The note is triggered with a delay of x ticks. \tab Implemented \cr + EEx \tab Pattern delay \tab The duration of the row in ticks is multiplied by (x + 1). \tab Implemented \cr + EFx \tab Not implemented \tab According to official documentation this command is not implemented in ProTracker, but it is. It flips sample data in a looped sample, therewith destroying the original sample data. \tab Not implemented \cr + Fxy \tab Set speed or tempo \tab When xy is smaller then 32, it sets the speed in ticks per row. When xy is greater then 31, it will set the tempo, wich is inversely related to the duration of each tick. Speed and tempo can be defined in combination. \tab Implemented \cr } } @@ -143,29 +133,27 @@ And now, without further ado, the overview of effect commands: The interpretation of the effect commands can be tedious. They often vary between module players. Even ProTracker can have a quirky (and unexpected) ways of handling the effect commands. This package aims at staying as close to -ProTracker `standards' as possible. +ProTracker 'standards' as possible. The current version already implements most effect commands and common quirks when it comes to their interpretation. My subjective estimate is that it will correctly play roughly 95\% of the ProTracker modules on \href{https://modarchive.org}{ModArchive}. Some Less common unexpected behaviour is documented by the team behind \href{https://wiki.openmpt.org/Main_Page}{OpenMPT}, for which they developed several test cases. The table below shows which test cases this package passes -and which it does not. It is the intention to pass more of the tests in future -versions. -\tabular{ll}{ - Test module \tab Status\cr - \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#AmigaLimitsFinetune.mod}{AmigaLimitsFinetune.mod} \tab Fail\cr - \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#ArpWraparound.mod}{ArpWraparound.mod} \tab Fail\cr - \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#DelayBreak.mod}{DelayBreak.mod} \tab Pass\cr - \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#finetune.mod}{finetune.mod} \tab Fail\cr - \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PatLoop-Break.mod}{PatLoop-Break.mod} \tab Pass\cr - \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PatternJump.mod}{PatternJump.mod} \tab Pass\cr - \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PortaSmpChange.mod}{PortaSmpChange.mod} \tab Fail\cr - \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PortaTarget.mod}{PortaTarget.mod} \tab Pass\cr - \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PTInstrSwap.mod}{PTInstrSwap.mod} \tab Fail\cr - \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#ptoffset.mod}{ptoffset.mod} \tab Pass\cr - \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PTSwapEmpty.mod}{PTSwapEmpty.mod} \tab Fail\cr - \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#VibratoReset.mod}{VibratoReset.mod} \tab Pass +and which it does not.\tabular{ll}{ + Test module \tab Status \cr + \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#AmigaLimitsFinetune.mod}{AmigaLimitsFinetune.mod} \tab Fail \cr + \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#ArpWraparound.mod}{ArpWraparound.mod} \tab Fail \cr + \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#DelayBreak.mod}{DelayBreak.mod} \tab Pass \cr + \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#finetune.mod}{finetune.mod} \tab Fail \cr + \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PatLoop-Break.mod}{PatLoop-Break.mod} \tab Pass \cr + \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PatternJump.mod}{PatternJump.mod} \tab Pass \cr + \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PortaSmpChange.mod}{PortaSmpChange.mod} \tab Fail \cr + \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PortaTarget.mod}{PortaTarget.mod} \tab Pass \cr + \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PTInstrSwap.mod}{PTInstrSwap.mod} \tab Fail \cr + \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#ptoffset.mod}{ptoffset.mod} \tab Pass \cr + \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#PTSwapEmpty.mod}{PTSwapEmpty.mod} \tab Fail \cr + \href{https://wiki.openmpt.org/Development:_Test_Cases/MOD#VibratoReset.mod}{VibratoReset.mod} \tab Pass \cr } } @@ -181,9 +169,18 @@ A tutorial on ProTracker on YouTube: Some informal but extensive technical documentation on ProTracker: \url{ftp://ftp.modland.com/pub/documents/format_documentation/Protracker\%20effects\%20(FireLight)\%20(.mod).txt} +} +\seealso{ +Useful links: +\itemize{ + \item \url{https://pepijn-devries.github.io/ProTrackR/} + \item \url{https:://www.github.com/pepijn-devries/ProTrackR/} + \item Report bugs at \url{https://github.com/pepijn-devries/ProTrackR/issues} +} + } \author{ -\strong{Maintainer}: Pepijn de Vries \email{pepijn.devries@outlook.com} [data contributor] +\strong{Maintainer}: Pepijn de Vries \email{pepijn.devries@outlook.com} (\href{https://orcid.org/0000-0002-7961-6646}{ORCID}) [data contributor] } \keyword{internal} diff --git a/man/as.character.Rd b/man/as.character.Rd index 3593171..e831440 100644 --- a/man/as.character.Rd +++ b/man/as.character.Rd @@ -38,7 +38,7 @@ in turn is an element of a \code{\link{PTPattern}}. A \code{\link{PTPattern}} tells a tracker which sample to play at which frequency on which of the four audio channels and with which effects. A \code{\link{PTCell}} in essence holds all this information as described at the documentation of -the \code{\link{PTCell-class}}. +the \code{\linkS4class{PTCell}}. Data in these objects are stored in these objects in a \code{raw} form, to save working memory and to comply to the ProTracker file specifications. diff --git a/man/as.raw.Rd b/man/as.raw.Rd index 1018919..2c3730e 100644 --- a/man/as.raw.Rd +++ b/man/as.raw.Rd @@ -39,15 +39,15 @@ object cannot be replaced.} If \code{x} is a \code{PTCell} object, \code{value} should be a \code{vector} of four \code{raw} values (conform specifications -provided at the documentation of the \code{\link{PTCell-class}}). +provided at the documentation of the \code{\linkS4class{PTCell}}). If \code{x} is a \code{PTTrack} object, \code{value} should be a 64 by 4 \code{matrix} holding \code{raw} values (conform specifications -provided at the documentation of the \code{\link{PTTrack-class}}). +provided at the documentation of the \code{\linkS4class{PTTrack}}). If \code{x} is a \code{PTPattern} object, \code{value} should be a 64 by 16 \code{matrix} holding \code{raw} values (conform specifications -provided at the documentation of the \code{\link{PTPattern-class}}).} +provided at the documentation of the \code{\linkS4class{PTPattern}}).} } \value{ For \code{as.raw}, a length 4 vector, 64 by 4 matrix or a 64 by 16 @@ -57,7 +57,7 @@ matrix of \code{raw} data is returned, when x is of class \code{PTCell}, If \code{x} is a \code{PTModule} object, the \code{raw} data returned will have the same format as the ProTracker file format. -For \code{as.raw<-}, a copy of object \code{x} is returned in which the +For \verb{as.raw<-}, a copy of object \code{x} is returned in which the \code{raw} data is replaced by \code{value}. } \description{ @@ -72,7 +72,7 @@ in turn is an element of a \code{\link{PTPattern}}. A \code{\link{PTPattern}} tells a tracker which sample to play at which frequency on which of the four audio channels and with which effects. A \code{\link{PTCell}} in essence holds all this information as described at the documentation of -the \code{\link{PTCell-class}}. +the \code{\linkS4class{PTCell}}. Data in these objects are stored in these objects in a \code{raw} form, to save working memory and to comply to the ProTracker file specifications diff --git a/man/effect.Rd b/man/effect.Rd index 69104fd..6ed8774 100644 --- a/man/effect.Rd +++ b/man/effect.Rd @@ -22,7 +22,7 @@ meaningful effects.} For \code{effect}, a \code{character} string with the three hexadecimal digit effect code will be returned. -For \code{effect<-}, a copy of object \code{x} with effect code \code{value} +For \verb{effect<-}, a copy of object \code{x} with effect code \code{value} will be returned. } \description{ diff --git a/man/figures/README-power_cyberride-1.png b/man/figures/README-power_cyberride-1.png new file mode 100644 index 0000000000000000000000000000000000000000..838b94609a2f70cd3c38b54fbc797dbba1c1cd68 GIT binary patch literal 113391 zcmeFZWm6nX6E3{FxU;xB1os;V?(XjH?kZzLPzPhVpRh4DXkcp51005ettfV>s04f9kfZK>L|5lXL+2H>%N~(&Q zQvX;0fFA&`2JrI(_>%zEttcquSm+ES;QuJVd^A`BOjzP<*iu~Bvb@*||K$D&@dK>+ zlhy>Wl|->sC9ySRv9%Skbk(r*wXlrzz$V6EGjp(o^}ii4t*l!=958KMFzq}r9egnz z12LT;m@biE*I2MyJeGSBKOo5(khJ!ZjO~$*{UtX^@GBzfy%3e z*0a?b(E8EZ`ti|D@7c}h(Z}LG$nG}Es1+xwIu$vkB<#` z(`{v=JvF^UEv*whwKGG7OH-*EOX0t^pP|nGK|MHceOYew5=^jcM9x9n1esDZA{P)<(|JW(=*dzHkAon<;@;IUSG_C(MZ~C-s{dyhu z(Q5s%mh|zS|MBrpyMHHtgq*QG{4*z#tE`>}0DwODzX=?5sjvh9C;)PjVw%3W=RfsQ z_hoZvc*H3q1GjsU4847{oSdX1$O*vf)^y@rgYmS^(OYCX*4kP=Gbz;Te?C5BwJb5D z#-jfaPTX4xwrgo=mqZId5Gzi~pZ`1%z8{KgjRpm7-|%j|fG+oh-z(h^j)MY^{~!Io z!2&mIFvlXV7hBAGy-!>3@|hmw4>uoVA5@U{=-#J-o}inDkH_Jl^-&X_R|UW`M##%Y z-(Qi}wvQK+9rOQPX78Q}X!hgw>itb5`03$+B82>dac{ct;ihP`S2g@SQv8bOR`@-A zq<3ogqder{*YMU8^nbh%hCeyE|2pu0^z{SwIHbMn@#Rs6@WYGX*5%#p)#T%-4%*$- zZJg*KFl}L^JpaW0RYQdAzC36P!|Tt5w??whuUYPRr>c^goX)AW)~Wfb=1O}nH5
  • Xno<^5|xB&qOHks3Qi> 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%0DHf!gyd+{!czIFJpw7`Mvhy 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%0A*CC?zuEKGLHS> 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 literal 0 HcmV?d00001 diff --git a/man/fineTune.Rd b/man/fineTune.Rd index f093b84..5a9b150 100644 --- a/man/fineTune.Rd +++ b/man/fineTune.Rd @@ -23,7 +23,7 @@ the fine tune.} For \code{fineTune} the fine tune value, represented by an \code{integer} value ranging from -8 up to 7, is returned. -For \code{fineTune<-} A \code{\link{PTSample}} \code{sample}, updated +For \verb{fineTune<-} A \code{\link{PTSample}} \code{sample}, updated with the fine tune \code{value}, is returned. } \description{ diff --git a/man/funk_table.Rd b/man/funk_table.Rd index f4c75cc..080e0e2 100644 --- a/man/funk_table.Rd +++ b/man/funk_table.Rd @@ -13,7 +13,7 @@ Small list of numbers used by an obscure audio effect in ProTracker } \details{ This dataset is included for completeness sake. It is not yet used by any -class, method or function in the \code{\link[=ProTrackR-package]{ProTrackR}} package. It may +class, method or function in the \link[=ProTrackR-package]{ProTrackR} package. It may very well be obsolete for recent ProTracker versions. } \examples{ diff --git a/man/loopLength.Rd b/man/loopLength.Rd index df8b6e6..68a9b70 100644 --- a/man/loopLength.Rd +++ b/man/loopLength.Rd @@ -21,15 +21,15 @@ samples ranging from 2 up to 131070 (It can be 0 when the sample is empty). The sum of the \code{\link{loopStart}} and \code{\link{loopLength}} should not exceed the \code{\link{sampleLength}}. -Use a \code{value} of either \code{character} "\code{off}" or \code{logical} -"\code{FALSE}", in order to turn off the loop all together.} +Use a \code{value} of either \code{character} \code{"off"} or \code{logical} +\code{FALSE}, in order to turn off the loop all together.} } \value{ For \code{loopLength} the loop length (in samples), represented by an even \code{integer} value ranging from 0 up to 131070, is returned. -For \code{loopLength<-} A \code{\link{PTSample}} \code{sample}, updated -with the loop length `\code{value}', is returned. +For \verb{loopLength<-} A \code{\link{PTSample}} \code{sample}, updated +with the loop length \code{value}, is returned. } \description{ Extract or replace the loop length of a \code{\link{PTSample}}. @@ -37,7 +37,7 @@ Extract or replace the loop length of a \code{\link{PTSample}}. \details{ \code{\link{PTSample}}s can have loops, marked by a starting position and length of the loop (in samples), for more details see the -\code{\link{PTSample-class}}. This method can be used to extract +\code{\linkS4class{PTSample}}. This method can be used to extract the loop length or safely replace its value. } \examples{ diff --git a/man/loopSample.Rd b/man/loopSample.Rd index 7f76f76..fc3b76b 100644 --- a/man/loopSample.Rd +++ b/man/loopSample.Rd @@ -29,7 +29,7 @@ Generate a looped \code{\link{waveform}} of a \code{\link{PTSample}} object. \details{ For playing routines, it can be useful to generate repeats of a sample loop. This method returns the waveform of a \code{\link{PTSample}} where the -loop is repeated `\code{times}' times or has a length of `\code{n_samples}'. +loop is repeated \verb{times`' times or has a length of }n_samples`'. } \examples{ data("mod.intro") diff --git a/man/loopStart.Rd b/man/loopStart.Rd index ce467c5..62fbf4c 100644 --- a/man/loopStart.Rd +++ b/man/loopStart.Rd @@ -20,15 +20,15 @@ needs to be extracted or replace.} samples ranging from 0 up to 131070. The sum of the \code{\link{loopStart}} and \code{\link{loopLength}} should not exceed the \code{\link{sampleLength}}. -Use a \code{value} of either \code{character} "\code{off}" or \code{logical} -"\code{FALSE}", in order to turn off the loop all together.} +Use a \code{value} of either \code{character} \code{"off"} or \code{logical} +\code{FALSE}, in order to turn off the loop all together.} } \value{ For \code{loopStart} the loop start position (in samples), represented by an even \code{integer} value ranging from 0 up to 131070, is returned. -For \code{loopStart<-} A \code{\link{PTSample}} \code{sample}, updated -with the loop start position `\code{value}', is returned. +For \verb{loopStart<-} A \code{\link{PTSample}} \code{sample}, updated +with the loop start position ``value`', is returned. } \description{ Extract or replace the loop start position of a \code{\link{PTSample}}. @@ -36,7 +36,7 @@ Extract or replace the loop start position of a \code{\link{PTSample}}. \details{ \code{\link{PTSample}}s can have loops, marked by a starting position and length of the loop (in samples), for more details see the -\code{\link{PTSample-class}}. This method can be used to extract +\code{\linkS4class{PTSample}}. This method can be used to extract the loop starting position or safely replace its value. } \examples{ diff --git a/man/mod.intro.Rd b/man/mod.intro.Rd index 5ad1114..097576c 100644 --- a/man/mod.intro.Rd +++ b/man/mod.intro.Rd @@ -16,7 +16,7 @@ A \code{\link{PTModule}} object included in the package as example. \details{ This PTModule object is based on an original ProTracker module file I've composed in the late nineteen nineties. It is used as example for many -of the \code{\link[=ProTrackR-package]{ProTrackR}} methods and you can use it to test your own +of the \link[=ProTrackR-package]{ProTrackR} methods and you can use it to test your own code. It can also be exported back to the original ProTracker module file by using \code{\link{write.module}}. } diff --git a/man/modArchive.Rd b/man/modArchive.Rd index a8adcdb..d185b5c 100644 --- a/man/modArchive.Rd +++ b/man/modArchive.Rd @@ -146,21 +146,21 @@ version 0.3.4, other functions will still accept this argument.} \item{page}{Many of the ModArchive returns paginated tables. When this argument is omitted, the first page is returned. Use an integer value to return a specific page. The total number of pages of a search or view is returned as an attribute -to the returned \code{\link[base]{data.frame}}.} +to the returned \link[base:data.frame]{base::data.frame}.} \item{view.query}{A query to be used in combination with the \code{view.by} argument. Use the queries in combination with \code{view.by} as follows: \itemize{ - \item{\code{view_by_list}: Use a single capital starting letter to browse - modules by name} - \item{\code{view_by_rating_comments}: Provide a (user) rating by which you - wish to browse the modules} - \item{\code{view_by_rating_reviews}: Provide a (reviewer) rating by which you - wish to browse the modules} - \item{\code{view_modules_by_artistid}: Provide an artist id number - for whom you wish to browse his/her modules} - \item{\code{view_modules_by_guessed_artist}: Provide an artist guessed - name for whom you wish to browser his/her modules} +\item \code{view_by_list}: Use a single capital starting letter to browse +modules by name +\item \code{view_by_rating_comments}: Provide a (user) rating by which you +wish to browse the modules +\item \code{view_by_rating_reviews}: Provide a (reviewer) rating by which you +wish to browse the modules +\item \code{view_modules_by_artistid}: Provide an artist id number +for whom you wish to browse his/her modules +\item \code{view_modules_by_guessed_artist}: Provide an artist guessed +name for whom you wish to browser his/her modules }} \item{view.by}{Indicate how the \code{modArchive.view.by} function should sort @@ -175,7 +175,7 @@ for. See \url{https://modarchive.org/?xml-api-usage-level3} for details.} \value{ \code{modArchive.info}, \code{modArchive.search.genre}, \code{modArchive.search.hash}, \code{modArchive.random.pick} and -\code{modArchive.view.by} will return a \code{\link{data.frame}} +\code{modArchive.view.by} will return a \link{data.frame} containing information on modules in the ModArchive. Note that this data.frame is formatted differently since ProTrackR 0.3.4, which may cause backward compatibility issues. @@ -213,10 +213,7 @@ The \code{modArchive.download} function will download a module from the archive. Use \code{modArchive.search.artist} to find artist details in the archive. Use \code{modArchive.request.count} to determine how many request you have -made in the current month with the specified key (see `ModArchive API key' -section for details). -Use \code{modArchive.max.requests} to determine how many request you are -allowed to make each month with the provided key (see `ModArchive API key' +made in the current month with the specified key (see \verb{ModArchive API key' section for details). Use }modArchive.max.requests\verb{to determine how many request you are allowed to make each month with the provided key (see}ModArchive API key' section for details). } \section{ModArchive API key}{ @@ -241,8 +238,8 @@ ModArchive helper functions described here. So how do you get your personal API key? First, you need to register at the \href{https://modarchive.org/forums/}{ModArchive Forums}. Then follow the instructions provided in this \href{https://modarchive.org/forums/index.php?topic=1950.0}{topic} -on the forum. For more info, see also the \href{https://modarchive.org/?xml-api}{API -page} on ModArchive. +on the forum. For more info, see also the \href{https://modarchive.org/?xml-api}{API page} +on ModArchive. If you want to search for module files without an API key, one could make use of to the \link{modLand} collection instead. diff --git a/man/modLand.Rd b/man/modLand.Rd index 9f62cd9..5d6fa8a 100644 --- a/man/modLand.Rd +++ b/man/modLand.Rd @@ -27,7 +27,7 @@ are supported by the \code{ProTrackR} package. It is therefore advisable to add keyword `mod' to the search string.} \item{format}{A single length \code{character} vector, indicating the -tracker file format. `\code{Protracker}' is the option that is most likely to work in this package.} +tracker file format. ``Protracker`' is the option that is most likely to work in this package.} \item{author}{A single length \code{character} vector, indicating the module author name. Can be obtained from a \code{modLand.search.mod}.} @@ -45,14 +45,9 @@ the module file needs to be downloaded.} \code{modLand.search.mod} returns a \code{data.frame}. The \code{data.frame} contains a search result in each row. The data.frame contains a number of columns, each containing -\code{character} strings. The column `title' contains the mod file name; -The column named `author' contains the author name; the column named -`format' contains the tracker file format (only `\code{Protracker}' -is supported by this package); The collumn `collect' contains -modLand collections in which the mod is included; the column named -`url' contains a download link for the `ogg'-file generated on the -modLand server from the mod file. Note that ogg-files are not supported -by the ProTrackR package. Use \code{modLand.download.mod} to download +\code{character} strings. The column \verb{title' contains the mod file name; The column named }author' contains the author name; the column named +\verb{format' contains the tracker file format (only ``Protracker}' +is supported by this package); The collumn \verb{collect' contains modLand collections in which the mod is included; the column named }url' contains a download link for the \verb{ogg'-file generated on the modLand server from the mod file. Note that ogg-files are not supported by the ProTrackR package. Use }modLand.download.mod` to download the mod file. \code{modLand.download.mod} attempts to download the specified mod diff --git a/man/modToWave.Rd b/man/modToWave.Rd index 989f01f..0bb6101 100644 --- a/man/modToWave.Rd +++ b/man/modToWave.Rd @@ -23,8 +23,8 @@ \item{video}{The video mode of a Commodore Amiga affects timing routines and the playback sample rate. This mode can be specified with this argument and is represented by a \code{character} string that can have either the value -`\href{https://en.wikipedia.org/wiki/PAL}{PAL}' -or `\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. PAL is used by default.} +'\href{https://en.wikipedia.org/wiki/PAL}{PAL}' +or '\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. PAL is used by default.} \item{target.rate}{A positive \code{integer} sample rate for the target \code{Wave}. Should be at least 2000. @@ -60,24 +60,24 @@ all 4 tracks are selected.} \item{mix}{A logical value indicating whether the 4 Amiga channels should be mixed to the 2 (stereo) output channels. When set to \code{TRUE} (default) a stereo -\code{\link[tuneR]{Wave}} object is returned. When set to \code{FALSE} a -multi-channel \code{\link[tuneR]{WaveMC}} object is returned. The +\code{\link[tuneR:Wave]{tuneR::Wave}} object is returned. When set to \code{FALSE} a +multi-channel \code{\link[tuneR:WaveMC]{tuneR::WaveMC}} object is returned. The \code{stereo.separation} argument is ignored in the latter case.} \item{...}{Additional arguments that are passed to \code{\link{playingtable}}.} } \value{ -A \code{\link[tuneR]{Wave}} object, generated from the -\code{mod} object is returned. A \code{\link[tuneR]{WaveMC}} object is returned when +A \code{\link[tuneR:Wave]{tuneR::Wave}} object, generated from the +\code{mod} object is returned. A \code{\link[tuneR:WaveMC]{tuneR::WaveMC}} object is returned when the \code{mix} argument is set to \code{FALSE}. } \description{ -Converts a \code{\link{PTModule}} object into a \code{\link[tuneR]{Wave}} +Converts a \code{\link{PTModule}} object into a \code{\link[tuneR:Wave]{tuneR::Wave}} object, which can be played, further analysed, modified and saved. } \details{ Before the \code{\link{PTModule}} object can be converted into a -\code{\link[tuneR]{Wave}} object, the rows of the +\code{\link[tuneR:Wave]{tuneR::Wave}} object, the rows of the \code{\link{PTPattern}} objects in the module need to be put in the right order. This method does that by calling \code{\link{playingtable}}. @@ -88,7 +88,7 @@ and the routines described below are applied to each track. On the Commodore Amiga the chip responsible for audio output (Paula), the audio playback of samples can be controlled by the user in two ways: -the playback rate of the sample can be changed by specifying `period' +the playback rate of the sample can be changed by specifying 'period' values (see e.g. \code{\link{periodToSampleRate}}) and specifying a volume which is linearly scaled between 0 (silent) and 64 (maximum). @@ -110,8 +110,8 @@ reduce the target sample rate or turn off the low pass filter. On modern machines, the time required for conversion should generally be less than the playback time of the module. -You can save the resulting \code{\link[tuneR]{Wave}} object by calling -\code{\link[tuneR]{writeWave}}. +You can save the resulting \code{\link[tuneR:Wave]{tuneR::Wave}} object by calling +\code{\link[tuneR:writeWave]{tuneR::writeWave}}. } \note{ As audio can be mixed with this package at frequencies much greater than the diff --git a/man/name.Rd b/man/name.Rd index 48bd64b..a97cc0f 100644 --- a/man/name.Rd +++ b/man/name.Rd @@ -29,7 +29,7 @@ name of \code{\link{PTModule}} or \code{\link{PTSample}} \code{x}.} For \code{name}, the name of the \code{\link{PTModule}} or \code{\link{PTSample}} object as a \code{character} string is returned. -For \code{name<-}, object \code{x} with an updated name is returned. +For \verb{name<-}, object \code{x} with an updated name is returned. } \description{ The name of both a \code{\link{PTModule}} and diff --git a/man/note.Rd b/man/note.Rd index 54c028a..d76201b 100644 --- a/man/note.Rd +++ b/man/note.Rd @@ -20,23 +20,23 @@ value. It can also be a \code{\link{PTCell}} object.} \item{value}{A \code{character} string representing the chromatic scale note with wich the current note needs to be replaced. Should have any of the folling values: -"\code{C-}", "\code{C#}", "\code{D-}", "\code{D#}", "\code{E-}", "\code{F-}", -"\code{F#}", "\code{G-}", "\code{G#}", "\code{A-}", "\code{A#}", "\code{B-}", -or "\code{--}". +\code{"C-"}, \code{"C#"}, \code{"D-"}, \code{"D#"}, \code{"E-"}, \code{"F-"}, +\code{"F#"}, \code{"G-"}, \code{"G#"}, \code{"A-"}, \code{"A#"}, \code{"B-"}, +or \code{"--"}. Right-hand dashes can be omitted from these strings. Both upper and lower case are accepted. If an \code{\link{octave}} is not yet specified for \code{PTCell} \code{x}, it will be set to 1. -Assigning a value of "\code{--}" will remove both the note and octave from +Assigning a value of \code{"--"} will remove both the note and octave from object \code{x}.} } \value{ For \code{note}, a \code{character} string representing the note is returned. -For \code{note<-}, a copy of \code{PTCell} object \code{x} in which the +For \verb{note<-}, a copy of \code{PTCell} object \code{x} in which the note is replaced by \code{value} is returned. } \description{ diff --git a/man/noteManipulation.Rd b/man/noteManipulation.Rd index 0913dec..6bab861 100644 --- a/man/noteManipulation.Rd +++ b/man/noteManipulation.Rd @@ -50,7 +50,7 @@ or raised.} \item{sample.nr}{A single positive \code{integer} value, or a \code{vector} of positive \code{integer}s, listing the indices of samples, for which the notes -need to be lowered or raised. A \code{character} string equal to "\code{all}" +need to be lowered or raised. A \code{character} string equal to \verb{"all}" is also allowed (this is in fact the default), in which case notes of all sample indices are raised or lowered.} } diff --git a/man/noteToPeriod.Rd b/man/noteToPeriod.Rd index 714e8fd..cc42e32 100644 --- a/man/noteToPeriod.Rd +++ b/man/noteToPeriod.Rd @@ -15,7 +15,7 @@ tune an audio sample.} } \value{ Returns the \code{numeric} ProTracker period value for a corresponding -note, octave and \code{\link{fineTune}}. Returns 0 if a note could not be found in the +note, octave and \code{fineTune()}. Returns 0 if a note could not be found in the table. } \description{ diff --git a/man/nybble.Rd b/man/nybble.Rd index e5230eb..b60efc7 100644 --- a/man/nybble.Rd +++ b/man/nybble.Rd @@ -17,7 +17,7 @@ hiNybble(raw_dat) needs to be extracted.} \item{which}{A character string indicating whether the high or low nybble should -be returnd. It should either be "\code{low}" (default) or "\code{high}".} +be returnd. It should either be \code{"low"} (default) or \code{"high"}.} } \value{ A vector of the same length as \code{raw_dat} holding integer values. diff --git a/man/nybbleToSignedInt.Rd b/man/nybbleToSignedInt.Rd index e487ceb..cfeff92 100644 --- a/man/nybbleToSignedInt.Rd +++ b/man/nybbleToSignedInt.Rd @@ -10,8 +10,8 @@ nybbleToSignedInt(raw_dat, which = c("low", "high")) \item{raw_dat}{\code{raw} data (either a single value or a \code{vector}), from which a nybble will be extracted and converted.} -\item{which}{A \code{character} string indicating whether the "\code{low}" (default) -or "\code{high}" nybble of \code{raw_dat} needs to be converted into a signed +\item{which}{A \code{character} string indicating whether the \code{"low"} (default) +or \code{"high"} nybble of \code{raw_dat} needs to be converted into a signed \code{integer}.} } \value{ diff --git a/man/octave.Rd b/man/octave.Rd index 906e4c6..d959ea4 100644 --- a/man/octave.Rd +++ b/man/octave.Rd @@ -29,7 +29,7 @@ a note is already defined.} For \code{octave}, a \code{numeric} value representing the octave number is returned. -For \code{octave<-}, a copy of \code{PTCell} object \code{x} in which the +For \verb{octave<-}, a copy of \code{PTCell} object \code{x} in which the octave number is replaced by \code{value} is returned. } \description{ diff --git a/man/patternOrder.Rd b/man/patternOrder.Rd index d546c1a..31c9017 100644 --- a/man/patternOrder.Rd +++ b/man/patternOrder.Rd @@ -34,7 +34,7 @@ is also not modified in this case.} For \code{patternOrder}, a \code{vector} of \code{numeric} \code{\link{PTPattern}} indices is returned. -For \code{patternOrder<-}, an updated version of object \code{x} is returned, +For \verb{patternOrder<-}, an updated version of object \code{x} is returned, in which the pattern order table is modified based on \code{value}. } \description{ diff --git a/man/patternOrderLength.Rd b/man/patternOrderLength.Rd index 7cc108f..536107a 100644 --- a/man/patternOrderLength.Rd +++ b/man/patternOrderLength.Rd @@ -23,7 +23,7 @@ For \code{patternOrderLength} the visible length of the pattern order table of \code{\link{PTModule}} \code{x} is returned as a \code{numeric} value, ranging from 1 up to 128. -For \code{patternOrderLength<-} an updated version of object \code{x} is +For \verb{patternOrderLength<-} an updated version of object \code{x} is returned, in which the visible length of the pattern order table is set to \code{value}. Note that this does not change the pattern order table itself, only which part is `visible'. diff --git a/man/paula_clock.Rd b/man/paula_clock.Rd index de8f1f8..14224d4 100644 --- a/man/paula_clock.Rd +++ b/man/paula_clock.Rd @@ -7,8 +7,8 @@ \format{ a \code{data.frame} with two columns: \itemize{ - \item{`frequency' A \code{numeric} value representing Paula's output rate in Hz.} - \item{`video' A \code{character} string representing the two video modes.} +\item 'frequency' A \code{numeric} value representing Paula's output rate in Hz. +\item 'video' A \code{character} string representing the two video modes. } } \description{ @@ -19,8 +19,8 @@ original chipset. Paula was one of the custom chips on the original Commodore Amiga. This chip was dedicated (amongst other tasks) to controlling audio playback. The chip's output rate depended on the video mode used: -either `\href{https://en.wikipedia.org/wiki/PAL}{PAL}' -or `\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. This table provides the +either '\href{https://en.wikipedia.org/wiki/PAL}{PAL}' +or '\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. This table provides the output rate for both video modes that can be used in calculating sample rates. } \examples{ diff --git a/man/period_table.Rd b/man/period_table.Rd index 2976d59..15916a5 100644 --- a/man/period_table.Rd +++ b/man/period_table.Rd @@ -7,11 +7,11 @@ \format{ a \code{data.frame} with fourteen columns: \itemize{ - \item{The column named `octave': \code{integer} value [1,3]} - \item{The column named `finetune': \code{integer} value [-8, 7] used to tune a sample} - \item{The columns named `C-' to `B-': represent the twelve (semi)tones. - The values in these columns are the period values for the corresponding - tone, octave and finetune.} +\item The column named 'octave': \code{integer} value [1,3] +\item The column named 'finetune': \code{integer} value [-8, 7] used to tune a sample +\item The columns named 'C-' to `B-': represent the twelve (semi)tones. +The values in these columns are the period values for the corresponding +tone, octave and finetune. } } \description{ diff --git a/man/playMod.Rd b/man/playMod.Rd index 4d3130b..f6e6f9b 100644 --- a/man/playMod.Rd +++ b/man/playMod.Rd @@ -18,12 +18,12 @@ executed while playing.} \item{...}{Arguments that are passed on to \code{\link{modToWave}}.} } \value{ -A \code{\link[tuneR]{Wave}} object, generated from the +A \code{\link[tuneR:Wave]{tuneR::Wave}} object, generated from the \code{mod} object, is returned. } \description{ Converts \code{\link{PTModule}} objects into audio -\code{\link[tuneR]{Wave}}s, and plays them. +\code{\link[tuneR:Wave]{tuneR::Wave}}s, and plays them. } \details{ Unfortunately, it was not feasible to create a routine that can directly diff --git a/man/playSample.Rd b/man/playSample.Rd index 5d815a5..7399fb6 100644 --- a/man/playSample.Rd +++ b/man/playSample.Rd @@ -14,7 +14,7 @@ \item{x}{Either a \code{\link{PTSample}} or a \code{\link{PTModule}} object. In the latter case, all samples in the module will be played in order.} -\item{silence}{Especially for short samples, the \code{\link[audio]{play}} routine +\item{silence}{Especially for short samples, the \code{\link[audio:play]{audio::play}} routine can be a bit buggy: playing audible noise, ticks or parts from other samples at the end of the sample. By adding silence after the sample, this problem is evaded. Use this argument to specify the duration of this silence in seconds. When, \code{x} is a @@ -27,10 +27,10 @@ When set to \code{FALSE}, subsequent R code will be executed while playing.} \item{note}{A \code{character} string specifying the note to be used for calculating the playback sample rate (using \code{\link{noteToSampleRate}}). -It should start with the note (ranging from `A' up to `G') optionally followed -by a hash sign (`#') if a note is sharp (or a dash (`-') if it's not) and finally +It should start with the note (ranging from \verb{A' up to }G') optionally followed +by a hash sign (\verb{#') if a note is sharp (or a dash (}-') if it's not) and finally the octave number (ranging from 1 up to 3). A valid notation would for instance -be `F#3'. +be 'F#3'. The \code{\link{fineTune}} as specified for the sample will also be used as an argument for calculating the playback rate. A custom \code{finetune} can also be passed as an argument to \code{\link{noteToSampleRate}}.} @@ -54,7 +54,7 @@ Method to play \code{\link{PTSample}}s or all such samples from } \details{ This method plays \code{\link{PTSample}}s and such samples from -\code{\link{PTModule}} objects, using the \code{\link[audio]{play}} method +\code{\link{PTModule}} objects, using the \code{\link[audio:play]{audio::play}} method from the audio package. Default \code{\link{fineTune}} and \code{\link{volume}} as specified for the \code{\link{PTSample}} will be applied when playing the sample. diff --git a/man/playWave.Rd b/man/playWave.Rd index a0e5b8d..955b4a4 100644 --- a/man/playWave.Rd +++ b/man/playWave.Rd @@ -11,8 +11,8 @@ \S4method{playWave}{WaveMC}(wave, wait = T) } \arguments{ -\item{wave}{An object of class \code{\link[tuneR]{Wave}} or -\code{\link[tuneR]{WaveMC}}. Note that the playing routine implemented +\item{wave}{An object of class \code{\link[tuneR:Wave]{tuneR::Wave}} or +\code{\link[tuneR:WaveMC]{tuneR::WaveMC}}. Note that the playing routine implemented here can only play stereo waves. Multi-channel waves are therefore converted to stereo before playing.} @@ -22,11 +22,11 @@ finished. When set to \code{FALSE}, subsequent R code will be executed while playing.} } \value{ -Returns an \code{\link[audio]{$.audioInstance}}. +Returns an \code{\link[audio:audioInstance-methods]{audio::$.audioInstance}}. } \description{ -Use the command line \code{\link[audio]{play}} function from the -\code{audio} package to play \code{\link[tuneR]{Wave}} objects. +Use the command line \code{\link[audio:play]{audio::play}} function from the +\code{audio} package to play \code{\link[tuneR:Wave]{tuneR::Wave}} objects. } \details{ As the \code{\link{tuneR}} package play-function relies on external @@ -34,7 +34,7 @@ players, this method is provided as a convenient approach to play samples in the R console, using the \code{audio} package. Wave objects are played at the rate as specified in the object. Of course you can also play the \code{Wave} objects with the \code{tuneR} implementation -of \code{\link{tuneR}{play}}, by calling \code{tuneR::play(wave)}. +of \code{\link[tuneR:play]{tuneR::play}}, by calling \code{tuneR::play(wave)}. } \examples{ \dontrun{ diff --git a/man/playingtable.Rd b/man/playingtable.Rd index b2e5d65..9b04cce 100644 --- a/man/playingtable.Rd +++ b/man/playingtable.Rd @@ -31,17 +31,17 @@ is required to break out of the routine for generating the table.} \item{speed}{Default speed to use when it is not specified in the pattern data. See \link[=ProTrackR-package]{ProTrackR} documentation for more info on -`speed' and `tempo'.} +\verb{speed' and }tempo'.} \item{tempo}{Default tempo to use when it is not specified in the pattern data. See \link[=ProTrackR-package]{ProTrackR} documentation for more info on -`speed' and `tempo'.} +\verb{speed' and }tempo'.} \item{video}{The video mode of a Commodore Amiga affects timing routines. This mode can be specified with this argument and is represented by a \code{character} string that can have either the value -`\href{https://en.wikipedia.org/wiki/PAL}{PAL}' -or `\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. PAL is used by default.} +'\href{https://en.wikipedia.org/wiki/PAL}{PAL}' +or '\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. PAL is used by default.} \item{play.once}{A \code{logical} value. When set to \code{TRUE}, the routine will stop adding data to the table when the starting @@ -51,7 +51,7 @@ break. Will be overruled when the \code{maximum.duration} is reached before the end of the song.} \item{verbose}{A \code{logical} value. Suppresses a progress report -from being printed to the \code{\link[base]{sink}} when set to \code{FALSE}. +from being printed to the \code{\link[base:sink]{base::sink}} when set to \code{FALSE}. The default value is \code{TRUE}.} } \value{ @@ -78,7 +78,7 @@ a comprehensive format in a \code{data.frame}, with the following columns: Amiga hardware audio filter was either turned on or off using effect command E00/E01 (see also \link[=ProTrackR-package]{ProTrackR} documentation, section on effect commands).} -\item{speed}{Number of `ticks' per row as set with the Fxy +\item{speed}{Number of 'ticks' per row as set with the Fxy effect commands in the module.} \item{tempo}{The tempo as specified by the Fxy commands in the module.} \item{delay}{The delay that should be applied to the row as diff --git a/man/plot.Rd b/man/plot.Rd index b69f3fb..9ed3cd2 100644 --- a/man/plot.Rd +++ b/man/plot.Rd @@ -18,20 +18,20 @@ waveforms of the \code{\link{PTSample}}s need to be plotted.} loop positions need to be visualised. For looped samples, the starting and ending positions are marked by a vertical green and red line, respectively.} -\item{...}{Arguments that are passed on to \code{\link[lattice]{xyplot}}.} +\item{...}{Arguments that are passed on to \code{\link[lattice:xyplot]{lattice::xyplot}}.} } \value{ Returns an object of class \code{trellis}. See documentation of -\code{\link[lattice]{xyplot}} for more details. +\code{\link[lattice:xyplot]{lattice::xyplot}} for more details. } \description{ Plots the waveforms of the (non-empty) \code{\link{PTSample}}s in a \code{\link{PTModule}} object. } \details{ -A plotting routine based on the \code{\link[lattice]{xyplot}} from the +A plotting routine based on the \code{\link[lattice:xyplot]{lattice::xyplot}} from the lattice-package. Plots each (non-empty) waveform in a separate panel. Use arguments -of the \code{\link[lattice]{xyplot}} function to customise the plot. +of the \code{\link[lattice:xyplot]{lattice::xyplot}} function to customise the plot. } \examples{ ## get the example PTModule provided with the ProTrackR package diff --git a/man/print.Rd b/man/print.Rd index 2d509ce..6059324 100644 --- a/man/print.Rd +++ b/man/print.Rd @@ -34,7 +34,7 @@ Depending on the class of \code{x}, returns either nothing of object \code{x}. } \description{ -A method to print \code{\link[=ProTrackR-package]{ProTrackR}} S4 class objects. +A method to print \link[=ProTrackR-package]{ProTrackR} S4 class objects. } \examples{ data("mod.intro") diff --git a/man/rawToCharNull.Rd b/man/rawToCharNull.Rd index 7111550..8b38352 100644 --- a/man/rawToCharNull.Rd +++ b/man/rawToCharNull.Rd @@ -16,7 +16,7 @@ A \code{character} string based on the \code{raw} data A function that converts \code{raw} data into a \code{character} string. } \details{ -The function \code{\link{rawToChar}} will fail on vectors of \code{raw} data +The function \code{rawToChar()} will fail on vectors of \code{raw} data with embedded \code{0x00} data. This function will not fail on embedded \code{0x00} values. Instead, it will replace embedded \code{0x00} data with white spaces. Note that leading and trailing \code{0x00} data will be omitted from the result. diff --git a/man/rawToPTModule.Rd b/man/rawToPTModule.Rd index 147cfc7..8ad1c8e 100644 --- a/man/rawToPTModule.Rd +++ b/man/rawToPTModule.Rd @@ -16,20 +16,20 @@ When set to \code{FALSE} (default) validity is checked and an error is thrown when invalidity occurs.} } \value{ -returns a \code{\link{PTModule-class}} object. +returns a \code{\linkS4class{PTModule}} object. } \description{ This method treats a vector of \code{raw} data as if it where a -file, and converts it into a \code{\link{PTModule-class}} object. +file, and converts it into a \code{\linkS4class{PTModule}} object. } \details{ Data is read from a vector of \code{raw} data as if it where a file -and converted into a \code{\link{PTModule-class}} object. This +and converted into a \code{\linkS4class{PTModule}} object. This method can be useful for module files stored on virtual Amiga Disk Files (adf), which can be read as raw data, using the \code{AmigaFFH} package. -Use \code{\link[ProTrackR]{as.raw}} to achieve the inverse. +Use \code{\link{as.raw}} to achieve the inverse. } \examples{ \dontrun{ diff --git a/man/rawToSignedInt.Rd b/man/rawToSignedInt.Rd index 971c2b8..8c13258 100644 --- a/man/rawToSignedInt.Rd +++ b/man/rawToSignedInt.Rd @@ -17,8 +17,8 @@ This function converts a vector of \code{raw} data into signed integer values. } \details{ This function converts a vector of \code{raw} data into signed integer values -[-128,127]. To convert unsigned integers into raw data use \code{\link{as.raw}(x)}. -For the inverse of this function see \code{\link{signedIntToRaw}(int_dat)}. +[-128,127]. To convert unsigned integers into raw data use \code{as.raw()}. +For the inverse of this function see \code{signedIntToRaw()}. } \examples{ ## generate some raw data: diff --git a/man/rawToUnsignedInt.Rd b/man/rawToUnsignedInt.Rd index 3237c62..25f7c46 100644 --- a/man/rawToUnsignedInt.Rd +++ b/man/rawToUnsignedInt.Rd @@ -17,9 +17,9 @@ This function converts \code{raw} data into an unsigned integer } \details{ This function converts a vector of raw data into a single unsigned integer. -for conversion of raw data into a vector of unsigned integers [0,255] use -`\code{\link{as.integer}(x)}'. For an inverse of this function -see \code{\link{unsignedIntToRaw}}. +for conversion of raw data into a vector of unsigned integers \verb{\[0,255\\}] use +\code{as.integer()}. For an inverse of this function +see \code{unsignedIntToRaw()}. } \examples{ ## generate some raw data: diff --git a/man/read.module.Rd b/man/read.module.Rd index bea542d..ded3e15 100644 --- a/man/read.module.Rd +++ b/man/read.module.Rd @@ -19,7 +19,7 @@ } \arguments{ \item{file}{either a filename or a file connection, that -allows reading binary data (see e.g., \code{\link[base]{file}} or \code{\link[base]{url}}).} +allows reading binary data (see e.g., \code{\link[base:connections]{base::file}} or \code{\link[base:connections]{base::url}}).} \item{ignore.validity}{A \code{logical} value indicating whether the validity of the \code{PTModule} should be ignored. When set to diff --git a/man/read.sample.Rd b/man/read.sample.Rd index 7b9ddd6..ad68045 100644 --- a/man/read.sample.Rd +++ b/man/read.sample.Rd @@ -11,30 +11,30 @@ \item{filename}{A \code{character} string representing the filename to be read.} \item{what}{A \code{character} string indicating what type of file is to be -read. Can be one of the following: "\code{wav}" (default), "\code{mp3}", -"\code{8svx}" or "\code{raw}". The \code{AmigaFFH} package needs to be +read. Can be one of the following: \code{"wav"} (default), \code{"mp3"}, +\code{"8svx"} or \code{"raw"}. The \code{AmigaFFH} package needs to be installed in order to read 8svx files.} } \value{ Returns a \code{PTSample} object based on the file read. } \description{ -Reads audio files from "wav" and "mp3" files, using \code{\link[tuneR]{tuneR}} +Reads audio files from "wav" and "mp3" files, using \code{\link[tuneR:tuneR]{tuneR::tuneR}} methods. Commodore Amiga native formats "8svx" and "raw" can also be read. } \details{ -This method provides a wrapper for the \code{\link[tuneR]{readWave}} and -\code{\link[tuneR]{readMP3}} methods from \code{\link[tuneR]{tuneR}}. It also +This method provides a wrapper for the \code{\link[tuneR:readWave]{tuneR::readWave}} and +\code{\link[tuneR:readMP3]{tuneR::readMP3}} methods from \code{\link[tuneR:tuneR]{tuneR::tuneR}}. It also provides the means to import audio from file formats native to the Commodore Amiga. Simple \href{https://en.wikipedia.org/wiki/8SVX}{8svx} files (also known -as "iff" files) can be read. This uses the \code{\link[AmigaFFH]{read.iff}} method -from the \code{\link[AmigaFFH]{AmigaFFH}} package. +as "iff" files) can be read. This uses the \code{\link[AmigaFFH:read.iff]{AmigaFFH::read.iff}} method +from the \code{\link[AmigaFFH:AmigaFFH-package]{AmigaFFH::AmigaFFH}} package. It was also common practice to store audio samples as raw data on the Commodore Amiga, where each byte simply represented a signed integer value of the waveform. All audio will be coerced to 8 bit mono with a maximum length of -\code{2*0xffff} = {131070} bytes (= samples) as per ProTracker standards. +\code{2*0xffff} = \code{131070} bytes (= samples) as per ProTracker standards. } \note{ As per ProTracker standards, a sample should have an even length diff --git a/man/resample.Rd b/man/resample.Rd index f7db43d..c41193e 100644 --- a/man/resample.Rd +++ b/man/resample.Rd @@ -15,7 +15,7 @@ another unit, as long as it is in the same unit as \code{target.rate}).} \item{target.rate}{The desired target sampling rate in Hz (or another unit, as long as it is in the same unit as \code{source.rate}).} -\item{...}{Arguments passed on to \code{\link[stats]{approx}}. +\item{...}{Arguments passed on to \code{\link[stats:approxfun]{stats::approx}}. To simulate the Commodore Amiga hardware, it's best to use '\code{method = "constant"} for resampling 8 bit samples.} } @@ -29,7 +29,7 @@ Resample \code{numeric} data to a different rate. \details{ This function resamples \code{numeric} data (i.e., audio data) from a source sample rate to a target sample rate. At the core it uses -the \code{\link[stats]{approx}} function. +the \code{\link[stats:approxfun]{stats::approx}} function. } \examples{ some.data <- 1:100 diff --git a/man/sampleNumber.Rd b/man/sampleNumber.Rd index ecd1775..6f18ead 100644 --- a/man/sampleNumber.Rd +++ b/man/sampleNumber.Rd @@ -23,7 +23,7 @@ any sample.} For \code{sampleNumber}, a \code{numeric} value representing the sample index number of object \code{x} is returned. -For \code{sampleNumber<-}, an copy of object \code{x} is returned in which +For \verb{sampleNumber<-}, an copy of object \code{x} is returned in which the sample index number is replaced with \code{value}. } \description{ diff --git a/man/sampleRate.Rd b/man/sampleRate.Rd index 1984058..784c61d 100644 --- a/man/sampleRate.Rd +++ b/man/sampleRate.Rd @@ -18,8 +18,8 @@ rate is to be calculated.} tune an audio sample.} \item{video}{The video mode used to calculate the sample rate. A \code{character} -string that can have either the value `\href{https://en.wikipedia.org/wiki/PAL}{PAL}' -or `\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. PAL is used by default.} +string that can have either the value '\href{https://en.wikipedia.org/wiki/PAL}{PAL}' +or '\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. PAL is used by default.} \item{period}{A ProTracker \code{integer} value of a period value for which the sample rate is to be calculated.} @@ -32,8 +32,8 @@ Calculate the sample rate for a note or a ProTracker period value. } \details{ The timing on a Commodore Amiga depends on the video mode, which could be -either `\href{https://en.wikipedia.org/wiki/PAL}{PAL}' -or `\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. Therefore sample +either '\href{https://en.wikipedia.org/wiki/PAL}{PAL}' +or '\href{https://en.wikipedia.org/wiki/NTSC}{NTSC}'. Therefore sample rates also depend on these modes. As the PAL is mostly used in Europe, and the Amiga was most popular in Europe, PAL is used by default. } diff --git a/man/signedIntToNybble.Rd b/man/signedIntToNybble.Rd index 14cd8dc..59c1cce 100644 --- a/man/signedIntToNybble.Rd +++ b/man/signedIntToNybble.Rd @@ -7,11 +7,11 @@ signedIntToNybble(int_dat, which = c("low", "high")) } \arguments{ -\item{int_dat}{A single\code{intger} value or a \code{vector} of +\item{int_dat}{A single \code{integer} value or a \code{vector} of \code{integer} data ranging from -8 up to 7.} \item{which}{A character string indicating whether the nybble should -be set to the "\code{low}" (default) or "\code{high}" position of the +be set to the \code{"low"} (default) or \code{"high"} position of the raw data that is returned.} } \value{ diff --git a/man/signedIntToRaw.Rd b/man/signedIntToRaw.Rd index 1d16a6b..9b469a3 100644 --- a/man/signedIntToRaw.Rd +++ b/man/signedIntToRaw.Rd @@ -19,8 +19,8 @@ This function converts signed integer values into a vector of \code{raw} data. This function converts signed integer values [-128,127] into a vector of \code{raw} data. The function will fail on values that are out of range (< -128 or > 127). To convert -raw data into a vector of unsigned integers use \code{\link{as.integer}(x)}. -For the inverse of this function see \code{\link{rawToSignedInt}(raw_dat)}. +raw data into a vector of unsigned integers use \code{as.integer()}. +For the inverse of this function see \code{rawToSignedInt()}. } \examples{ ## generate some signed integers: diff --git a/man/trackerFlag.Rd b/man/trackerFlag.Rd index 1c43b5e..32b7f93 100644 --- a/man/trackerFlag.Rd +++ b/man/trackerFlag.Rd @@ -16,15 +16,15 @@ returned or replaced.} \item{value}{A \code{character} string representing the tracker flag with which -that of object \code{x} needs to be replaced with. Should either be "\code{M.K.}" -or "\code{M!K!}". Note that if a current flag "\code{M!K!}" is -replaced by "\code{M.K.}", \code{\link{PTPattern}}s may get lost as the +that of object \code{x} needs to be replaced with. Should either be \code{"M.K."} +or \code{"M!K!"}. Note that if a current flag \code{"M!K!"} is +replaced by \code{"M.K."}, \code{\link{PTPattern}}s may get lost as the latter supports less patterns.} } \value{ For \code{trackerFlag}, the tracker flag of object \code{x} is returned. -For \code{trackerFlag<-}, a copy of object \code{x} with an updated tracker +For \verb{trackerFlag<-}, a copy of object \code{x} with an updated tracker flag is returned. } \description{ @@ -32,11 +32,11 @@ Method to obtain a tracker flag, which indicates the version compatibility of a ProTracker module (\code{\link{PTModule}} object). } \details{ -ProTrackR supports two tracker flags: "\code{M.K.}" and "\code{M!K!}". M.K. +ProTrackR supports two tracker flags: \code{"M.K."} and \verb{"M!K!}". M.K. are presumably the initials of programmers Mahony and Kaktus, unfortunately documentation on this matter is ambiguous. In any case, modules with the -flag "\code{M.K.}" can hold up to 64 patterns, whereas modules with the flag -"\code{M!K!}" can hold up to 100 patterns. Use this method to obtain or +flag \code{"M.K."} can hold up to 64 patterns, whereas modules with the flag +\code{"M!K!"} can hold up to 100 patterns. Use this method to obtain or replace the tracker flag of a \code{\link{PTModule}}. } \examples{ diff --git a/man/unsignedIntToRaw.Rd b/man/unsignedIntToRaw.Rd index 0af4e26..31cec11 100644 --- a/man/unsignedIntToRaw.Rd +++ b/man/unsignedIntToRaw.Rd @@ -24,7 +24,7 @@ This function converts an unsigned integer into a vector of \code{raw} data. \details{ This function converts an unsigned integer value into a vector (with a specified length, namely \code{length.out}) of \code{raw} data. For the -inverse of this function use \code{\link{rawToUnsignedInt}(raw_dat)} +inverse of this function use \code{rawToUnsignedInt()}. } \examples{ ## generate some unsigned integer: diff --git a/man/volume.Rd b/man/volume.Rd index bbe44b3..30aa819 100644 --- a/man/volume.Rd +++ b/man/volume.Rd @@ -23,7 +23,7 @@ the volume level.} For \code{volume} the volume value, represented by an \code{integer} value ranging from 0 up to 64, is returned. -For \code{volume<-} A \code{\link{PTSample}} \code{sample}, updated +For \verb{volume<-} A \code{\link{PTSample}} \code{sample}, updated with the volume \code{value}, is returned. } \description{ diff --git a/man/waveform.Rd b/man/waveform.Rd index 970bb41..c133634 100644 --- a/man/waveform.Rd +++ b/man/waveform.Rd @@ -42,14 +42,14 @@ Use \code{NA} to generate an empty/blank \code{\link{PTSample}} object.} \value{ For \code{waveform}, the waveform of \code{sample} is returned as a \code{vector} of \code{numeric} values ranging from 0 up to 255. -If '\code{loop}' is set to \code{FALSE} +If \code{loop} is set to \code{FALSE} and the starting position is beyond the sample length, \code{NA} values -are returned. If '\code{loop}' is set to \code{TRUE} and the starting +are returned. If \code{loop} is set to \code{TRUE} and the starting position is beyond the sample loop (if present, see \code{\link{loopState}}), the waveform is modulated between the loop positions. -For \code{waveform<-}, a copy of object \code{sample} is returned in which +For \verb{waveform<-}, a copy of object \code{sample} is returned in which the waveform has been replaced with \code{value}. } \description{ @@ -60,7 +60,7 @@ waveform is represented by a \code{vector} of numeric values ranging from \details{ Sample waveforms are stored as 8 bit signed short integer values ranging from -128 up to +127 in original ProTracker files. However, as the -\code{\link{PTSample}} class extends the \code{\link[tuneR]{Wave}} class, +\code{\link{PTSample}} class extends the \code{\link[tuneR:Wave]{tuneR::Wave}} class, the waveforms are represented by integer values ranging from 0 up to 255 in the \link[=ProTrackR-package]{ProTrackR} package. As per ProTracker specifications, samples are of 8 bit mono quality and can only have an even length with diff --git a/man/write.module.Rd b/man/write.module.Rd index 740dfbb..b0a4c7f 100644 --- a/man/write.module.Rd +++ b/man/write.module.Rd @@ -15,7 +15,7 @@ \item{mod}{A valid PTModule object to be saved as a ProTracker *.mod file} \item{file}{either a filename to write to, or a file connection, that -allows to write binary data (see \code{\link[base]{file}}).} +allows to write binary data (see \code{\link[base:connections]{base::file}}).} } \value{ Writes to a module file but returns nothing. diff --git a/man/write.sample.Rd b/man/write.sample.Rd index 0a2bd37..72be2c9 100644 --- a/man/write.sample.Rd +++ b/man/write.sample.Rd @@ -15,8 +15,8 @@ file.} the audio needs to be saved.} \item{what}{A \code{character} string indicating what type of file is to be -exported. Can be one of the following: "\code{wav}" (default), -"\code{8svx}" or "\code{raw}". The \code{AmigaFFH} package needs to be +exported. Can be one of the following: \code{"wav"} (default), +\code{"8svx"} or \code{"raw"}. The \code{AmigaFFH} package needs to be installed in order to write 8svx files.} } \value{ @@ -26,8 +26,8 @@ Saves the audio to a file, but returns nothing. Write a \code{PTSample} as a "wav", "8svx" or "raw" audio file. } \details{ -This method provides a wrapper for the \code{\link[tuneR]{writeWave}} method -from \code{\link[tuneR]{tuneR}}. It also provides the means to export audio +This method provides a wrapper for the \code{\link[tuneR:writeWave]{tuneR::writeWave}} method +from \code{\link[tuneR:tuneR]{tuneR::tuneR}}. It also provides the means to export audio to file formats native to the Commodore Amiga. \code{PTSample}s can be exported as simple (uncompressed) \href{https://en.wikipedia.org/wiki/8SVX}{8svx} files also known as "iff" files). In addition they can be exported as raw data,